break.S 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. /* break.S: Break interrupt handling (kept separate from entry.S)
  2. *
  3. * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/sys.h>
  12. #include <linux/config.h>
  13. #include <linux/linkage.h>
  14. #include <asm/setup.h>
  15. #include <asm/segment.h>
  16. #include <asm/ptrace.h>
  17. #include <asm/spr-regs.h>
  18. #include <asm/errno.h>
  19. #
  20. # the break handler has its own stack
  21. #
  22. .section .bss.stack
  23. .globl __break_user_context
  24. .balign 8192
  25. __break_stack:
  26. .space (8192 - (USER_CONTEXT_SIZE + REG__DEBUG_XTRA)) & ~7
  27. __break_stack_tos:
  28. .space REG__DEBUG_XTRA
  29. __break_user_context:
  30. .space USER_CONTEXT_SIZE
  31. #
  32. # miscellaneous variables
  33. #
  34. .section .bss
  35. #ifdef CONFIG_MMU
  36. .globl __break_tlb_miss_real_return_info
  37. __break_tlb_miss_real_return_info:
  38. .balign 8
  39. .space 2*4 /* saved PCSR, PSR for TLB-miss handler fixup */
  40. #endif
  41. __break_trace_through_exceptions:
  42. .space 4
  43. #define CS2_ECS1 0xe1200000
  44. #define CS2_USERLED 0x4
  45. .macro LEDS val,reg
  46. # sethi.p %hi(CS2_ECS1+CS2_USERLED),gr30
  47. # setlo %lo(CS2_ECS1+CS2_USERLED),gr30
  48. # setlos #~\val,\reg
  49. # st \reg,@(gr30,gr0)
  50. # setlos #0x5555,\reg
  51. # sethi.p %hi(0xffc00100),gr30
  52. # setlo %lo(0xffc00100),gr30
  53. # sth \reg,@(gr30,gr0)
  54. # membar
  55. .endm
  56. ###############################################################################
  57. #
  58. # entry point for Break Exceptions/Interrupts
  59. #
  60. ###############################################################################
  61. .text
  62. .balign 4
  63. .globl __entry_break
  64. __entry_break:
  65. #ifdef CONFIG_MMU
  66. movgs gr31,scr3
  67. #endif
  68. LEDS 0x1001,gr31
  69. sethi.p %hi(__break_user_context),gr31
  70. setlo %lo(__break_user_context),gr31
  71. stdi gr2,@(gr31,#REG_GR(2))
  72. movsg ccr,gr3
  73. sti gr3,@(gr31,#REG_CCR)
  74. # catch the return from a TLB-miss handler that had single-step disabled
  75. # traps will be enabled, so we have to do this now
  76. #ifdef CONFIG_MMU
  77. movsg bpcsr,gr3
  78. sethi.p %hi(__break_tlb_miss_return_breaks_here),gr2
  79. setlo %lo(__break_tlb_miss_return_breaks_here),gr2
  80. subcc gr2,gr3,gr0,icc0
  81. beq icc0,#2,__break_return_singlestep_tlbmiss
  82. #endif
  83. # determine whether we have stepped through into an exception
  84. # - we need to take special action to suspend h/w single stepping if we've done
  85. # that, so that the gdbstub doesn't get bogged down endlessly stepping through
  86. # external interrupt handling
  87. movsg bpsr,gr3
  88. andicc gr3,#BPSR_BET,gr0,icc0
  89. bne icc0,#2,__break_maybe_userspace /* jump if PSR.ET was 1 */
  90. LEDS 0x1003,gr2
  91. movsg brr,gr3
  92. andicc gr3,#BRR_ST,gr0,icc0
  93. andicc.p gr3,#BRR_SB,gr0,icc1
  94. bne icc0,#2,__break_step /* jump if single-step caused break */
  95. beq icc1,#2,__break_continue /* jump if BREAK didn't cause break */
  96. LEDS 0x1007,gr2
  97. # handle special breaks
  98. movsg bpcsr,gr3
  99. sethi.p %hi(__entry_return_singlestep_breaks_here),gr2
  100. setlo %lo(__entry_return_singlestep_breaks_here),gr2
  101. subcc gr2,gr3,gr0,icc0
  102. beq icc0,#2,__break_return_singlestep
  103. bra __break_continue
  104. ###############################################################################
  105. #
  106. # handle BREAK instruction in kernel-mode exception epilogue
  107. #
  108. ###############################################################################
  109. __break_return_singlestep:
  110. LEDS 0x100f,gr2
  111. # special break insn requests single-stepping to be turned back on
  112. # HERE RETT
  113. # PSR.ET 0 0
  114. # PSR.PS old PSR.S ?
  115. # PSR.S 1 1
  116. # BPSR.ET 0 1 (can't have caused orig excep otherwise)
  117. # BPSR.BS 1 old PSR.S
  118. movsg dcr,gr2
  119. sethi.p %hi(DCR_SE),gr3
  120. setlo %lo(DCR_SE),gr3
  121. or gr2,gr3,gr2
  122. movgs gr2,dcr
  123. movsg psr,gr2
  124. andi gr2,#PSR_PS,gr2
  125. slli gr2,#11,gr2 /* PSR.PS -> BPSR.BS */
  126. ori gr2,#BPSR_BET,gr2 /* 1 -> BPSR.BET */
  127. movgs gr2,bpsr
  128. # return to the invoker of the original kernel exception
  129. movsg pcsr,gr2
  130. movgs gr2,bpcsr
  131. LEDS 0x101f,gr2
  132. ldi @(gr31,#REG_CCR),gr3
  133. movgs gr3,ccr
  134. lddi.p @(gr31,#REG_GR(2)),gr2
  135. xor gr31,gr31,gr31
  136. movgs gr0,brr
  137. #ifdef CONFIG_MMU
  138. movsg scr3,gr31
  139. #endif
  140. rett #1
  141. ###############################################################################
  142. #
  143. # handle BREAK instruction in TLB-miss handler return path
  144. #
  145. ###############################################################################
  146. #ifdef CONFIG_MMU
  147. __break_return_singlestep_tlbmiss:
  148. LEDS 0x1100,gr2
  149. sethi.p %hi(__break_tlb_miss_real_return_info),gr3
  150. setlo %lo(__break_tlb_miss_real_return_info),gr3
  151. lddi @(gr3,#0),gr2
  152. movgs gr2,pcsr
  153. movgs gr3,psr
  154. bra __break_return_singlestep
  155. #endif
  156. ###############################################################################
  157. #
  158. # handle single stepping into an exception prologue from kernel mode
  159. # - we try and catch it whilst it is still in the main vector table
  160. # - if we catch it there, we have to jump to the fixup handler
  161. # - there is a fixup table that has a pointer for every 16b slot in the trap
  162. # table
  163. #
  164. ###############################################################################
  165. __break_step:
  166. LEDS 0x2003,gr2
  167. # external interrupts seem to escape from the trap table before single
  168. # step catches up with them
  169. movsg bpcsr,gr2
  170. sethi.p %hi(__entry_kernel_external_interrupt),gr3
  171. setlo %lo(__entry_kernel_external_interrupt),gr3
  172. subcc gr2,gr3,gr0,icc0
  173. beq icc0,#2,__break_step_kernel_external_interrupt
  174. sethi.p %hi(__entry_uspace_external_interrupt),gr3
  175. setlo %lo(__entry_uspace_external_interrupt),gr3
  176. subcc gr2,gr3,gr0,icc0
  177. beq icc0,#2,__break_step_uspace_external_interrupt
  178. LEDS 0x2007,gr2
  179. # the two main vector tables are adjacent on one 8Kb slab
  180. movsg bpcsr,gr2
  181. setlos #0xffffe000,gr3
  182. and gr2,gr3,gr2
  183. sethi.p %hi(__trap_tables),gr3
  184. setlo %lo(__trap_tables),gr3
  185. subcc gr2,gr3,gr0,icc0
  186. bne icc0,#2,__break_continue
  187. LEDS 0x200f,gr2
  188. # skip workaround if so requested by GDB
  189. sethi.p %hi(__break_trace_through_exceptions),gr3
  190. setlo %lo(__break_trace_through_exceptions),gr3
  191. ld @(gr3,gr0),gr3
  192. subcc gr3,gr0,gr0,icc0
  193. bne icc0,#0,__break_continue
  194. LEDS 0x201f,gr2
  195. # access the fixup table - there's a 1:1 mapping between the slots in the trap tables and
  196. # the slots in the trap fixup tables allowing us to simply divide the offset into the
  197. # former by 4 to access the latter
  198. sethi.p %hi(__trap_tables),gr3
  199. setlo %lo(__trap_tables),gr3
  200. movsg bpcsr,gr2
  201. sub gr2,gr3,gr2
  202. srli.p gr2,#2,gr2
  203. sethi %hi(__trap_fixup_tables),gr3
  204. setlo.p %lo(__trap_fixup_tables),gr3
  205. andi gr2,#~3,gr2
  206. ld @(gr2,gr3),gr2
  207. jmpil @(gr2,#0)
  208. # step through an internal exception from kernel mode
  209. .globl __break_step_kernel_softprog_interrupt
  210. __break_step_kernel_softprog_interrupt:
  211. sethi.p %hi(__entry_kernel_softprog_interrupt_reentry),gr3
  212. setlo %lo(__entry_kernel_softprog_interrupt_reentry),gr3
  213. bra __break_return_as_kernel_prologue
  214. # step through an external interrupt from kernel mode
  215. .globl __break_step_kernel_external_interrupt
  216. __break_step_kernel_external_interrupt:
  217. sethi.p %hi(__entry_kernel_external_interrupt_reentry),gr3
  218. setlo %lo(__entry_kernel_external_interrupt_reentry),gr3
  219. __break_return_as_kernel_prologue:
  220. LEDS 0x203f,gr2
  221. movgs gr3,bpcsr
  222. # do the bit we had to skip
  223. #ifdef CONFIG_MMU
  224. movsg ear0,gr2 /* EAR0 can get clobbered by gdb-stub (ICI/ICEI) */
  225. movgs gr2,scr2
  226. #endif
  227. or.p sp,gr0,gr2 /* set up the stack pointer */
  228. subi sp,#REG__END,sp
  229. sti.p gr2,@(sp,#REG_SP)
  230. setlos #REG__STATUS_STEP,gr2
  231. sti gr2,@(sp,#REG__STATUS) /* record single step status */
  232. # cancel single-stepping mode
  233. movsg dcr,gr2
  234. sethi.p %hi(~DCR_SE),gr3
  235. setlo %lo(~DCR_SE),gr3
  236. and gr2,gr3,gr2
  237. movgs gr2,dcr
  238. LEDS 0x207f,gr2
  239. ldi @(gr31,#REG_CCR),gr3
  240. movgs gr3,ccr
  241. lddi.p @(gr31,#REG_GR(2)),gr2
  242. xor gr31,gr31,gr31
  243. movgs gr0,brr
  244. #ifdef CONFIG_MMU
  245. movsg scr3,gr31
  246. #endif
  247. rett #1
  248. # step through an internal exception from uspace mode
  249. .globl __break_step_uspace_softprog_interrupt
  250. __break_step_uspace_softprog_interrupt:
  251. sethi.p %hi(__entry_uspace_softprog_interrupt_reentry),gr3
  252. setlo %lo(__entry_uspace_softprog_interrupt_reentry),gr3
  253. bra __break_return_as_uspace_prologue
  254. # step through an external interrupt from kernel mode
  255. .globl __break_step_uspace_external_interrupt
  256. __break_step_uspace_external_interrupt:
  257. sethi.p %hi(__entry_uspace_external_interrupt_reentry),gr3
  258. setlo %lo(__entry_uspace_external_interrupt_reentry),gr3
  259. __break_return_as_uspace_prologue:
  260. LEDS 0x20ff,gr2
  261. movgs gr3,bpcsr
  262. # do the bit we had to skip
  263. sethi.p %hi(__kernel_frame0_ptr),gr28
  264. setlo %lo(__kernel_frame0_ptr),gr28
  265. ldi.p @(gr28,#0),gr28
  266. setlos #REG__STATUS_STEP,gr2
  267. sti gr2,@(gr28,#REG__STATUS) /* record single step status */
  268. # cancel single-stepping mode
  269. movsg dcr,gr2
  270. sethi.p %hi(~DCR_SE),gr3
  271. setlo %lo(~DCR_SE),gr3
  272. and gr2,gr3,gr2
  273. movgs gr2,dcr
  274. LEDS 0x20fe,gr2
  275. ldi @(gr31,#REG_CCR),gr3
  276. movgs gr3,ccr
  277. lddi.p @(gr31,#REG_GR(2)),gr2
  278. xor gr31,gr31,gr31
  279. movgs gr0,brr
  280. #ifdef CONFIG_MMU
  281. movsg scr3,gr31
  282. #endif
  283. rett #1
  284. #ifdef CONFIG_MMU
  285. # step through an ITLB-miss handler from user mode
  286. .globl __break_user_insn_tlb_miss
  287. __break_user_insn_tlb_miss:
  288. # we'll want to try the trap stub again
  289. sethi.p %hi(__trap_user_insn_tlb_miss),gr2
  290. setlo %lo(__trap_user_insn_tlb_miss),gr2
  291. movgs gr2,bpcsr
  292. __break_tlb_miss_common:
  293. LEDS 0x2101,gr2
  294. # cancel single-stepping mode
  295. movsg dcr,gr2
  296. sethi.p %hi(~DCR_SE),gr3
  297. setlo %lo(~DCR_SE),gr3
  298. and gr2,gr3,gr2
  299. movgs gr2,dcr
  300. # we'll swap the real return address for one with a BREAK insn so that we can re-enable
  301. # single stepping on return
  302. movsg pcsr,gr2
  303. sethi.p %hi(__break_tlb_miss_real_return_info),gr3
  304. setlo %lo(__break_tlb_miss_real_return_info),gr3
  305. sti gr2,@(gr3,#0)
  306. sethi.p %hi(__break_tlb_miss_return_break),gr2
  307. setlo %lo(__break_tlb_miss_return_break),gr2
  308. movgs gr2,pcsr
  309. # we also have to fudge PSR because the return BREAK is in kernel space and we want
  310. # to get a BREAK fault not an access violation should the return be to userspace
  311. movsg psr,gr2
  312. sti.p gr2,@(gr3,#4)
  313. ori gr2,#PSR_PS,gr2
  314. movgs gr2,psr
  315. LEDS 0x2102,gr2
  316. ldi @(gr31,#REG_CCR),gr3
  317. movgs gr3,ccr
  318. lddi @(gr31,#REG_GR(2)),gr2
  319. movsg scr3,gr31
  320. movgs gr0,brr
  321. rett #1
  322. # step through a DTLB-miss handler from user mode
  323. .globl __break_user_data_tlb_miss
  324. __break_user_data_tlb_miss:
  325. # we'll want to try the trap stub again
  326. sethi.p %hi(__trap_user_data_tlb_miss),gr2
  327. setlo %lo(__trap_user_data_tlb_miss),gr2
  328. movgs gr2,bpcsr
  329. bra __break_tlb_miss_common
  330. # step through an ITLB-miss handler from kernel mode
  331. .globl __break_kernel_insn_tlb_miss
  332. __break_kernel_insn_tlb_miss:
  333. # we'll want to try the trap stub again
  334. sethi.p %hi(__trap_kernel_insn_tlb_miss),gr2
  335. setlo %lo(__trap_kernel_insn_tlb_miss),gr2
  336. movgs gr2,bpcsr
  337. bra __break_tlb_miss_common
  338. # step through a DTLB-miss handler from kernel mode
  339. .globl __break_kernel_data_tlb_miss
  340. __break_kernel_data_tlb_miss:
  341. # we'll want to try the trap stub again
  342. sethi.p %hi(__trap_kernel_data_tlb_miss),gr2
  343. setlo %lo(__trap_kernel_data_tlb_miss),gr2
  344. movgs gr2,bpcsr
  345. bra __break_tlb_miss_common
  346. #endif
  347. ###############################################################################
  348. #
  349. # handle debug events originating with userspace
  350. #
  351. ###############################################################################
  352. __break_maybe_userspace:
  353. LEDS 0x3003,gr2
  354. setlos #BPSR_BS,gr2
  355. andcc gr3,gr2,gr0,icc0
  356. bne icc0,#0,__break_continue /* skip if PSR.S was 1 */
  357. movsg brr,gr2
  358. andicc gr2,#BRR_ST|BRR_SB,gr0,icc0
  359. beq icc0,#0,__break_continue /* jump if not BREAK or single-step */
  360. LEDS 0x3007,gr2
  361. # do the first part of the exception prologue here
  362. sethi.p %hi(__kernel_frame0_ptr),gr28
  363. setlo %lo(__kernel_frame0_ptr),gr28
  364. ldi @(gr28,#0),gr28
  365. andi gr28,#~7,gr28
  366. # set up the kernel stack pointer
  367. sti sp ,@(gr28,#REG_SP)
  368. ori gr28,0,sp
  369. sti gr0 ,@(gr28,#REG_GR(28))
  370. stdi gr20,@(gr28,#REG_GR(20))
  371. stdi gr22,@(gr28,#REG_GR(22))
  372. movsg tbr,gr20
  373. movsg bpcsr,gr21
  374. movsg psr,gr22
  375. # determine the exception type and cancel single-stepping mode
  376. or gr0,gr0,gr23
  377. movsg dcr,gr2
  378. sethi.p %hi(DCR_SE),gr3
  379. setlo %lo(DCR_SE),gr3
  380. andcc gr2,gr3,gr0,icc0
  381. beq icc0,#0,__break_no_user_sstep /* must have been a BREAK insn */
  382. not gr3,gr3
  383. and gr2,gr3,gr2
  384. movgs gr2,dcr
  385. ori gr23,#REG__STATUS_STEP,gr23
  386. __break_no_user_sstep:
  387. LEDS 0x300f,gr2
  388. movsg brr,gr2
  389. andi gr2,#BRR_ST|BRR_SB,gr2
  390. slli gr2,#1,gr2
  391. or gr23,gr2,gr23
  392. sti.p gr23,@(gr28,#REG__STATUS) /* record single step status */
  393. # adjust the value acquired from TBR - this indicates the exception
  394. setlos #~TBR_TT,gr2
  395. and.p gr20,gr2,gr20
  396. setlos #TBR_TT_BREAK,gr2
  397. or.p gr20,gr2,gr20
  398. # fudge PSR.PS and BPSR.BS to return to kernel mode through the trap
  399. # table as trap 126
  400. andi gr22,#~PSR_PS,gr22 /* PSR.PS should be 0 */
  401. movgs gr22,psr
  402. setlos #BPSR_BS,gr2 /* BPSR.BS should be 1 and BPSR.BET 0 */
  403. movgs gr2,bpsr
  404. # return through remainder of the exception prologue
  405. # - need to load gr23 with return handler address
  406. sethi.p %hi(__entry_return_from_user_exception),gr23
  407. setlo %lo(__entry_return_from_user_exception),gr23
  408. sethi.p %hi(__entry_common),gr3
  409. setlo %lo(__entry_common),gr3
  410. movgs gr3,bpcsr
  411. LEDS 0x301f,gr2
  412. ldi @(gr31,#REG_CCR),gr3
  413. movgs gr3,ccr
  414. lddi.p @(gr31,#REG_GR(2)),gr2
  415. xor gr31,gr31,gr31
  416. movgs gr0,brr
  417. #ifdef CONFIG_MMU
  418. movsg scr3,gr31
  419. #endif
  420. rett #1
  421. ###############################################################################
  422. #
  423. # resume normal debug-mode entry
  424. #
  425. ###############################################################################
  426. __break_continue:
  427. LEDS 0x4003,gr2
  428. # set up the kernel stack pointer
  429. sti sp,@(gr31,#REG_SP)
  430. sethi.p %hi(__break_stack_tos),sp
  431. setlo %lo(__break_stack_tos),sp
  432. # finish building the exception frame
  433. stdi gr4 ,@(gr31,#REG_GR(4))
  434. stdi gr6 ,@(gr31,#REG_GR(6))
  435. stdi gr8 ,@(gr31,#REG_GR(8))
  436. stdi gr10,@(gr31,#REG_GR(10))
  437. stdi gr12,@(gr31,#REG_GR(12))
  438. stdi gr14,@(gr31,#REG_GR(14))
  439. stdi gr16,@(gr31,#REG_GR(16))
  440. stdi gr18,@(gr31,#REG_GR(18))
  441. stdi gr20,@(gr31,#REG_GR(20))
  442. stdi gr22,@(gr31,#REG_GR(22))
  443. stdi gr24,@(gr31,#REG_GR(24))
  444. stdi gr26,@(gr31,#REG_GR(26))
  445. sti gr0 ,@(gr31,#REG_GR(28)) /* NULL frame pointer */
  446. sti gr29,@(gr31,#REG_GR(29))
  447. sti gr30,@(gr31,#REG_GR(30))
  448. sti gr8 ,@(gr31,#REG_ORIG_GR8)
  449. #ifdef CONFIG_MMU
  450. movsg scr3,gr19
  451. sti gr19,@(gr31,#REG_GR(31))
  452. #endif
  453. movsg bpsr ,gr19
  454. movsg tbr ,gr20
  455. movsg bpcsr,gr21
  456. movsg psr ,gr22
  457. movsg isr ,gr23
  458. movsg cccr ,gr25
  459. movsg lr ,gr26
  460. movsg lcr ,gr27
  461. andi.p gr22,#~(PSR_S|PSR_ET),gr5 /* rebuild PSR */
  462. andi gr19,#PSR_ET,gr4
  463. or.p gr4,gr5,gr5
  464. srli gr19,#10,gr4
  465. andi gr4,#PSR_S,gr4
  466. or.p gr4,gr5,gr5
  467. setlos #-1,gr6
  468. sti gr20,@(gr31,#REG_TBR)
  469. sti gr21,@(gr31,#REG_PC)
  470. sti gr5 ,@(gr31,#REG_PSR)
  471. sti gr23,@(gr31,#REG_ISR)
  472. sti gr25,@(gr31,#REG_CCCR)
  473. stdi gr26,@(gr31,#REG_LR)
  474. sti gr6 ,@(gr31,#REG_SYSCALLNO)
  475. # store CPU-specific regs
  476. movsg iacc0h,gr4
  477. movsg iacc0l,gr5
  478. stdi gr4,@(gr31,#REG_IACC0)
  479. movsg gner0,gr4
  480. movsg gner1,gr5
  481. stdi gr4,@(gr31,#REG_GNER0)
  482. # build the debug register frame
  483. movsg brr,gr4
  484. movgs gr0,brr
  485. movsg nmar,gr5
  486. movsg dcr,gr6
  487. stdi gr4 ,@(gr31,#REG_BRR)
  488. sti gr19,@(gr31,#REG_BPSR)
  489. sti.p gr6 ,@(gr31,#REG_DCR)
  490. # trap exceptions during break handling and disable h/w breakpoints/watchpoints
  491. sethi %hi(DCR_EBE),gr5
  492. setlo.p %lo(DCR_EBE),gr5
  493. sethi %hi(__entry_breaktrap_table),gr4
  494. setlo %lo(__entry_breaktrap_table),gr4
  495. movgs gr5,dcr
  496. movgs gr4,tbr
  497. # set up kernel global registers
  498. sethi.p %hi(__kernel_current_task),gr5
  499. setlo %lo(__kernel_current_task),gr5
  500. ld @(gr5,gr0),gr29
  501. ldi.p @(gr29,#4),gr15 ; __current_thread_info = current->thread_info
  502. sethi %hi(_gp),gr16
  503. setlo.p %lo(_gp),gr16
  504. # make sure we (the kernel) get div-zero and misalignment exceptions
  505. setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
  506. movgs gr5,isr
  507. # enter the GDB stub
  508. LEDS 0x4007,gr2
  509. or.p gr0,gr0,fp
  510. call debug_stub
  511. LEDS 0x403f,gr2
  512. # return from break
  513. lddi @(gr31,#REG_IACC0),gr4
  514. movgs gr4,iacc0h
  515. movgs gr5,iacc0l
  516. lddi @(gr31,#REG_GNER0),gr4
  517. movgs gr4,gner0
  518. movgs gr5,gner1
  519. lddi @(gr31,#REG_LR) ,gr26
  520. lddi @(gr31,#REG_CCR) ,gr24
  521. lddi @(gr31,#REG_PSR) ,gr22
  522. ldi @(gr31,#REG_PC) ,gr21
  523. ldi @(gr31,#REG_TBR) ,gr20
  524. ldi.p @(gr31,#REG_DCR) ,gr6
  525. andi gr22,#PSR_S,gr19 /* rebuild BPSR */
  526. andi.p gr22,#PSR_ET,gr5
  527. slli gr19,#10,gr19
  528. or gr5,gr19,gr19
  529. movgs gr6 ,dcr
  530. movgs gr19,bpsr
  531. movgs gr20,tbr
  532. movgs gr21,bpcsr
  533. movgs gr23,isr
  534. movgs gr24,ccr
  535. movgs gr25,cccr
  536. movgs gr26,lr
  537. movgs gr27,lcr
  538. LEDS 0x407f,gr2
  539. #ifdef CONFIG_MMU
  540. ldi @(gr31,#REG_GR(31)),gr2
  541. movgs gr2,scr3
  542. #endif
  543. ldi @(gr31,#REG_GR(30)),gr30
  544. ldi @(gr31,#REG_GR(29)),gr29
  545. lddi @(gr31,#REG_GR(26)),gr26
  546. lddi @(gr31,#REG_GR(24)),gr24
  547. lddi @(gr31,#REG_GR(22)),gr22
  548. lddi @(gr31,#REG_GR(20)),gr20
  549. lddi @(gr31,#REG_GR(18)),gr18
  550. lddi @(gr31,#REG_GR(16)),gr16
  551. lddi @(gr31,#REG_GR(14)),gr14
  552. lddi @(gr31,#REG_GR(12)),gr12
  553. lddi @(gr31,#REG_GR(10)),gr10
  554. lddi @(gr31,#REG_GR(8)) ,gr8
  555. lddi @(gr31,#REG_GR(6)) ,gr6
  556. lddi @(gr31,#REG_GR(4)) ,gr4
  557. lddi @(gr31,#REG_GR(2)) ,gr2
  558. ldi.p @(gr31,#REG_SP) ,sp
  559. xor gr31,gr31,gr31
  560. movgs gr0,brr
  561. #ifdef CONFIG_MMU
  562. movsg scr3,gr31
  563. #endif
  564. rett #1
  565. ###################################################################################################
  566. #
  567. # GDB stub "system calls"
  568. #
  569. ###################################################################################################
  570. #ifdef CONFIG_GDBSTUB
  571. # void gdbstub_console_write(struct console *con, const char *p, unsigned n)
  572. .globl gdbstub_console_write
  573. gdbstub_console_write:
  574. break
  575. bralr
  576. #endif
  577. # GDB stub BUG() trap
  578. # GR8 is the proposed signal number
  579. .globl __debug_bug_trap
  580. __debug_bug_trap:
  581. break
  582. bralr
  583. # transfer kernel exeception to GDB for handling
  584. .globl __break_hijack_kernel_event
  585. __break_hijack_kernel_event:
  586. break
  587. .globl __break_hijack_kernel_event_breaks_here
  588. __break_hijack_kernel_event_breaks_here:
  589. nop
  590. #ifdef CONFIG_MMU
  591. # handle a return from TLB-miss that requires single-step reactivation
  592. .globl __break_tlb_miss_return_break
  593. __break_tlb_miss_return_break:
  594. break
  595. __break_tlb_miss_return_breaks_here:
  596. nop
  597. #endif
  598. # guard the first .text label in the next file from confusion
  599. nop