INTERRUPTS = 64
.h8300h
.macro SHLL2 reg
shll.l \reg
shll.l \reg
.endm
.macro SHLR2 reg
shlr.l \reg
shlr.l \reg
.endm
.macro SAVEREGS
mov.l er0,@-sp
mov.l er1,@-sp
mov.l er2,@-sp
mov.l er3,@-sp
.endm
.macro RESTOREREGS
mov.l @sp+,er3
mov.l @sp+,er2
.endm
.macro SAVEEXR
.endm
.macro RESTOREEXR
.endm
INTERRUPTS = 128
.h8300s
.macro SHLL2 reg
shll.l
.endm
.macro SHLR2 reg
shlr.l
.endm
.macro SAVEREGS
stm.l er0-er3,@-sp
.endm
.macro RESTOREREGS
ldm.l @sp+,er2-er3
.endm
.macro SAVEEXR
mov.w @(USEREXR:16,er0),r1
mov.w r1,@(LEXR-LER3:16,sp)
.endm
.macro RESTOREEXR
mov.w @(LEXR-LER1:16,sp),r1
mov.b r1l,r1h
mov.w r1,@(USEREXR:16,er0)
.endm
.macro SAVE_ALL
mov.l er0,@-sp
stc ccr,r0l
btst
bne 5f
mov.l sp,@SYMBOL_NAME(sw_usp)
mov.l @sp,er0
orc
mov.l @SYMBOL_NAME(sw_ksp),sp
sub.l
SAVEREGS
mov.l @SYMBOL_NAME(sw_usp),er0
mov.l @(USERRET:16,er0),er1
mov.l er1,@(LRET-LER3:16,sp)
SAVEEXR
mov.l @(LORIG-LER3:16,sp),er0
mov.l er0,@(LER0-LER3:16,sp)
mov.w e1,r1
and
bra 6f
5:
mov.l @sp,er0
subs
SAVEREGS
mov.w @(LRET-LER3:16,sp),r1
6:
mov.b r1h,r1l
mov.b
mov.w r1,@(LCCR-LER3:16,sp)
mov.l er6,@-sp
mov.l er5,@-sp
mov.l er4,@-sp
.endm
.macro RESTORE_ALL
mov.l @sp+,er4
mov.l @sp+,er5
mov.l @sp+,er6
RESTOREREGS
mov.w @(LCCR-LER1:16,sp),r0
btst
bne 7f
orc
mov.l @SYMBOL_NAME(sw_usp),er0
mov.l @(LER0-LER1:16,sp),er1
mov.l er1,@er0
RESTOREEXR
mov.w @(LCCR-LER1:16,sp),r1
mov.b r1l,r1h
mov.b @(LRET+1-LER1:16,sp),r1l
mov.w r1,e1
mov.w @(LRET+2-LER1:16,sp),r1
mov.l er1,@(USERRET:16,er0)
mov.l @sp+,er1
add.l
mov.l sp,@SYMBOL_NAME(sw_ksp)
andc
mov.l er0,sp
bra 8f
7:
mov.l @sp+,er1
adds
adds
8:
mov.l @sp+,er0
adds
rte
.endm
.globl SYMBOL_NAME(system_call)
.globl SYMBOL_NAME(ret_from_exception)
.globl SYMBOL_NAME(ret_from_fork)
.globl SYMBOL_NAME(ret_from_interrupt)
.globl SYMBOL_NAME(interrupt_redirect_table)
.globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
.globl SYMBOL_NAME(resume)
.globl SYMBOL_NAME(interrupt_entry)
.globl SYMBOL_NAME(trace_break)
.section .int_redirect,"ax"
SYMBOL_NAME_LABEL(interrupt_redirect_table)
.rept 7
.long 0
.endr
.rept 5
.long 0
.endr
jmp @SYMBOL_NAME(trace_break)
.long 0
jsr @SYMBOL_NAME(interrupt_entry)
jmp @SYMBOL_NAME(system_call)
.long 0
.long 0
jmp @SYMBOL_NAME(trace_break)
.rept INTERRUPTS-12
jsr @SYMBOL_NAME(interrupt_entry)
.endr
.globl SYMBOL_NAME(interrupt_redirect_table)
.section .bss
SYMBOL_NAME_LABEL(interrupt_redirect_table)
.space 4
.section .text
.align 2
SYMBOL_NAME_LABEL(interrupt_entry)
SAVE_ALL
mov.l sp,er0
add.l
btst
bne 1f
mov.l @SYMBOL_NAME(sw_usp),er0
adds
1:
mov.l @er0,er0
sub.l
mov.l @SYMBOL_NAME(interrupt_redirect_table),er1
sub.l er1,er0
SHLR2 er0
dec.l
mov.l sp,er1
subs
jsr @SYMBOL_NAME(do_IRQ)
jmp @SYMBOL_NAME(ret_from_interrupt)
SYMBOL_NAME_LABEL(system_call)
subs
SAVE_ALL
andc
mov.l er0,er4
mov.l sp,er0
jsr @SYMBOL_NAME(set_esp0)
mov.l sp,er2
and.w
mov.b @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
btst
beq 1f
jsr @SYMBOL_NAME(do_syscall_trace)
1:
cmp.l
bcc badsys
SHLL2 er4
mov.l
add.l er4,er0
mov.l @er0,er4
beq SYMBOL_NAME(ret_from_exception):16
mov.l @(LER1:16,sp),er0
mov.l @(LER2:16,sp),er1
mov.l @(LER3:16,sp),er2
jsr @er4
mov.l er0,@(LER0:16,sp)
mov.l sp,er2
and.w
mov.b @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
btst
beq 2f
jsr @SYMBOL_NAME(do_syscall_trace)
2:
jsr @SYMBOL_NAME(syscall_print)
orc
bra resume_userspace
badsys:
mov.l
mov.l er0,@(LER0:16,sp)
bra resume_userspace
SYMBOL_NAME_LABEL(ret_from_exception)
orc
SYMBOL_NAME_LABEL(ret_from_interrupt)
mov.b @(LCCR+1:16,sp),r0l
btst
bne resume_kernel:8
resume_userspace:
andc
mov.l sp,er4
and.w
mov.l @(TI_FLAGS:16,er4),er1
and.l
beq restore_all:8
work_pending:
btst
bne work_resched:8
mov.l sp,er0
subs
jsr @SYMBOL_NAME(do_notify_resume)
bra restore_all:8
work_resched:
mov.l sp,er0
jsr @SYMBOL_NAME(set_esp0)
jsr @SYMBOL_NAME(schedule)
bra resume_userspace:8
restore_all:
RESTORE_ALL
resume_kernel:
mov.l @(TI_PRE_COUNT:16,er4),er0
bne restore_all:8
need_resched:
mov.l @(TI_FLAGS:16,er4),er0
btst
beq restore_all:8
mov.b @(LCCR+1:16,sp),r0l
bmi restore_all:8
mov.l
mov.l er0,@(TI_PRE_COUNT:16,er4)
andc
mov.l sp,er0
jsr @SYMBOL_NAME(set_esp0)
jsr @SYMBOL_NAME(schedule)
orc
bra need_resched:8
SYMBOL_NAME_LABEL(ret_from_fork)
mov.l er2,er0
jsr @SYMBOL_NAME(schedule_tail)
jmp @SYMBOL_NAME(ret_from_exception)
SYMBOL_NAME_LABEL(resume)
sub.w r3,r3
stc ccr,r3l
mov.w r3,@(THREAD_CCR+2:16,er0)
orc
mov.l @SYMBOL_NAME(sw_usp),er3
mov.l er3,@(THREAD_USP:16,er0)
mov.l sp,@(THREAD_KSP:16,er0)
mov.l @(THREAD_USP:16,er1),er0
mov.l er0,@SYMBOL_NAME(sw_usp)
mov.l @(THREAD_KSP:16,er1),sp
mov.w @(THREAD_CCR+2:16,er1),r3
ldc r3l,ccr
rts
SYMBOL_NAME_LABEL(trace_break)
subs
SAVE_ALL
sub.l er1,er1
dec.l
mov.l er1,@(LORIG,sp)
mov.l sp,er0
jsr @SYMBOL_NAME(set_esp0)
mov.l @SYMBOL_NAME(sw_usp),er0
mov.l @er0,er1
mov.w @(-2:16,er1),r2
cmp.w
beq 1f
subs
mov.l er1,@er0
1:
and.w
mov.l er1,er0
jsr @SYMBOL_NAME(trace_trap)
jmp @SYMBOL_NAME(ret_from_exception)
.section .bss
SYMBOL_NAME_LABEL(sw_ksp)
.space 4
SYMBOL_NAME_LABEL(sw_usp)
.space 4
.end