Signal handler in RTEMS
Nick Withers
nick.withers at anu.edu.au
Sat Jan 3 01:53:42 UTC 2015
Hello Ben,
I'm not an RTEMS internals expert, but thought I'd try to answer this
anyway - hopefully an expert will chime in to confirm / correct me :-)
On Wed, 2014-12-31 at 13:32 -0800, Ben Dart wrote:
> void HandleAndPrintSignal()
> {
> printf("I am in the segfault signal handler AND I WILL HANDLE YOUR SIG!!!!\n");
> while(1){ printf("LALALA\n"); }
> exit(1);
> }
>
> void *POSIX_Init(void *args)
> {
>
> printf("BENS BIG NOTE: Initializing Signal Handler\n");
> struct sigaction sa;
> sa.sa_handler = HandleAndPrintSignal;
> sigemptyset(&sa.sa_mask);
> sa.sa_flags = SA_SIGINFO;
> if (sigaction (SIGSEGV, &sa, 0)) {
> printf("A ERROR OCCURED WITH THIS!");
> exit(1);
> }
> int *p = NULL;
> while(1)
> {
> printf("Doing some looping\n");
> *(p--) = 5;
> printf("%d", *p);
> }
> }
>
> This will cause a seg fault as expected.
No it won't.
It'll cause a CPU exception, which is what you're seeing.
RTEMS uses a single-process model; there's no "segmentation" / memory
protection between processes (since, again, there's no such thing as
multiple processes).
> However instead of being caught by the signal handler a kernel routine under vectors_init.c will print the following stack trace:
>
> Exception handler called for exception 12 (0xC)
> Next PC or Address of fault = 003506BC
> Saved MSR = 00003012
> Context: Task ID 0x0B010001
> R0 = 003506B8 R1 = 06827C58 R2 = 004A54F8 R3 = 00000000
> R4 = 06827BE8 R5 = 00000013 R6 = 06827C84 R7 = 00000001
> R8 = 00000000 R9 = 00000800 R10 = F0002000 R11 = F0002000
> R12 = 25555582 R13 = 0051A7C0 R14 = 55555555 R15 = 55555555
> R16 = 55555555 R17 = 55555555 R18 = 55555555 R19 = 55555555
> R20 = 55555555 R21 = 55555555 R22 = 06827F10 R23 = 00000001
> R24 = 06827D78 R25 = 003CD20C R26 = 06827D94 R27 = 00000000
> R28 = 006FF698 R29 = 00000013 R30 = 00000000 R31 = 1A01000E
> CR = 45555582
> CTR = 00350EB0
> XER = 00000000
> LR = 003506B8
> DAR = 00000000
> Stack Trace:
> IP: 0x003506BC, LR: 0x003506B8
> --^ 0x0038C364--^ 0x00389AF0--^ 0x0036BC5C--^ 0x00350F70--^ 0x0038AD78
> --^ 0x0036071C--^ 0x0036D330--^ 0x0036D3B0--^ 0x0033E514--^ 0x003399D0
> --^ 0x0033B4F0--^ 0x0033D80C--^ 0x0019B68C--^ 0x003C6934--^ 0x003C6850
> Suspending faulting task (0x0B010001)
>
>
> Is there something special that needs to be done to set up signal handlers for RTEMS? It seems like from this manual:
> http://docs.rtems.org/doc-current/share/rtems/pdf/posix1003_1.pdf <http://docs.rtems.org/doc-current/share/rtems/pdf/posix1003_1.pdf%20under%20section%203.3.1.1>
>
> under section 3.3.1.1 indicates that signals have been implemented.
>
> Is there something that I am doing wrong?
You'll never get a segfault under RTEMS. That doesn't mean that invalid
accesses to memory are "OK" though.
Does that make sense?
--
Nick Withers
Embedded Systems Programmer
Department of Nuclear Physics, Research School of Physics and Engineering
The Australian National University (CRICOS: 00120C)
More information about the users
mailing list