home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / emulate / sparc / trap.s < prev    next >
Text File  |  1992-01-29  |  2KB  |  75 lines

  1. !
  2. ! test signal handling
  3. !
  4.     set    sigtramp,%o1
  5.     set    sv1,%o0
  6.     st    %o1,[%o0] ! init sigvec struct
  7.     mov    %o0,%o1
  8.     clr    %o2
  9.     mov    11,%o0   ! catch SIGSEGV
  10.     mov    0x6c,%g1 ! sigvec system call
  11.     ta    0
  12.     nop
  13.     st    %g0,[%g0] ! force segmentation fault
  14.     nop
  15. !
  16. ! send SIGSEGV signal to ourselves with kill, getpid syscalls
  17. !
  18.     mov    20,%g1 ! getpid
  19.     ta    0
  20.     mov    11,%o1  ! %o0 has pid
  21.     mov    37,%g1  ! kill
  22.     ta 0
  23.     nop
  24. exit:
  25.     mov    23,%o0
  26.     mov    1,%g1
  27.     ta 0
  28.  
  29.  
  30.     .seg "bss"
  31. sv1:
  32.     .skip 0xc
  33.  
  34. !
  35. ! handler skips over insn and returns
  36. !
  37.         .seg "text"
  38. handler:
  39.         ld      [%o2+0xc],%l0  ! return pc
  40.         ld      [%o2+0x10],%l1 ! return npc
  41.         inc     4,%l0
  42.         inc     4,%l1
  43.         st      %l0,[%o2+0xc]
  44.         st      %l1,[%o2+0x10]
  45.         retl
  46.         nop
  47.  
  48. !
  49. ! sigtramp sets up arguments for and calls the user handler,
  50. ! which is assumed not to touch the fp regs
  51. !
  52.     .seg "text"
  53. sigtramp:
  54.     save    %sp,-128,%sp ! protect ins, locals
  55.     mov    %y,%l0
  56.     st    %l0,[%sp+0x60]
  57.     std    %g6,[%sp+0x68]
  58.     std    %g4,[%sp+0x70]
  59.     std    %g2,[%sp+0x78]
  60.     ld    [%fp+0x40],%o0 ! sig
  61.     ld    [%fp+0x44],%o1 ! code
  62.     ld    [%fp+0x48],%o2 ! sigcontext ptr
  63.     set    handler,%g1
  64.     call    %g1            ! user's handler
  65.     ld    [%fp+0x4c],%o3 ! faulty addr
  66.     ld    [%sp+0x60],%l0
  67.     mov    %l0,%y
  68.     ldd    [%sp+0x68],%g6
  69.     ldd    [%sp+0x70],%g4
  70.     ldd    [%sp+0x78],%g2
  71.     ld    [%fp+0x48],%i0 ! will be %o0 after restore
  72.     mov    0x8b,%g1       ! return to sigcontext syscall
  73.     restore                ! regs restored (expect %o0)
  74.     ta    0
  75.