iPXE
nulltrap.c
Go to the documentation of this file.
00001 #include <stdint.h>
00002 #include <stdio.h>
00003 
00004 __attribute__ (( noreturn, section ( ".text.null_trap" ) ))
00005 void null_function_trap ( void ) {
00006         void *stack;
00007 
00008         /* 128 bytes of NOPs; the idea of this is that if something
00009          * dereferences a NULL pointer and overwrites us, we at least
00010          * have some chance of still getting to execute the printf()
00011          * statement.
00012          */
00013         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00014         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00015         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00016         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00017         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00018         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00019         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00020         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00021         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00022         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00023         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00024         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00025         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00026         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00027         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00028         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00029         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00030         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00031         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00032         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00033         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00034         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00035         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00036         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00037         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00038         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00039         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00040         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00041         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00042         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00043         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00044         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
00045 
00046         __asm__ __volatile__ ( "movl %%esp, %0" : "=r" ( stack ) );
00047         printf ( "NULL method called from %p (stack %p)\n", 
00048                  __builtin_return_address ( 0 ), stack );
00049         DBG_HD ( stack, 256 );
00050         while ( 1 ) {}
00051 }