home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 5 / CD_Magazyn_EXEC_nr_5.iso / Programy / Programowanie / PPC / wosdb_src.lzx / exchandler.s < prev    next >
Encoding:
Text File  |  2001-02-18  |  4.9 KB  |  242 lines

  1. ## $VER: exchandler.s V0.4c (17.02.01)
  2. ##
  3. ## This file is part of the WarpOS debugger 'wosdb'
  4. ## Copyright (c) 1999-2001  Frank Wille
  5. ##
  6. ##
  7. ## v0.4c (17.02.01) phx
  8. ##       Data-access to ExecBase at address 4 has to be emulated by
  9. ##       WarpUp kernel. Currently this has the effect that the following
  10. ##       instruction can't be traced.
  11. ## v0.3  (04.05.99) phx
  12. ##       ProgramExit() replaces the task-finished notification mechanism
  13. ##       in the 68k function newRunPPC(). It also saves the return code.
  14. ## v0.1  (01.05.99) phx
  15. ##       First usable version.
  16. ## v0.0  (19.04.99) phx
  17. ##       File created.
  18. ##
  19.  
  20.     .include "warpos_lvo.i"
  21.  
  22.  
  23.     .text
  24.  
  25.     .extern _PowerPCBase
  26.     .extern    @__ec        # global EXCContext
  27.     .extern @__spr        # SpecRegs structure
  28.     .extern _thisTask    # debugger task
  29.     .extern _dbTask        # debugged task
  30.     .extern _sigExcept    # exception signal
  31.     .extern _sigRun        # wake up signal for debugged task
  32.     .extern _sigFinish    # task-finished signal
  33.     .extern    _sTrace        # single step trace mode
  34.     .extern    _bTrace        # branch trace mode
  35.     .extern    _initialLR    # initial LR of debugged task
  36.     .extern    ___getr2    # vc.lib
  37.     .extern _result        # for storing the result code
  38.  
  39.  
  40.  
  41.     .align    3
  42.     .globl    _ExceptionCatch
  43. _ExceptionCatch:
  44. # The debugged task ran into an exception. Save its context
  45. # and put it into a user-mode waiting-loop.
  46. # r2 = TOC
  47. # r3 = struct EXCContext *
  48.     lwz    r12,0(r3)    # ec_ExcID
  49.     cmpwi    r12,(1<<3)    # == EXCF_DACCESS ?
  50.     bne+    .ec_saveregs
  51.     lwz    r12,12(r3)    # ec_DAR
  52.     cmpwi    r12,4        # == 4 (ExecBase access) ?
  53.     bne+    .ec_saveregs
  54.     li    r3,0        # EXCRETURN_NORMAL
  55.     blr            # run WarpOS handler to access ExecBase
  56. .ec_saveregs:
  57.     mr    r11,r1
  58.     lwz    r1,@_excStackBase(r2)
  59.     li    r12,0
  60.     stwu    r12,-32(r1)
  61.     stw    r11,28(r1)
  62.     mflr    r0
  63.     stw    r0,8(r1)
  64.     stwu    r1,-32(r1)
  65.     stw    r30,24(r1)
  66.     stw    r31,28(r1)
  67.  
  68.     lwz    r31,_PowerPCBase(r2)
  69.     mr    r30,r3        # r30 struct EXCContext *
  70.     CALLWOS    SetExcMMU,r31    # temporary MMU setup
  71.  
  72.     mr    r4,r30
  73.     lwz    r5,@__ec(r2)
  74.     li    r6,424        # sizeof(struct EXCContext)
  75.     CALLWOS    CopyMemPPC,r31    # save EXCContext to ec
  76.  
  77.     lwz    r3,@__spr(r2)    # fill SpecRegs
  78.     mfspr    r0,1008
  79.     stw    r0,0(r3)    # HID0
  80.     mfspr    r0,1009
  81.     stw    r0,4(r3)    # HID1
  82.     mfspr    r0,287
  83.     stw    r0,8(r3)    # PVR
  84.     mfspr    r0,25
  85.     stw    r0,12(r3)    # SDR1
  86.     mfspr    r0,282
  87.     stw    r0,16(r3)    # EAR
  88.     mfspr    r0,22
  89.     stw    r0,20(r3)    # DEC
  90.     mfspr    r0,268
  91.     stw    r0,24(r3)    # TBU
  92.     mfspr    r0,269
  93.     stw    r0,28(r3)    # TBL
  94.  
  95.     li    r4,0
  96.     CALLWOS    FindTaskPPC,r31    # determine debugged task
  97.     stw    r3,_dbTask(r2)
  98.  
  99.     lwz    r4,_thisTask(r2)
  100.     li    r5,1
  101.     lwz    r6,_sigExcept(r2)
  102.     slw    r5,r5,r6
  103.     CALLWOS    SignalPPC,r31    # wake up debugger task
  104.  
  105.     lwz    r3,8(r30)    # r3 MSR
  106.     li    r11,0xfffff9ff
  107.     and    r3,r3,r11    # disable trace mode
  108.     stw    r3,8(r30)
  109.     li    r0,0
  110.     mtspr    1010,r0        # clear IABR breakpoint
  111.  
  112.     lwz    r0,@_taskWait(r2)
  113.     stw    r0,4(r30)    # set SRR0 (PC) to taskWait()
  114.     stw    r1,40+1*4(r30)    # pass stack-pointer (r1)
  115.     stw    r2,40+2*4(r30)    # pass TOC-pointer (r2)
  116.     stw    r31,40+31*4(r30) # and PowerPCBase (r31)
  117.  
  118.     CALLWOS    ClearExcMMU,r31
  119.  
  120.     lwz    r30,24(r1)
  121.     lwz    r31,28(r1)
  122.     li    r3,1        # EXCRETURN_ABORT
  123.     addi    r1,r1,32
  124.     lwz    r0,8(r1)
  125.     mtlr    r0
  126.     lwz    r1,28(r1)
  127.     blr
  128.  
  129.  
  130.     .align    3
  131. taskWait:
  132. # The debugged task is waiting here for a signal from the debugger
  133.     lwz    r3,_sigRun(r2)
  134.     li    r4,1
  135.     slw    r4,r4,r3
  136.     CALLWOS    WaitPPC,r31
  137. taskWaitExit:
  138.     trap
  139.  
  140.  
  141.     .align    3
  142.     .globl    _ExceptionLeave
  143. _ExceptionLeave:
  144. # The debugged task continues to run. The complete context must be restored.
  145. # r2 = TOC
  146. # r3 = struct EXCContext *
  147.     mr    r11,r1
  148.     lwz    r1,@_excStackBase(r2)
  149.     li    r12,0
  150.     stwu    r12,-32(r1)
  151.     stw    r11,28(r1)
  152.     mflr    r0
  153.     stw    r0,8(r1)
  154.     stwu    r1,-32(r1)
  155.     stw    r30,24(r1)
  156.     stw    r31,28(r1)
  157.  
  158.     lwz    r31,_PowerPCBase(r2)
  159.     mr    r30,r3        # r30 struct EXCContext *
  160.     CALLWOS    SetExcMMU,r31    # temporary MMU setup
  161.  
  162.     lwz    r3,4(r30)
  163.     lwz    r4,@_taskWaitExit(r2)
  164.     cmpw    r3,r4        # breakpoint = taskWaitExit?
  165.     beq    .el1
  166.     li    r30,0        # EXCRETURN_NORMAL, call other handler
  167.     b    .el2
  168. .el1:
  169.     lwz    r4,@__ec(r2)
  170.     mr    r5,r30
  171.     li    r6,424        # sizeof(struct EXCContext)
  172.     CALLWOS    CopyMemPPC,r31    # restore EXCContext from ec
  173.  
  174.     lwz    r0,8(r30)    # MSR = SRR1
  175.     li    r11,0xfffff9ff
  176.     lhz    r3,_sTrace(r2)
  177.     and    r0,r0,r11
  178.     mr.    r3,r3
  179.     lhz    r4,_bTrace(r2)
  180.     beq    .el3
  181.     ori    r0,r0,0x400    # MSR: Single Step Trace Enable
  182. .el3:
  183.     mr.    r4,r4
  184.     beq    .el4
  185.     ori    r0,r0,0x200    # MSR: Branch Trace Enable
  186. .el4:
  187.     stw    r0,8(r30)
  188.     li    r30,1        # EXCRETURN_ABORT
  189.  
  190. .el2:
  191.     CALLWOS    ClearExcMMU,r31
  192.  
  193.     mr    r3,r30
  194.     lwz    r30,24(r1)
  195.     lwz    r31,28(r1)
  196.     addi    r1,r1,32
  197.     lwz    r0,8(r1)
  198.     mtlr    r0
  199.     lwz    r1,28(r1)
  200.     blr
  201.  
  202.  
  203.     .align    3
  204.     .globl    _ProgramExit
  205. _ProgramExit:
  206. # called when debugged program terminates
  207. # r3 = return code
  208.     stwu    r1,-32(r1)
  209.     stw    r2,24(r1)
  210.     stw    r3,28(r1)
  211.     bl    ___getr2    # get debugger's TOC pointer
  212.     lwz    r3,_PowerPCBase(r2)
  213.     lwz    r4,_thisTask(r2)
  214.     li    r5,1
  215.     lwz    r6,_sigFinish(r2)
  216.     slw    r5,r5,r6
  217.     CALLWOS    SignalPPC    # tell debugger about task termination
  218.     lwz    r3,28(r1)
  219.     lwz    r0,_initialLR(r2)
  220.     stw    r3,_result(r2)    # save result code for debugger
  221.     mtlr    r0
  222.     lwz    r2,24(r1)    # restore TOC pointer and return code
  223.     addi    r1,r1,32
  224.     blr            # return to Warp kernel
  225.  
  226.     .global    _ProgramExitEnd
  227. _ProgramExitEnd:
  228.  
  229.  
  230.  
  231.     .lcomm    excStack,0x1000
  232.  
  233.  
  234.     .tocd
  235.  
  236. @_taskWait:
  237.     .long    taskWait
  238. @_taskWaitExit:
  239.     .long    taskWaitExit
  240. @_excStackBase:
  241.     .long    excStack+0x1000
  242.