Also print out stack pointer (with optional stack dump)
[gpxe.git] / src / arch / i386 / core / nulltrap.c
1 #include <stdint.h>
2 #include <stdio.h>
3
4 __attribute__ (( noreturn, section ( ".text.null_trap" ) ))
5 void null_function_trap ( void ) {
6         void *stack;
7
8         /* 128 bytes of NOPs; the idea of this is that if something
9          * dereferences a NULL pointer and overwrites us, we at least
10          * have some chance of still getting to execute the printf()
11          * statement.
12          */
13         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
14         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
15         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
16         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
17         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
18         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
19         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
20         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
21         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
22         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
23         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
24         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
25         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
26         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
27         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
28         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
29         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
30         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
31         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
32         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
33         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
34         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
35         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
36         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
37         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
38         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
39         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
40         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
41         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
42         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
43         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
44         __asm__ __volatile__ ( "nop ; nop ; nop ; nop" );
45
46         __asm__ __volatile__ ( "movl %%esp, %0" : "=r" ( stack ) );
47         printf ( "NULL method called from %p (stack %p)\n", 
48                  __builtin_return_address ( 0 ), stack );
49         DBG_HD ( stack, 256 );
50         while ( 1 ) {}
51 }