This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
H8/300 patches (7/8) exception handler
- From: Yoshinori Sato <ysato at users dot sourceforge dot jp>
- To: eCos patches <ecos-patches at sources dot redhat dot com>
- Date: Fri, 05 Mar 2004 01:42:28 +0900
- Subject: H8/300 patches (7/8) exception handler
exception handling update.
thread support update.
--
Yoshinori Sato
<ysato@users.sourceforge.jp>
Index: hal/h8300/arch/current/include/hal_arch.h
===================================================================
RCS file: /cvsroot/ecos-h8/ecos/packages/hal/h8300/arch/current/include/hal_arch.h,v
retrieving revision 1.1.1.4
diff -u -r1.1.1.4 hal_arch.h
--- hal/h8300/arch/current/include/hal_arch.h 27 Nov 2003 14:27:20 -0000 1.1.1.4
+++ hal/h8300/arch/current/include/hal_arch.h 4 Mar 2004 13:31:22 -0000
@@ -92,8 +92,8 @@
#define HAL_THREAD_INIT_CONTEXT( _sp_, _thread_, _entry_, _id_ ) \
{ \
register HAL_SavedRegisters *_regs_; \
- _regs_ = (HAL_SavedRegisters *)(((CYG_ADDRWORD)(_sp_)&~15) - \
- sizeof(HAL_SavedRegisters)*2); \
+ _regs_ = (HAL_SavedRegisters *)(((CYG_ADDRWORD)(_sp_)) - \
+ sizeof(HAL_SavedRegisters)); \
HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_); \
_regs_->er0 = (CYG_WORD)(_thread_); \
_regs_->er1 = (_id_)|0xddd1; \
@@ -199,7 +199,7 @@
(_regs_)->er4 = _regval_[4]; \
(_regs_)->er5 = _regval_[5]; \
(_regs_)->er6 = _regval_[6]; \
- \
+ (_regs_)->sp = _regval_[7]; \
(_regs_)->ccr = _regval_[8]; \
(_regs_)->pc = (_regval_[9] & 0xffffff); \
\
Index: hal/h8300/arch/current/src/vectors.S
===================================================================
RCS file: /cvsroot/ecos-h8/ecos/packages/hal/h8300/arch/current/src/vectors.S,v
retrieving revision 1.1.1.4
retrieving revision 1.17
diff -u -r1.1.1.4 -r1.17
--- hal/h8300/arch/current/src/vectors.S 27 Nov 2003 14:27:20 -0000 1.1.1.4
+++ hal/h8300/arch/current/src/vectors.S 4 Mar 2004 12:55:14 -0000 1.17
@@ -98,48 +98,103 @@
## Macros for Stack handling when running Cygmon
.macro hal_cygmon_switch_app_stack
- #
+#ifdef CYGPKG_HAL_H8300_H8300H
; Switch to interrupt stack to handle exception
- #
; First, save some scratch registers
- mov.l er0,@er0_save
- mov.l er1,@er1_save
+ mov.l er0,@-sp
+ mov.l er1,@-sp
+
+ ; Copy the exception frame
+ mov.l #__cygmon_interrupt_stack,er0
+ mov.l @(8:16,sp),er1
+ mov.l er1,@-er0
+
+ ; Save the pre-exception sp in the register image
+ mov.l sp,@-er0
+
+ ; Actually switch the stack
+ mov.l er0,sp
+
+ mov.l @sp,er0
+ adds #4,er0
+ adds #4,er0
+ mov.l er0,@sp
+ ; Now, restore the scratch registers
+ mov.l @(-4:16,er0),er1
+ mov.l @(-8:16,er0),er0
+#endif
+#ifdef CYGPKG_HAL_H8300_H8S
+ ; Switch to interrupt stack to handle exception
+
+ ; First, save some scratch registers
+ stm.l er0-er1,@-sp
+
; Copy the exception frame
mov.l #__cygmon_interrupt_stack,er0
- mov.l @sp,er1
+ mov.l @(10,sp:16),er1
mov.l er1,@-er0
+ mov.w @(10,sp:16),r1
+ mov.w r1,@-er0
; Save the pre-exception sp in the register image
mov.l sp,@-er0
; Actually switch the stack
mov.l er0,sp
+
+ mov.l @sp,er0
+ adds #4,er0
+ adds #4,er0
+ mov.l er0,@sp
; Now, restore the scratch registers
- mov.l @er0_save,er0
- mov.l @er1_save,er1
+ mov.l @(-4:16,er0),er1
+ mov.l @(-8:16,er0),er0
+#endif
.endm
.macro hal_cygmon_restore_app_stack
// For cygmon we are switching stacks immediately on exception.
// We must wait until the very end before restoring the original stack.
+#ifdef CYGPKG_HAL_H8300_H8300H
; Save some scratch registers
- mov.l er0,@er0_save
- mov.l er1,@er1_save
+ subs #4,sp
+ mov.l er0,@-sp
+ mov.l er1,@-sp
; We need to restore the application stack pointer, but we also
; need to restore the exception frame.
- mov.l @sp+,er0
+ mov.l @(12:16,sp),er0
+ mov.l @(16:16,sp),er1
+ mov.l er1,@er0
+ mov.l er0,@(8:16,sp)
+
+ ; Restore the scratch registers
mov.l @sp+,er1
- mov.l er0,@er1
- mov.l er1,sp // Restore the frame-adjusted SP
+ mov.l @sp+,er0
+ mov.l @sp+,sp // Restore the frame-adjusted SP
+#endif
+#ifdef CYGPKG_HAL_H8300_H8S
+ ; Save some scratch registers
+ subs #4,sp
+ stm.l er0-er1,@-sp
+
+ ; We need to restore the application stack pointer, but we also
+ ; need to restore the exception frame.
+ mov.l @(12:16,sp),er0
+ mov.w @(16:16,sp),r1
+ mov.w r1,@er0
+ mov.l @(18:16,sp),er1
+ mov.l er1,@er0
+ mov.l er0,@(8:16,sp)
; Restore the scratch registers
- mov.l @er0_save,er0
- mov.l @er1_save,er1
+ ldm.l @sp+,er0-er1
+ mov.l @sp+,sp // Restore the frame-adjusted SP
+#endif
.endm
#endif // CYGPKG_CYGMON
@@ -155,271 +210,29 @@
.globl reset_vector
reset_vector:
- ; Reset vector
.long CYG_LABEL_DEFN(_start)
.long CYG_LABEL_DEFN(_start)
- .space 3*4
- .long __interrupt5
- .long __interrupt6
- .long __interrupt7
- .long __interrupt8
- .long __interrupt9
- .long __interrupt10
- .long __interrupt11
- .long __interrupt12
- .long __interrupt13
- .long __interrupt14
- .long __interrupt15
- .long __interrupt16
- .long __interrupt17
- .long __interrupt18
- .long __interrupt19
- .long __interrupt20
- .long __interrupt21
- .long __interrupt22
- .long __interrupt23
- .long __interrupt24
- .long __interrupt25
- .long __interrupt26
- .long __interrupt27
- .long __interrupt28
- .long __interrupt29
- .long __interrupt30
- .long __interrupt31
- .long __interrupt32
- .long __interrupt33
- .long __interrupt34
- .long __interrupt35
- .long __interrupt36
- .long __interrupt37
- .long __interrupt38
- .long __interrupt39
- .long __interrupt40
- .long __interrupt41
- .long __interrupt42
- .long __interrupt43
- .long __interrupt44
- .long __interrupt45
- .long __interrupt46
- .long __interrupt47
- .long __interrupt48
- .long __interrupt49
- .long __interrupt50
- .long __interrupt51
- .long __interrupt52
- .long __interrupt53
- .long __interrupt54
- .long __interrupt55
- .long __interrupt56
- .long __interrupt57
- .long __interrupt58
- .long __interrupt59
- .long __interrupt60
- .long __interrupt61
- .long __interrupt62
- .long __interrupt63
-
-#ifdef CYGPKG_HAL_H8300_H8S
- .long __interrupt64
- .long __interrupt65
- .long __interrupt66
- .long __interrupt67
- .long __interrupt68
- .long __interrupt69
- .long __interrupt70
- .long __interrupt71
- .long __interrupt72
- .long __interrupt73
- .long __interrupt74
- .long __interrupt75
- .long __interrupt76
- .long __interrupt77
- .long __interrupt78
- .long __interrupt79
- .long __interrupt80
- .long __interrupt81
- .long __interrupt82
- .long __interrupt83
- .long __interrupt84
- .long __interrupt85
- .long __interrupt86
- .long __interrupt87
- .long __interrupt88
- .long __interrupt89
- .long __interrupt90
- .long __interrupt91
- .long __interrupt92
- .long __interrupt93
- .long __interrupt94
- .long __interrupt95
- .long __interrupt96
- .long __interrupt97
- .long __interrupt98
- .long __interrupt99
- .long __interrupt100
- .long __interrupt101
- .long __interrupt102
- .long __interrupt103
- .long __interrupt104
- .long __interrupt105
- .long __interrupt106
- .long __interrupt107
- .long __interrupt108
- .long __interrupt109
- .long __interrupt110
- .long __interrupt111
- .long __interrupt112
- .long __interrupt113
- .long __interrupt114
- .long __interrupt115
- .long __interrupt116
- .long __interrupt117
- .long __interrupt118
- .long __interrupt119
- .long __interrupt120
- .long __interrupt121
- .long __interrupt122
- .long __interrupt123
- .long __interrupt124
- .long __interrupt125
- .long __interrupt126
- .long __interrupt127
-#endif
+vector = 2
+ .rept CYG_ISR_TABLE_SIZE-2
+ .long interrupt_redirect_table+vector*4
+vector = vector + 1
+ .endr
#endif
-#define INTERRUPT_ENTRY(no) \
-__interrupt##no: \
- jsr @interrupt_entry
-
+#if !defined(CYGSEM_HAL_H8300_VECTOR_HOOK)
.section .int_hook_table,"ax"
- .space 5*4
-__interrupt_table:
-INTERRUPT_ENTRY(5)
-INTERRUPT_ENTRY(6)
-INTERRUPT_ENTRY(7)
-INTERRUPT_ENTRY(8)
-INTERRUPT_ENTRY(9)
-INTERRUPT_ENTRY(10)
-INTERRUPT_ENTRY(11)
-INTERRUPT_ENTRY(12)
-INTERRUPT_ENTRY(13)
-INTERRUPT_ENTRY(14)
-INTERRUPT_ENTRY(15)
-INTERRUPT_ENTRY(16)
-INTERRUPT_ENTRY(17)
-INTERRUPT_ENTRY(18)
-INTERRUPT_ENTRY(19)
-INTERRUPT_ENTRY(20)
-INTERRUPT_ENTRY(21)
-INTERRUPT_ENTRY(22)
-INTERRUPT_ENTRY(23)
-INTERRUPT_ENTRY(24)
-INTERRUPT_ENTRY(25)
-INTERRUPT_ENTRY(26)
-INTERRUPT_ENTRY(27)
-INTERRUPT_ENTRY(28)
-INTERRUPT_ENTRY(29)
-INTERRUPT_ENTRY(30)
-INTERRUPT_ENTRY(31)
-INTERRUPT_ENTRY(32)
-INTERRUPT_ENTRY(33)
-INTERRUPT_ENTRY(34)
-INTERRUPT_ENTRY(35)
-INTERRUPT_ENTRY(36)
-INTERRUPT_ENTRY(37)
-INTERRUPT_ENTRY(38)
-INTERRUPT_ENTRY(39)
-INTERRUPT_ENTRY(40)
-INTERRUPT_ENTRY(41)
-INTERRUPT_ENTRY(42)
-INTERRUPT_ENTRY(43)
-INTERRUPT_ENTRY(44)
-INTERRUPT_ENTRY(45)
-INTERRUPT_ENTRY(46)
-INTERRUPT_ENTRY(47)
-INTERRUPT_ENTRY(48)
-INTERRUPT_ENTRY(49)
-INTERRUPT_ENTRY(50)
-INTERRUPT_ENTRY(51)
-INTERRUPT_ENTRY(52)
-INTERRUPT_ENTRY(53)
-INTERRUPT_ENTRY(54)
-INTERRUPT_ENTRY(55)
-INTERRUPT_ENTRY(56)
-INTERRUPT_ENTRY(57)
-INTERRUPT_ENTRY(58)
-INTERRUPT_ENTRY(59)
-INTERRUPT_ENTRY(60)
-INTERRUPT_ENTRY(61)
-INTERRUPT_ENTRY(62)
-INTERRUPT_ENTRY(63)
-#ifdef CYGPKG_HAL_H8300_H8S
-INTERRUPT_ENTRY(64)
-INTERRUPT_ENTRY(65)
-INTERRUPT_ENTRY(66)
-INTERRUPT_ENTRY(67)
-INTERRUPT_ENTRY(68)
-INTERRUPT_ENTRY(69)
-INTERRUPT_ENTRY(70)
-INTERRUPT_ENTRY(71)
-INTERRUPT_ENTRY(72)
-INTERRUPT_ENTRY(73)
-INTERRUPT_ENTRY(74)
-INTERRUPT_ENTRY(75)
-INTERRUPT_ENTRY(76)
-INTERRUPT_ENTRY(77)
-INTERRUPT_ENTRY(78)
-INTERRUPT_ENTRY(79)
-INTERRUPT_ENTRY(80)
-INTERRUPT_ENTRY(81)
-INTERRUPT_ENTRY(82)
-INTERRUPT_ENTRY(83)
-INTERRUPT_ENTRY(84)
-INTERRUPT_ENTRY(85)
-INTERRUPT_ENTRY(86)
-INTERRUPT_ENTRY(87)
-INTERRUPT_ENTRY(88)
-INTERRUPT_ENTRY(89)
-INTERRUPT_ENTRY(90)
-INTERRUPT_ENTRY(91)
-INTERRUPT_ENTRY(92)
-INTERRUPT_ENTRY(93)
-INTERRUPT_ENTRY(94)
-INTERRUPT_ENTRY(95)
-INTERRUPT_ENTRY(96)
-INTERRUPT_ENTRY(97)
-INTERRUPT_ENTRY(98)
-INTERRUPT_ENTRY(99)
-INTERRUPT_ENTRY(100)
-INTERRUPT_ENTRY(101)
-INTERRUPT_ENTRY(102)
-INTERRUPT_ENTRY(103)
-INTERRUPT_ENTRY(104)
-INTERRUPT_ENTRY(105)
-INTERRUPT_ENTRY(106)
-INTERRUPT_ENTRY(107)
-INTERRUPT_ENTRY(108)
-INTERRUPT_ENTRY(109)
-INTERRUPT_ENTRY(110)
-INTERRUPT_ENTRY(111)
-INTERRUPT_ENTRY(112)
-INTERRUPT_ENTRY(113)
-INTERRUPT_ENTRY(114)
-INTERRUPT_ENTRY(115)
-INTERRUPT_ENTRY(116)
-INTERRUPT_ENTRY(117)
-INTERRUPT_ENTRY(118)
-INTERRUPT_ENTRY(119)
-INTERRUPT_ENTRY(120)
-INTERRUPT_ENTRY(121)
-INTERRUPT_ENTRY(122)
-INTERRUPT_ENTRY(123)
-INTERRUPT_ENTRY(124)
-INTERRUPT_ENTRY(125)
-INTERRUPT_ENTRY(126)
-INTERRUPT_ENTRY(127)
+interrupt_redirect_table:
+vector = 0
+ .rept CYG_ISR_TABLE_SIZE
+ jsr @interrupt_entry
+vector = vector + 1
+ .endr
+#else
+ .section .int_hook_table,"x"
+interrupt_redirect_table:
+ .space 4*CYG_ISR_TABLE_SIZE
#endif
-
+
##-----------------------------------------------------------------------------
## Startup code
@@ -449,42 +262,74 @@
mov.l #CYG_LABEL_DEFN(__ram_data_start),er6
mov.l #CYG_LABEL_DEFN(__ram_data_end),er4
sub.l er6,er4
+ shlr2 er4
1:
- eepmov.w
- dec.w #1,e4
- cmp.w #-1,e4
- bhi 1b
+ mov.l @er5+,er0
+ mov.l er0,@er6
+ adds #4,er6
+ dec.l #1,er4
+ bne 1b
#endif
#if defined(CYGSEM_HAL_H8300_VECTOR_HOOK)
; Setup Interrupt Vector (virtual)
- mov.l #CYG_LABEL_DEFN(__rom_int_hook_table),er5
- mov.l #CYG_LABEL_DEFN(__int_hook_start),er6
- mov.l #CYG_LABEL_DEFN(__int_hook_end),er4
- sub.l er6,er4
-1:
- eepmov.w
- dec.w #1,e4
- cmp.w #-1,e4
- bhi 1b
+
+ ;; check rom table
+ mov.l #8*4,er0
+ mov.l @er0+,er1
+ adds #4,er1
+ mov.b #3,r3l
+1:
+ mov.l @er0+,er2
+ cmp.l er1,er2
+ bne 3f
+ adds #4,er1
+ dec.b r3l
+ bne 1b
+ ;; calculate vector address
+ mov.l @8*4,er0
+ and.w #0xff,e0
+ sub.l #8*4,er0
+ ;; build ram vector
+ mov.l er0,@__interrupt_table
+ mov.l #0x5e000000+interrupt_entry,er1
+ mov.l #save_vector_table,er3
+ mov.b #0,r2l
+2:
+ ;; check saved vector
+ mov.b @er3+,r2h
+ cmp.b r2l,r2h
+ beq 5f
+ subs #1,er3
+ mov.l er1,@er0
+5:
+ adds #4,er0
+ inc.b r2l
+ cmp.b #CYG_ISR_TABLE_SIZE,r2l
+ bcs 2b
+ bra 4f
+3:
+ bra 3b
+4:
+
+#else
+ mov.l #interrupt_redirect_table,er0
+ mov.l er0,@__interrupt_table
#endif
; Clear BSS
mov.l #CYG_LABEL_DEFN(__bss_start),er5
- mov.l er5,er6
- adds #1,er6
mov.l #CYG_LABEL_DEFN(__bss_end),er4
sub.l #CYG_LABEL_DEFN(__bss_start),er4
-
- mov.b #0,r0l
- mov.b r0l,@er5
-1:
- eepmov.w
- dec.w #1,e4
- cmp.w #-1,e4
- bhi 1b
-
+ shlr2 er4
+ sub.l er0,er0
+1:
+ mov.l er0,@er5
+ adds #4,er5
+ dec.l #1,er4
+ bne 1b
+
; Call variant and platform HAL
; initialization routines.
@@ -520,14 +365,26 @@
9:
bra 9b ; Loop if we return
+save_vector_table:
+#if defined(CYGSEM_HAL_H8300_SAVE_STUB_VECTOR)
+ .byte 5,11
+#if defined(CYGPKG_HAL_H8300_SAVED_VECTORS)
+ h8300_save_vectors
+#endif
+#endif
+ .byte 0 ; end maker
+ .align 2
+
interrupt_entry:
mov.l er0,@-sp
- mov.l @(4,sp),er0
- sub.l #__interrupt_table,er0
- shlr.l er0
- shlr.l er0
- add.w #5-1,r0
+ mov.l @(4:16,sp),er0 ; interrupt vector offset
+ mov.l er1,@-sp
+ mov.l @__interrupt_table,er1
+ sub.l er1,er0
+ shlr2 er0
+ dec.l #1,er0
mov.l er0,@CYG_LABEL_DEFN(_intvector)
+ mov.l @sp+,er1
mov.l @sp+,er0
adds #4,sp
#ifdef CYGPKG_CYGMON
@@ -711,6 +568,9 @@
.global __lastpc
__lastpc:
.long 0
+__interrupt_table:
+ .long 0
+
.text
##-----------------------------------------------------------------------------
## Execute pending DSRs on the interrupt stack with interrupts enabled.
@@ -724,14 +584,6 @@
h8300_var_call_pending_DSR
#endif
-#ifdef CYGPKG_CYGMON
- .section .bss
-er0_save:
- .long 0
-er1_save:
- .long 0
-#endif
-
##-----------------------------------------------------------------------------
## Default TRAP VSR
@@ -742,12 +594,12 @@
#ifdef CYG_HAL_DIAG_EXCPT_END
hal_diag_excpt_start
#endif
- mov.l @(32,sp),er0
- subs #2,er0
- mov.l er0,@(32,sp)
+ mov.l @CYG_LABEL_DEFN(_intvector),er1
+ cmp.l #11,er1 ; Adjust trap entry address
+ bne 1f
+ h8300_trap_adjust_pc
+1:
mov.l sp,er0
- mov.l @CYG_LABEL_DEFN(_intvector),er1
-
jsr @CYG_LABEL_DEFN(cyg_hal_exception_handler)
#ifdef CYG_HAL_DIAG_EXCPT_END
Index: hal/h8300/h8300h/current/include/variant.inc
===================================================================
RCS file: /cvsroot/ecos-h8/ecos/packages/hal/h8300/h8300h/current/include/variant.inc,v
retrieving revision 1.1.1.4
diff -u -r1.1.1.4 variant.inc
--- hal/h8300/h8300h/current/include/variant.inc 27 Nov 2003 14:27:21 -0000 1.1.1.4
+++ hal/h8300/h8300h/current/include/variant.inc 4 Mar 2004 13:31:27 -0000
@@ -167,6 +167,12 @@
mov.b r0h,ccr
.endm
+ .macro h8300_trap_adjust_pc
+ mov.l @(36:16,sp),er0
+ subs #2,er0
+ mov.l er0,@(36:16,sp)
+ .endm
+
##-----------------------------------------------------------------------------
# Default interrupt decoding macros.
Index: hal/h8300/h8s/current/include/var_arch.h
===================================================================
RCS file: /cvsroot/ecos-h8/ecos/packages/hal/h8300/h8s/current/include/var_arch.h,v
retrieving revision 1.1.1.1
retrieving revision 1.5
diff -u -r1.1.1.1 -r1.5
--- hal/h8300/h8s/current/include/var_arch.h 27 Nov 2003 14:27:24 -0000 1.1.1.1
+++ hal/h8300/h8s/current/include/var_arch.h 4 Mar 2004 08:57:02 -0000 1.5
@@ -83,6 +83,15 @@
CYG_WORD32 pc;
} HAL_SavedRegisters;
+#define HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_) \
+ {_regs_->exr = 0;}
+
+#define HAL_GET_GDB_EXTRA_REGISTERS(_regval_,_regs_) \
+ {_regval_[10] = (_regs_)->exr;}
+
+#define HAL_SET_GDB_EXTRA_REGISTERS( _regs_,_regval_) \
+ {(_regs_)->exr = _regval_[10];}
+
// Internal peripheral registers
#include <cyg/hal/mod_regs_adc.h>
#include <cyg/hal/mod_regs_bsc.h>
@@ -95,12 +104,6 @@
#include <cyg/hal/mod_regs_ppg.h>
#include <cyg/hal/mod_regs_wdt.h>
-//--------------------------------------------------------------------------
-
-#ifndef HAL_THREAD_INIT_CONTEXT_EXTRA
-#define HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_) \
- (_regs_)->exr = 0;
-#endif
//--------------------------------------------------------------------------
#endif // CYGONCE_HAL_VAR_ARCH_H
Index: hal/h8300/h8s/current/include/variant.inc
===================================================================
RCS file: /cvsroot/ecos-h8/ecos/packages/hal/h8300/h8s/current/include/variant.inc,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 variant.inc
--- hal/h8300/h8s/current/include/variant.inc 27 Nov 2003 14:27:25 -0000 1.1.1.1
+++ hal/h8300/h8s/current/include/variant.inc 4 Mar 2004 13:31:34 -0000
@@ -79,7 +79,7 @@
stm er4-er6,@-sp
sub.w e0,e0
mov.w e0,@(4*9:16,sp) ; clear exr high word
- mov.l @(4*10:16,sp),r0
+ mov.w @(4*10:16,sp),r0
sub.l er1,er1
mov.b r0h,r1l
mov.l er1,@(4*8:16,sp) ; copy ccr
@@ -92,6 +92,9 @@
mov.w @(4*10:16,sp),r1
mov.b r0l,r1h
mov.w r1,@(4*10:16,sp) ; set ccr
+ mov.w @(4*9+2:16,sp),r0
+ mov.b r0l,r0h
+ mov.w r0,@(4*9+2:16,sp) ; extend exr
ldm @sp+,er4-er6
ldm @sp+,er0-er3
add.l #10,sp
@@ -159,6 +162,12 @@
and.b #0xf8,r0h
or.b r0l,r0h
mov.b r0h,exr
+ .endm
+
+ .macro h8300_trap_adjust_pc
+ mov.l @(40:16,sp),er0
+ subs #2,er0
+ mov.l er0,@(40:16,sp)
.endm
##-----------------------------------------------------------------------------