#include "opt_multiprocessor.h"
#include "opt_cputype.h"
.section .data
.align 64
.export emergency_stack_start, data
emergency_stack_start:
.block 32768
.export emergency_stack_end, data
emergency_stack_end:
.text
.align NBPG
.export gateway_page, entry
gateway_page:
nop
gate,n bsd_syscall,%r0
nop
nop
nop
nop
nop
nop
bsd_syscall:
mfctl %eiem, %r1
mtctl %r0, %eiem
mtsp %r0, %sr1
mfctl %pidr1, %ret0
ldi HPPA_PID_KERNEL, %t2
mtctl %t2, %pidr1
.import syscall_entry,code
.call
ldil L%syscall_entry, %t2
be R%syscall_entry(%sr1, %t2)
nop ! nop ! nop ! nop
.size gateway_page, .-gateway_page
.align NBPG
.export gateway_page_end, entry
gateway_page_end:
.export syscall_entry,entry
.proc
.callinfo calls
.entry
syscall_entry:
GET_CURLWP_SPACE(%sr1, %t3)
ldw L_PCB(%sr1, %t3), %t2
ldo NBPG+TRAPFRAME_SIZEOF(%t2), %t3
stw %t4, TF_R19-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %t1, TF_R22-TRAPFRAME_SIZEOF(%sr1, %t3)
copy %sp, %t4
stw %arg3, TF_R23 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg2, TF_R24 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_R25 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg0, TF_R26 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r27, TF_R27 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %sp, TF_R30 -TRAPFRAME_SIZEOF(%sr1, %t3)
copy %t3, %sp
stwm %r0, HPPA_FRAME_SIZE+HPPA_FRAME_MAXARGS(%sr1, %sp)
ldo HPPA_FRAME_SIZE-1(%sp),%sp
depi 0, 31, 6, %sp
stw %r0, HPPA_FRAME_CRP(%sr1, %sp)
GET_CURCPU_SPACE(%sr1, %t1)
ldw CI_PSW(%sr1, %t1), %t1
stw %r1, TF_CR15-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %t1, TF_CR22-TRAPFRAME_SIZEOF(%sr1, %t3)
mfsp %sr3, %t1
stw %t1, TF_SR3-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %ret0, TF_CR8-TRAPFRAME_SIZEOF(%sr1, %t3)
mtctl %r1, %eiem
stw %r2 , TF_R2 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r3 , TF_R3 -TRAPFRAME_SIZEOF(%sr1, %t3)
copy %t3, %r3
stw %r4 , TF_R4 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r5 , TF_R5 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r6 , TF_R6 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r7 , TF_R7 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r8 , TF_R8 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r9 , TF_R9 -TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r10, TF_R10-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r11, TF_R11-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r12, TF_R12-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r13, TF_R13-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r14, TF_R14-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r15, TF_R15-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r16, TF_R16-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r17, TF_R17-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r18, TF_R18-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r0, 0(%sr1, %t3)
copy %r0 , %r3
stw %r0, HPPA_FRAME_PSP(%sr1, %sp)
stw %r0, HPPA_FRAME_CRP(%sr1, %sp)
stw %arg0, 1*4(%sr1, %t3)
stw %arg1, 2*4(%sr1, %t3)
stw %arg2, 3*4(%sr1, %t3)
stw %arg3, 4*4(%sr1, %t3)
ldw HPPA_FRAME_ARG( 4)(%t4), %arg0
ldw HPPA_FRAME_ARG( 5)(%t4), %arg1
ldw HPPA_FRAME_ARG( 6)(%t4), %arg2
ldw HPPA_FRAME_ARG( 7)(%t4), %arg3
stw %arg0, 5*4(%sr1, %t3)
stw %arg1, 6*4(%sr1, %t3)
stw %arg2, 7*4(%sr1, %t3)
stw %arg3, 8*4(%sr1, %t3)
ldw HPPA_FRAME_ARG( 8)(%t4), %arg0
ldw HPPA_FRAME_ARG( 9)(%t4), %arg1
stw %arg0, 9*4(%sr1, %t3)
stw %arg1,10*4(%sr1, %t3)
ldo 4(%r31), %arg1
stw %r31, TF_IIOQH-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_IIOQT-TRAPFRAME_SIZEOF(%sr1, %t3)
mfsp %sr0, %arg0
stw %arg0, TF_IISQH-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg0, TF_IISQT-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg0, TF_CR20-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %r31, TF_CR21-TRAPFRAME_SIZEOF(%sr1, %t3)
ldil L%(TFF_LAST|TFF_SYS), %arg1
stw %r0, TF_CR19-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_FLAGS-TRAPFRAME_SIZEOF(%sr1, %t3)
mfsp %sr2, %arg2
mfsp %sr4, %arg3
stw %arg0, TF_SR0-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg0, TF_SR1-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg2, TF_SR2-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg3, TF_SR4-TRAPFRAME_SIZEOF(%sr1, %t3)
mfsp %sr5, %arg0
mfsp %sr6, %arg1
mfsp %sr7, %arg2
mfctl %pidr2, %arg3
stw %arg0, TF_SR5-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_SR6-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg2, TF_SR7-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg3, TF_CR9-TRAPFRAME_SIZEOF(%sr1, %t3)
#if pbably_not_worth_it
mfctl %pidr3, %arg2
mfctl %pidr4, %arg3
stw %arg2, TF_CR12-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg3, TF_CR13-TRAPFRAME_SIZEOF(%sr1, %t3)
#endif
mfctl CR_TLS, %arg0
stw %arg0, TF_CR27-TRAPFRAME_SIZEOF(%sr1, %t3)
#if defined(DDB) || defined(KGDB)
mfctl %eirr, %arg0
mfctl CR_VTOP, %arg1
stw %arg0, TF_CR23-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_CR25-TRAPFRAME_SIZEOF(%sr1, %t3)
mfctl %cr24, %arg0
mfctl %cr28, %arg1
stw %arg0, TF_CR24-TRAPFRAME_SIZEOF(%sr1, %t3)
stw %arg1, TF_CR28-TRAPFRAME_SIZEOF(%sr1, %t3)
#endif
mtsp %r0, %sr0
mtsp %r0, %sr1
mtsp %r0, %sr2
mtsp %r0, %sr3
mtsp %r0, %sr4
mtsp %r0, %sr5
mtsp %r0, %sr6
mtsp %r0, %sr7
ldo -TRAPFRAME_SIZEOF(%t3), %arg0
ldo 4(%t3), %arg1
ldil L%$global$,%dp
ldo R%$global$(%dp),%dp
GET_CURLWP(%r3)
ldw L_PROC(%r3), %r1
ldw P_MD_SYSCALL(%r1), %r1
.call
blr %r0, %rp
bv,n %r0(%r1)
nop
ldw L_MD(%r3), %t3
.exit
.procend
.export syscall_return, entry
.proc
.callinfo no_calls
.entry
syscall_return:
mtctl %r0, %eiem
GET_CURCPU(%t2)
ldo CI_TRAPSAVE(%t2), %t2
ldw 0(%t3), %r1 ! ldw 4(%t3), %t1 ! stw %r1, 0(%t2) ! stw %t1, 4(%t2)
ldw 8(%t3), %r1 ! ldw 12(%t3), %t1 ! stw %r1, 8(%t2) ! stw %t1, 12(%t2)
ldw 16(%t3), %r1 ! ldw 20(%t3), %t1 ! stw %r1, 16(%t2) ! stw %t1, 20(%t2)
ldw 24(%t3), %r1 ! ldw 28(%t3), %t1 ! stw %r1, 24(%t2) ! stw %t1, 28(%t2)
ldw 32(%t3), %r1 ! ldw 36(%t3), %t1 ! stw %r1, 32(%t2) ! stw %t1, 36(%t2)
ldw 40(%t3), %r1 ! ldw 44(%t3), %t1 ! stw %r1, 40(%t2) ! stw %t1, 44(%t2)
ldw 48(%t3), %r1 ! ldw 52(%t3), %t1 ! stw %r1, 48(%t2) ! stw %t1, 52(%t2)
ldw 56(%t3), %r1 ! ldw 60(%t3), %t1 ! stw %r1, 56(%t2) ! stw %t1, 60(%t2)
ldw TF_CR11(%t3), %t1
mtctl %t1, %sar
ldw TF_R1(%t3), %r1
ldw TF_R2(%t3), %r2
ldw TF_R3(%t3), %r3
ldw TF_R4(%t3), %r4
ldw TF_R5(%t3), %r5
ldw TF_R6(%t3), %r6
ldw TF_R7(%t3), %r7
ldw TF_R8(%t3), %r8
ldw TF_R9(%t3), %r9
ldw TF_R10(%t3), %r10
ldw TF_R11(%t3), %r11
ldw TF_R12(%t3), %r12
ldw TF_R13(%t3), %r13
ldw TF_R14(%t3), %r14
ldw TF_R15(%t3), %r15
ldw TF_R16(%t3), %r16
ldw TF_R17(%t3), %r17
ldw TF_R18(%t3), %r18
ldw TF_R19(%t3), %t4
ldw TF_R23(%t3), %r23
ldw TF_R24(%t3), %r24
ldw TF_R25(%t3), %r25
ldw TF_R26(%t3), %r26
ldw TF_R27(%t3), %r27
ldw TF_R28(%t3), %r28
ldw TF_R29(%t3), %r29
ldw TF_R31(%t3), %r31
ldw TF_SR0(%t3), %t1
ldw TF_SR1(%t3), %t2
mtsp %t1, %sr0
mtsp %t2, %sr1
ldw TF_SR2(%sr3, %t3), %t1
ldw TF_SR4(%sr3, %t3), %t2
mtsp %t1, %sr2
mtsp %t2, %sr4
ldw TF_SR5(%sr3, %t3), %t1
ldw TF_SR6(%sr3, %t3), %t2
mtsp %t1, %sr5
mtsp %t2, %sr6
ldw TF_SR7(%sr3, %t3), %t1
ldw TF_CR9(%sr3, %t3), %t2
mtsp %t1, %sr7
mtctl %t2, %pidr2
#if pbably_not_worth_it
ldw TF_CR12(%sr3, %t3), %t1
ldw TF_CR13(%sr3, %t3), %t2
mtctl %t1, %pidr3
mtctl %t2, %pidr4
#endif
ldw TF_CR27(%sr3, %t3), %t1
ldw TF_CR30(%sr3, %t3), %t2
mtctl %t1, CR_TLS
mtctl %t2, CR_FPPADDR
ldw TF_CR0(%sr3, %t3), %t1
mtctl %t1, CR_RCTR
GET_CURCPU_SPACE(%sr3, %t3)
ssm 0, %r0
ldo CI_TRAPSAVE(%t3), %t3
nop ! nop ! nop ! nop ! nop ! nop
rsm RESET_PSW, %r0
ldw TF_IISQH(%t3), %t1
ldw TF_IISQT(%t3), %t2
mtctl %t1, %pcsq
mtctl %t2, %pcsq
ldw TF_IIOQH(%t3), %t1
ldw TF_IIOQT(%t3), %t2
mtctl %t1, %pcoq
mtctl %t2, %pcoq
ldw TF_CR15(%t3), %t1
ldw TF_CR22(%t3), %t2
mtctl %t1, %eiem
mtctl %t2, %ipsw
ldw TF_SR3(%t3), %t1
ldw TF_CR8(%t3), %t2
mtsp %t1, %sr3
mtctl %t2, %pidr1
ldw TF_R22(%t3), %t1
ldw TF_R21(%t3), %t2
ldw TF_R30(%t3), %sp
ldw TF_R20(%t3), %t3
rfi
nop
.exit
.procend
.size syscall_entry, .- syscall_entry
#define TLABEL(name) __CONCAT(trap_,name)
#define TRAPLABEL(name,num) __CONCAT(TLABEL(name),num)
#define TELABEL(num) __CONCAT(trap_ep_,num)
#define TRAP(name,num) \
mtctl %r1, %tr7 ! \
.call ! \
.import TLABEL(name), code ! \
b TLABEL(name) ! \
ldi num, %r1 ! \
.align 32
#define ATRAP(name,num) \
.export TRAPLABEL(name,num), entry ! \
.label TRAPLABEL(name,num) ! \
TRAP(all,num) ! \
.size TRAPLABEL(name,num), .-TRAPLABEL(name,num)
#define CTRAP(name,num,pre) \
.export TRAPLABEL(name,num), entry ! \
.label TRAPLABEL(name,num) ! \
pre ! \
TRAP(name,num) ! \
.size TRAPLABEL(name,num), .-TRAPLABEL(name,num)
#define STRAP(name,num,pre) \
.export TRAPLABEL(name,num), entry ! \
.label TRAPLABEL(name,num) ! \
pre ! \
mtctl %r1, %tr7 ! \
.export TELABEL(num), entry ! \
.label TELABEL(num) ! \
ldil 0,%r1 ! \
ldo 0(%r1), %r1 ! \
.call ! \
bv 0(%r1) ! \
ldi num, %r1 ! \
.align 32 ! \
.size TRAPLABEL(name,num), .-TRAPLABEL(name,num)
#define LDILDO(name) ! \
.export name, entry ! \
.label name ! \
ldil L%TLABEL(name),%r1 ! \
ldo R%TLABEL(name)(%r1), %r1
#ifdef HP7000_CPU
LDILDO(itlb_x)
LDILDO(itlbna_x)
LDILDO(dtlb_x)
LDILDO(dtlbna_x)
LDILDO(tlbd_x)
LDILDO(itlb_s)
LDILDO(itlbna_s)
LDILDO(dtlb_s)
LDILDO(dtlbna_s)
LDILDO(tlbd_s)
#endif
#if defined(HP7100_CPU) || defined(HP7200_CPU)
LDILDO(itlb_t)
LDILDO(itlbna_t)
LDILDO(dtlb_t)
LDILDO(dtlbna_t)
LDILDO(tlbd_t)
#endif
#if defined(HP7100LC_CPU) || defined(HP7300LC_CPU)
LDILDO(itlb_l)
LDILDO(itlbna_l)
LDILDO(dtlb_l)
LDILDO(dtlbna_l)
LDILDO(tlbd_l)
#endif
#if defined(HP8000_CPU) || defined(HP8200_CPU) || \
defined(HP8500_CPU) || defined(HP8600_CPU) || \
defined(HP8700_CPU)
LDILDO(itlb_u)
LDILDO(itlbna_u)
LDILDO(dtlb_u)
LDILDO(dtlbna_u)
LDILDO(tlbd_u)
#endif
#define ITLBPRE \
mfctl %pcoq,%r9 ! \
mfctl %pcsq,%r8
#define DTLBPRE \
mfctl %ior, %r9 ! \
mfctl %isr, %r8
#define HPMCPRE \
nop
.align NBPG
.export ivaaddr, entry
.export os_hpmc, entry
ivaaddr:
ATRAP(null,T_NONEXIST)
os_hpmc:
CTRAP(hpmc,T_HPMC,HPMCPRE)
ATRAP(power,T_POWERFAIL)
ATRAP(recnt,T_RECOVERY)
ATRAP(intr,T_INTERRUPT)
ATRAP(lpmc,T_LPMC)
STRAP(itlb,T_ITLBMISS,ITLBPRE)
ATRAP(iprot,T_IPROT)
ATRAP(ill,T_ILLEGAL)
CTRAP(ibrk,T_IBREAK,)
ATRAP(privop,T_PRIV_OP)
ATRAP(privr,T_PRIV_REG)
ATRAP(ovrfl,T_OVERFLOW)
ATRAP(cond,T_CONDITION)
ATRAP(excpt,T_EXCEPTION)
STRAP(dtlb,T_DTLBMISS,DTLBPRE)
STRAP(itlbna,T_ITLBMISSNA,DTLBPRE)
STRAP(dtlbna,T_DTLBMISSNA,DTLBPRE)
ATRAP(dprot,T_DPROT)
ATRAP(dbrk,T_DBREAK)
STRAP(tlbd,T_TLB_DIRTY,DTLBPRE)
ATRAP(pgref,T_PAGEREF)
CTRAP(emu,T_EMULATION,)
ATRAP(hpl,T_HIGHERPL)
ATRAP(lpl,T_LOWERPL)
ATRAP(tknbr,T_TAKENBR)
ATRAP(dacc,T_DATACC)
ATRAP(dpid,T_DATAPID)
ATRAP(dalgn,T_DATALIGN)
ATRAP(unk,29)
ATRAP(unk,30)
ATRAP(unk,31)
ATRAP(unk,32)
ATRAP(unk,33)
ATRAP(unk,34)
ATRAP(unk,35)
ATRAP(unk,36)
ATRAP(unk,37)
ATRAP(unk,38)
ATRAP(unk,39)
ATRAP(unk,40)
ATRAP(unk,41)
ATRAP(unk,42)
ATRAP(unk,43)
ATRAP(unk,44)
ATRAP(unk,45)
ATRAP(unk,46)
ATRAP(unk,47)
ATRAP(unk,48)
ATRAP(unk,49)
ATRAP(unk,50)
ATRAP(unk,51)
ATRAP(unk,52)
ATRAP(unk,53)
ATRAP(unk,54)
ATRAP(unk,55)
ATRAP(unk,56)
ATRAP(unk,57)
ATRAP(unk,58)
ATRAP(unk,59)
ATRAP(unk,60)
ATRAP(unk,61)
ATRAP(unk,62)
ATRAP(unk,63)
.size ivaaddr, .-ivaaddr
ENTRY_NOPROFILE(os_toc, 0)
addi,tr T_INTERRUPT, %r0, %arg0
EXIT(os_toc)
ENTRY_NOPROFILE(TLABEL(hpmc),0)
ALTENTRY(os_hpmc_cont)
ldi T_HPMC, %arg0
mtctl %r0, %eiem
ldi HPPA_PID_KERNEL, %r1
mtctl %r1, %pidr1
ldi HPPA_SID_KERNEL, %r1
mtsp %r1, %sr0
mtsp %r1, %sr1
mtsp %r1, %sr2
mtsp %r1, %sr3
mtsp %r1, %sr4
mtsp %r1, %sr5
mtsp %r1, %sr6
mtsp %r1, %sr7
ldil L%ivaaddr, %r1
ldo R%ivaaddr(%r1), %r1
mtctl %r1, %iva
ldil L%hppa_vtop, %r1
ldw R%hppa_vtop(%r1), %r1
mtctl %r1, CR_VTOP
GET_CURCPU(%t1)
ldw CI_PSW(%t1), %r1
depi 0, PSW_I_POS, 1, %r1
stw %r1, CI_PSW(%t1)
ldil L%$global$, %dp
ldo R%$global$(%dp), %dp
ldil L%emergency_stack_start, %sp
ldo R%emergency_stack_start(%sp), %sp
stwm %r0, HPPA_FRAME_SIZE(%sp)
copy %sp, %r3
stw %r0, HPPA_FRAME_CRP(%sp)
stw %r0, HPPA_FRAME_PSP(%sp)
copy %r3, %r1
copy %sp, %r3
stwm %r1, HPPA_FRAME_SIZE(%sp)
comib,<>,n T_INTERRUPT, %arg0, L$check_do_rfi
ldil L%kernelmapped, %r1
stw %r0, R%kernelmapped(%r1)
ldil L%hppa_btlb_reload, %r1
ldo R%hppa_btlb_reload(%r1), %r1
blr 0, %rp
bv %r0(%r1)
nop
ldil L%kernelmapped, %r1
stw %r1, R%kernelmapped(%r1)
ldi T_INTERRUPT, %arg0
rsm RESET_PSW, %r0
L$check_do_rfi:
GET_CURCPU(%r1)
ldw CI_PSW(%r1), %r1
mtctl %r1, %ipsw
ldil L%hppa_machine_check, %r1
ldo R%hppa_machine_check(%r1), %r1
mtctl %r1, %pcoq
ldo 4(%r1), %r1
mtctl %r1, %pcoq
ldi HPPA_SID_KERNEL, %r1
mtctl %r1, %pcsq
mtctl %r1, %pcsq
blr 0, %rp
rfi
nop
nop
nop
nop
nop
ALTENTRY(os_hpmc_checksum)
nop
ALTENTRY(os_hpmc_cont_end)
ALTENTRY(os_toc_checksum)
nop
ALTENTRY(os_toc_end)
EXIT(TLABEL(hpmc))
.export TLABEL(emu), entry
LEAF_ENTRY_NOPROFILE(TLABEL(emu))
mtctl %arg0, %tr2
mfctl %iir, %arg0
extru %arg0, 5, 6, %r1
comib,=,n 4, %r1, L$emulate_sfu
comib,=,n 0xe, %r1, hppa_fpu_emulate
extru %arg0, 25, 3, %r1
comib,<<,n 1, %r1, L$emulate_coproc
hppa_fpu_emulate:
mfctl CR_CCR, %arg0
extru,= %arg0, 25, 2, %r1
b,n L$emulate_fpu
mtctl %arg1, %tr4
mtctl %rp, %tr5
GET_CURCPU(%arg0)
ldw CI_FPU_STATE(%arg0), %arg0
mfctl CR_FPPADDR, %arg1
blr 0, %rp
b hppa_fpu_swap
nop
mfctl %tr5, %rp
mfctl %tr4, %arg1
mfctl %tr2, %arg0
mfctl %tr7, %r1
rfi
nop
L$emulate_sfu:
mfctl %tr2, %arg0
b TLABEL(all)
ldi T_ILLEGAL, %r1
L$emulate_coproc:
mfctl %tr2, %arg0
b TLABEL(all)
ldi T_ILLEGAL, %r1
L$emulate_fpu:
mfctl %tr2, %arg0
b TLABEL(all)
ldi T_EMULATION, %r1
EXIT(TLABEL(emu))
LEAF_ENTRY_NOPROFILE(hppa_fpu_swapout)
ldw PCB_FPREGS(%arg0), %arg0
copy %r0, %arg1
ALTENTRY(hppa_fpu_swap)
mfctl CR_CCR, %r1
depi 3, 25, 2, %r1
comb,= %r0, %arg0, L$fpu_swap_in
mtctl %r1, CR_CCR
fstds,ma %fr0 , 8(%arg0)
fstds,ma %fr1 , 8(%arg0)
fstds,ma %fr2 , 8(%arg0)
fstds,ma %fr3 , 8(%arg0)
fstds,ma %fr4 , 8(%arg0)
fstds,ma %fr5 , 8(%arg0)
fstds,ma %fr6 , 8(%arg0)
fstds,ma %fr7 , 8(%arg0)
fstds,ma %fr8 , 8(%arg0)
fstds,ma %fr9 , 8(%arg0)
fstds,ma %fr10, 8(%arg0)
fstds,ma %fr11, 8(%arg0)
fstds,ma %fr12, 8(%arg0)
fstds,ma %fr13, 8(%arg0)
fstds,ma %fr14, 8(%arg0)
fstds,ma %fr15, 8(%arg0)
fstds,ma %fr16, 8(%arg0)
fstds,ma %fr17, 8(%arg0)
fstds,ma %fr18, 8(%arg0)
fstds,ma %fr19, 8(%arg0)
fstds,ma %fr20, 8(%arg0)
fstds,ma %fr21, 8(%arg0)
fstds,ma %fr22, 8(%arg0)
fstds,ma %fr23, 8(%arg0)
fstds,ma %fr24, 8(%arg0)
fstds,ma %fr25, 8(%arg0)
fstds,ma %fr26, 8(%arg0)
fstds,ma %fr27, 8(%arg0)
fstds,ma %fr28, 8(%arg0)
fstds,ma %fr29, 8(%arg0)
fstds,ma %fr30, 8(%arg0)
fstds %fr31, 0(%arg0)
L$fpu_swap_in:
GET_CURCPU(%r1)
comb,= %r0, %arg1, L$fpu_no_swap_in
stw %arg1, CI_FPU_STATE(%r1)
ldo 31*8(%arg1), %arg1
fldds,ma -8(%arg1), %fr31
fldds,ma -8(%arg1), %fr30
fldds,ma -8(%arg1), %fr29
fldds,ma -8(%arg1), %fr28
fldds,ma -8(%arg1), %fr27
fldds,ma -8(%arg1), %fr26
fldds,ma -8(%arg1), %fr25
fldds,ma -8(%arg1), %fr24
fldds,ma -8(%arg1), %fr23
fldds,ma -8(%arg1), %fr22
fldds,ma -8(%arg1), %fr21
fldds,ma -8(%arg1), %fr20
fldds,ma -8(%arg1), %fr19
fldds,ma -8(%arg1), %fr18
fldds,ma -8(%arg1), %fr17
fldds,ma -8(%arg1), %fr16
fldds,ma -8(%arg1), %fr15
fldds,ma -8(%arg1), %fr14
fldds,ma -8(%arg1), %fr13
fldds,ma -8(%arg1), %fr12
fldds,ma -8(%arg1), %fr11
fldds,ma -8(%arg1), %fr10
fldds,ma -8(%arg1), %fr9
fldds,ma -8(%arg1), %fr8
fldds,ma -8(%arg1), %fr7
fldds,ma -8(%arg1), %fr6
fldds,ma -8(%arg1), %fr5
fldds,ma -8(%arg1), %fr4
fldds,ma -8(%arg1), %fr3
fldds,ma -8(%arg1), %fr2
fldds,ma -8(%arg1), %fr1
fldds 0(%arg1), %fr0
L$fpu_swap_done:
ldil L%fpu_csw, %r1
ldw R%fpu_csw(%r1), %arg0
ldo 1(%arg0), %arg0
bv %r0(%rp)
stw %arg0, R%fpu_csw(%r1)
L$fpu_no_swap_in:
mfctl CR_CCR, %r1
depi 0, 25, 2, %r1
b L$fpu_swap_done
mtctl %r1, CR_CCR
EXIT(hppa_fpu_swapout)
#define VTAG(sp,off,t) \
shd %r0, off, 1, t ! \
dep sp, 31, 16, t ! \
depi 1, 0, 1, t
#if 0
BSS(dtlb_c, 8)
BSS(tlbd_c, 8)
BSS(itlb_c, 8)
#define TLB_STATS_PRE(t) \
mfctl CR_ITMR, %r17 ! \
mtctl %r17, %tr5
#define TLB_STATS_AFT(t) \
mfctl CR_ITMR, %r16 ! \
mfctl %tr5, %r17 ! \
ldil L%__CONCAT(t,_c), %r25 ! \
ldo R%__CONCAT(t,_c)(%r25), %r25 ! \
sub %r16, %r17, %r16 ! \
ldw 0(%r25), %r24 ! \
ldw 4(%r25), %r17 ! \
ldo 1(%r24), %r24 ! \
ldo -2(%r16), %r16 ! \
add %r16, %r17, %r17 ! \
stw %r24, 0(%r25) ! \
stw %r17, 4(%r25)
#else
#define TLB_STATS_PRE(t)
#define TLB_STATS_AFT(t)
#endif
#define TLB_PULL(bits,lbl) ! \
! \
mfctl CR_VTOP, %r16 ! \
ldwax,s %r8(%r16), %r17 ! \
extru %r9, 9, 10, %r25 ! \
combt,=,n %r0, %r17, lbl ! \
ldwax,s %r25(%r17), %r24 ! \
extru %r9, 19, 10, %r16 ! \
combt,=,n %r0, %r24, lbl ! \
ldwax,s %r16(%r24), %r17 ! \
sh2addl %r16, %r24, %r25 ! \
combt,=,n %r0, %r17, lbl ! \
copy %r17, %r16 ! \
depi (bits), 21+bits, 1+bits, %r17 ! \
sub,= %r16, %r17, %r0 ! \
stwas %r17, 0(%r25) ! \
shd %r17, %r0, 13, %r25 ! \
dep %r8, 30, 15, %r25 ! \
dep %r0, 31, 12, %r17 ! \
addi 2, %r25, %r25 ! \
extru %r17, 24, 25, %r17
#define TLB_PULL_L(bits,lbl) ! \
! \
mfctl CR_VTOP, %r16 ! \
ldwx,s %r8(%r16), %r17 ! \
extru %r9, 9, 10, %r25 ! \
combt,=,n %r0, %r17, lbl ! \
ldwx,s %r25(%r17), %r24 ! \
extru %r9, 19, 10, %r16 ! \
combt,=,n %r0, %r24, lbl ! \
ldwx,s %r16(%r24), %r17 ! \
sh2addl %r16, %r24, %r25 ! \
combt,=,n %r0, %r17, lbl ! \
copy %r17, %r16 ! \
depi (bits), 21+bits, 1+bits, %r17 ! \
sub,= %r16, %r17, %r0 ! \
stws %r17, 0(%r25) ! \
shd %r17, %r0, 13, %r25 ! \
dep %r8, 30, 15, %r25 ! \
dep %r0, 31, 12, %r17 ! \
addi 2, %r25, %r25 ! \
extru %r17, 24, 25, %r17 ! \
sync
#if defined(HP7000_CPU) || defined(HP7100_CPU) || defined(HP7200_CPU)
.align 32
LEAF_ENTRY_NOPROFILE(TLABEL(tlbd_s))
ALTENTRY(TLABEL(tlbd_t))
ALTENTRY(TLABEL(tlbd_x))
TLB_STATS_PRE(tlbd)
TLB_PULL(1, TLABEL(all))
mfsp %sr1, %r16
mtsp %r8, %sr1
idtlba %r17,(%sr1, %r9)
idtlbp %r25,(%sr1, %r9)
mtsp %r16, %sr1
TLB_STATS_AFT(tlbd)
rfir
nop
EXIT(TLABEL(tlbd_s))
LEAF_ENTRY_NOPROFILE(TLABEL(itlb_s))
ALTENTRY(TLABEL(itlb_t))
ALTENTRY(TLABEL(itlb_x))
TLB_STATS_PRE(itlb)
TLB_PULL(0, TLABEL(all))
extru,= %r25, 5, 1, %r0
depi 0, 30, 15, %r25
mfsp %sr1, %r16
mtsp %r8, %sr1
iitlba %r17,(%sr1, %r9)
iitlbp %r25,(%sr1, %r9)
mtsp %r16, %sr1
TLB_STATS_AFT(itlb)
rfir
nop
EXIT(TLABEL(itlb_s))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlb_s))
ALTENTRY(TLABEL(dtlb_t))
ALTENTRY(TLABEL(dtlb_x))
TLB_STATS_PRE(dtlb)
TLB_PULL(0, TLABEL(all))
mfsp %sr1, %r16
mtsp %r8, %sr1
idtlba %r17,(%sr1, %r9)
idtlbp %r25,(%sr1, %r9)
mtsp %r16, %sr1
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlb_s))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlbna_s))
ALTENTRY(TLABEL(itlbna_s))
ALTENTRY(TLABEL(dtlbna_t))
ALTENTRY(TLABEL(itlbna_t))
ALTENTRY(TLABEL(dtlbna_x))
ALTENTRY(TLABEL(itlbna_x))
TLB_STATS_PRE(dtlb)
TLB_PULL(0, L$dtlbna_t_fake)
mfsp %sr1, %r16
mtsp %r8, %sr1
idtlba %r17,(%sr1, %r9)
idtlbp %r25,(%sr1, %r9)
mtsp %r16, %sr1
TLB_STATS_AFT(dtlb)
rfir
nop
L$dtlbna_s_fake:
L$dtlbna_t_fake:
mfctl %iir, %r16
extru %r16, 6, 6, %r24
comib,=,n 1, %r24, TLABEL(all)
extru %r16, 24, 6, %r24
subi,<> 0x23, %r24, %r0
b TLABEL(all)
copy %r0, %r17
zdep %r8, 30, 15, %r25
depi -13, 11, 7, %r25
ldo 2(%r25), %r25
mfsp %sr1, %r16
mtsp %r8, %sr1
idtlba %r17,(%sr1, %r9)
idtlbp %r25,(%sr1, %r9)
mtsp %r16, %sr1
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlbna_s))
#endif
#if defined(HP7100LC_CPU) || defined(HP7300LC_CPU)
#define IITLBAF(r) .word 0x04000440 | ((r) << 16)
#define IITLBPF(r) .word 0x04000400 | ((r) << 16)
#define IDTLBAF(r) .word 0x04001440 | ((r) << 16)
#define IDTLBPF(r) .word 0x04001400 | ((r) << 16)
.align 32
LEAF_ENTRY_NOPROFILE(TLABEL(tlbd_l))
TLB_STATS_PRE(tlbd)
TLB_PULL_L(1, TLABEL(all))
IDTLBAF(17)
IDTLBPF(25)
#ifdef USE_HPT
mfctl %cr28, %r17
ldw 0(%r17), %r24
VTAG(%r8, %r9, %r16)
sub,<> %r16, %r24, %r0
stw %r0, 0(%r17)
#endif
TLB_STATS_AFT(tlbd)
rfir
nop
EXIT(TLABEL(tlbd_l))
LEAF_ENTRY_NOPROFILE(TLABEL(itlb_l))
TLB_STATS_PRE(itlb)
TLB_PULL_L(0, TLABEL(all))
extru,= %r25, 5, 1, %r0
depi 0, 30, 15, %r25
IITLBAF(17)
IITLBPF(25)
TLB_STATS_AFT(itlb)
rfir
nop
EXIT(TLABEL(itlb_l))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlbna_l))
ALTENTRY(TLABEL(itlbna_l))
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, L$dtlbna_l_fake)
IDTLBAF(17)
IDTLBPF(25)
TLB_STATS_AFT(dtlb)
rfir
nop
L$dtlbna_l_fake:
mfctl %iir, %r16
extru %r16, 6, 6, %r24
comib,=,n 1, %r24, TLABEL(all)
extru %r16, 24, 6, %r24
subi,<> 0x23, %r24, %r0
b TLABEL(all)
copy %r0, %r17
zdep %r8, 30, 15, %r25
depi -13, 11, 7, %r25
ldo 2(%r25), %r25
IDTLBAF(17)
IDTLBPF(25)
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlbna_l))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlb_l))
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, TLABEL(all))
IDTLBAF(17)
IDTLBPF(25)
#ifdef USE_HPT
ldo PAGE_SIZE(%r9), %r9
extru,<> %r9, 20, 5, %r0
b,n L$dtlb_done_l
extru %r9, 19, 10, %r16
ldwx,s %r16(%r24), %r17
sh2addl %r16, %r24, %r25
combt,=,n %r0, %r17, L$dtlb_done_l
copy %r17, %r16
depi 0, 21, 1, %r17
sub,= %r16, %r17, %r0
stws %r17, 0(%r25)
shd %r17, %r0, 13, %r25
dep %r8, 30, 15, %r25
dep %r0, 31, 12, %r17
addi 2, %r25, %r25
extru %r17, 24, 25, %r17
sync
mfctl %cr28, %r24
VTAG(%r8, %r9, %r16)
ldo 16(%r24), %r24
stw %r16, 0(%r24)
stw %r25, 4(%r24)
stw %r17, 8(%r24)
L$dtlb_done_l:
#endif
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlb_l))
#endif
#if defined(HP8000_CPU) || defined(HP8200_CPU) || \
defined(HP8500_CPU) || defined(HP8600_CPU) || \
defined(HP8700_CPU)
.level 2.0w
#define TLB_PCX2PCXU \
extrw,u %r25, 14, 13, %r16 ! \
depdi 0, 31, 32, %r17 ! \
! \
extrd,s %r17, 42, 4, %r1 ! \
addi,<> 1, %r1, %r0 ! \
depdi -1, 38, 32, %r17 ! \
! \
extrd,s %r17, 46, 8, %r1 ! \
addi,<> 0x10, %r1, %r0 ! \
depdi 0, 38, 4, %r17 ! \
! \
depwi 1, 31, 2, %r16 ! \
depdi 0, 44, 30, %r25 ! \
depd %r16, 14, 15, %r25
LEAF_ENTRY_NOPROFILE(TLABEL(tlbd_u))
TLB_STATS_PRE(tlbd)
TLB_PULL_L(1, TLABEL(all))
TLB_PCX2PCXU
idtlbt %r17, %r25
TLB_STATS_AFT(tlbd)
rfir
nop
EXIT(TLABEL(tlbd_u))
LEAF_ENTRY_NOPROFILE(TLABEL(itlb_u))
TLB_STATS_PRE(itlb)
TLB_PULL_L(0, TLABEL(all))
extru,= %r25, 5, 1, %r0
depi 0, 30, 15, %r25
TLB_PCX2PCXU
iitlbt %r17, %r25
TLB_STATS_AFT(itlb)
rfir
nop
EXIT(TLABEL(itlb_u))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlbna_u))
ALTENTRY(TLABEL(itlbna_u))
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, L$dtlbna_u_fake)
TLB_PCX2PCXU
idtlbt %r17, %r25
TLB_STATS_AFT(dtlb)
rfir
nop
L$dtlbna_u_fake:
mfctl %iir, %r16
extru %r16, 6, 6, %r24
comib,=,n 1, %r24, TLABEL(all)
extru %r16, 24, 6, %r24
subi,<> 0x23, %r24, %r0
b TLABEL(all)
copy %r0, %r17
zdep %r8, 30, 15, %r25
depi -13, 11, 7, %r25
ldo 2(%r25), %r25
idtlbt %r17, %r25
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlbna_u))
LEAF_ENTRY_NOPROFILE(TLABEL(dtlb_u))
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, TLABEL(all))
TLB_PCX2PCXU
idtlbt %r17, %r25
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT(TLABEL(dtlb_u))
.level 1.1
#endif
#if defined(HP7000_CPU)
LEAF_ENTRY_NOPROFILE(desidhash_s)
ALTENTRY(desidhash_x)
sync
MFCPU_T(DR_CPUCFG,22)
MFCPU_T(DR_CPUCFG,22)
nop
nop
depi 0, DR0_PCXS_DHE, 3, %t1
depi 1, DR0_PCXS_EQWSTO, 1, %t1
depi 0, DR0_PCXS_DHPMC, 1, %t1
depi 0, DR0_PCXS_ILPMC, 1, %t1
sync
MTCPU_T(22,DR_CPUCFG)
MTCPU_T(22,DR_CPUCFG)
nop
nop
bv 0(%rp)
extru %t1, 4, 5, %ret0
EXIT(desidhash_s)
#endif
#if defined(HP7100_CPU) || defined(HP7200_CPU)
LEAF_ENTRY_NOPROFILE(desidhash_t)
sync
MFCPU_T(DR_CPUCFG,22)
MFCPU_T(DR_CPUCFG,22)
nop
nop
depi 0, DR0_PCXT_IHE, 1, %t1
depi 0, DR0_PCXT_DHE, 1, %t1
depi 0, DR0_PCXT_DHPMC, 1, %t1
depi 0, DR0_PCXT_ILPMC, 1, %t1
sync
MTCPU_T(22,DR_CPUCFG)
MTCPU_T(22,DR_CPUCFG)
nop
nop
bv 0(%rp)
extru %t1, 4, 5, %ret0
EXIT(desidhash_t)
#endif
#if defined(HP7100LC_CPU) || defined(HP7300LC_CPU)
LEAF_ENTRY_NOPROFILE(ibtlb_l)
rsm (PSW_R|PSW_I), %t4
nop ! nop ! nop ! nop ! nop ! nop ! nop
bv 0(%rp)
mtsm %t4
EXIT(ibtlb_l)
LEAF_ENTRY_NOPROFILE(hpti_l)
ldo -1(%arg1), %arg1
depi 0, 31, 12, %arg1
ldi 0x1c0, %t1
or %arg0, %t1, %arg0
sync
MTCPU_C(26,DR0_PCXL2_HTLB_ADDR)
MTCPU_C(25,DR0_PCXL2_HTLB_CFG)
nop
nop
bv,n %r0(%rp)
nop
EXIT(hpti_l)
LEAF_ENTRY_NOPROFILE(pbtlb_l)
; DR_PAGE0
rsm (PSW_R|PSW_I), %t4
nop ! nop ! nop ! nop
ldil L%0xc041, %t1
ldo R%0xc041(%t1), %t1
dep %arg0, 30, 3, %t1
sync
MTCPU_T(22,DR_DTLB)
nop
nop
mtsp %r0, %sr1
idtlba %r0,(%sr1,%r0)
idtlbp %r0,(%sr1,%r0)
zdepi -1, 18, 1, %t1
nop
sync
MTCPU_T(22,DR_DTLB)
nop
nop
bv 0(%rp)
mtsm %t4
EXIT(pbtlb_l)
LEAF_ENTRY_NOPROFILE(desidhash_l)
MFCPU_C(DR_CPUCFG,22)
nop
nop
depi 0, DR0_PCXL_L2IHASH_EN, 2, %t1
depi 0, DR0_PCXL_L2IHPMC, 1, %t1
depi 0, DR0_PCXL_L2DHPMC, 1, %t1
depi 0, DR0_PCXL_L1IHPMC, 1, %t1
depi 0, DR0_PCXL_L2PARERR,1, %t1
sync
MTCPU_C(22,DR_CPUCFG)
nop
nop
bv 0(%rp)
extru %t1, 4, 5, %ret0
EXIT(desidhash_l)
#endif
#if defined(HP8000_CPU) || defined(HP8200_CPU) || \
defined(HP8500_CPU) || defined(HP8600_CPU) || \
defined(HP8700_CPU)
.level 2.0w
LEAF_ENTRY_NOPROFILE(desidhash_u)
MFCPU_U(2,28)
depdi 0, 54, 1, %r28
MTCPU_U(28,2)
bv %r0(%rp)
copy %r0, %ret0
EXIT(desidhash_u)
LEAF_ENTRY_NOPROFILE(ibtlb_u)
bv 0(%rp)
nop
EXIT(ibtlb_u)
LEAF_ENTRY_NOPROFILE(pbtlb_u)
bv 0(%rp)
nop
EXIT(pbtlb_u)
.level 1.1
#endif
.align 64
.export TLABEL(all), entry
ENTRY_NOPROFILE(TLABEL(all),0)
mtctl %t3, %tr2
GET_CURCPU(%t3)
stw %t1, CI_TRAPSAVE + TF_R22(%t3)
stw %t2, CI_TRAPSAVE + TF_R21(%t3)
mfctl %tr2, %t1
stw %sp, CI_TRAPSAVE + TF_R30(%t3)
stw %t1, CI_TRAPSAVE + TF_R20(%t3)
mfctl %eiem, %t1
mfctl %ipsw, %t2
stw %t1, CI_TRAPSAVE + TF_CR15(%t3)
stw %t2, CI_TRAPSAVE + TF_CR22(%t3)
mfsp %sr3, %t1
mfctl %pidr1, %t2
stw %t1, CI_TRAPSAVE + TF_SR3(%t3)
stw %t2, CI_TRAPSAVE + TF_CR8(%t3)
ldi HPPA_PID_KERNEL,%t1
mtctl %t1, %pidr1
mtsp %r0, %sr3
GET_CURCPU(%t1)
ldw CI_PSW(%t1), %t2
mtctl %r0, %eiem
mtctl %t2, %ipsw
mfctl %pcsq, %t1
mtctl %r0, %pcsq
mfctl %pcsq, %t2
stw %t1, CI_TRAPSAVE + TF_IISQH(%t3)
stw %t2, CI_TRAPSAVE + TF_IISQT(%t3)
mtctl %r0, %pcsq
mfctl %pcoq, %t1
ldil L%SYSCALLGATE, %t2
ldo HPPA_FRAME_SIZE-1(%sp), %sp
dep %t1, 31, PGSHIFT, %t2
dep,<> %t1, 31, 2, %r0
comb,<> %t1, %t2, L$trap_from_kernel
dep %r0, 31, 6, %sp
GET_CURLWP(%t2)
depi 1, T_USER_POS, 1, %r1
depi 1, TFF_LAST_POS, 1, %r1
ldw L_PCB(%t2), %sp
#ifdef DIAGNOSTIC
b L$trap_have_stack
#endif
ldo NBPG(%sp), %sp
L$trap_from_kernel:
#ifdef DIAGNOSTIC
mtctl %t1, %tr2
ldw CI_TRAPSAVE + TF_R30(%t3), %t1
mfctl %ior, %t2
dep %r0, 31, PGSHIFT, %t1
dep %r0, 31, PGSHIFT, %t2
comb,=,n %t1, %t2, 0
ldo NBPG(%t1), %t1
comb,<> %t1, %t2, L$trap_have_stack
mfctl %tr2, %t1
mfctl %isr, %t2
comib,<>,n HPPA_SID_KERNEL, %t2, L$trap_have_stack
#define _CHECK_TRAP_TYPE(tt) ldi tt, %t2 ! comb,= %r1, %t2, L$trap_kstack_fault
_CHECK_TRAP_TYPE(T_ITLBMISS)
_CHECK_TRAP_TYPE(T_DTLBMISS)
_CHECK_TRAP_TYPE(T_ITLBMISSNA)
_CHECK_TRAP_TYPE(T_DTLBMISSNA)
_CHECK_TRAP_TYPE(T_DPROT)
_CHECK_TRAP_TYPE(T_DATACC)
_CHECK_TRAP_TYPE(T_DATAPID)
ldi T_DATALIGN, %t2
comb,<>,n %r1, %t2, L$trap_have_stack
#undef _CHECK_TRAP_TYPE
L$trap_kstack_fault:
ldil L%emergency_stack_start, %sp
ldo R%emergency_stack_start(%sp), %sp
L$trap_have_stack:
#endif
ldil L%trapnowvirt, %t2
ldo R%trapnowvirt(%t2), %t2
mtctl %t2, %pcoq
stw %t1, CI_TRAPSAVE + TF_IIOQH(%t3)
ldo 4(%t2), %t2
mfctl %pcoq, %t1
stw %t1, CI_TRAPSAVE + TF_IIOQT(%t3)
mtctl %t2, %pcoq
mfctl %isr, %t1
mfctl %ior, %t2
stw %t1, CI_TRAPSAVE + TF_CR20(%t3)
stw %t2, CI_TRAPSAVE + TF_CR21(%t3)
mfctl %iir, %t2
stw %t2, CI_TRAPSAVE + TF_CR19(%t3)
stw %r1, CI_TRAPSAVE + TF_FLAGS(%t3)
mfctl CR_RCTR, %t1
copy %sp, %t3
ldo HPPA_FRAME_SIZE+TRAPFRAME_SIZEOF(%sp), %sp
#if defined(DDB) || defined(KGDB)
ldo HPPA_FRAME_MAXARGS+HPPA_FRAME_SIZE-1(%sp),%sp
depi 0, 31, 6, %sp
#endif
rfir
nop ! nop ! nop ! nop ! nop ! nop ! nop ! nop
trapnowvirt:
mfctl CR_CCR, %t2
stw %t1, TF_CR0(%sr3, %t3)
stw %t2, TF_CR10(%sr3, %t3)
mfsp %sr0, %t1
mfsp %sr1, %t2
stw %t1, TF_SR0(%sr3, %t3)
stw %t2, TF_SR1(%sr3, %t3)
mfsp %sr2, %t1
mfsp %sr4, %t2
stw %t1, TF_SR2(%sr3, %t3)
stw %t2, TF_SR4(%sr3, %t3)
mfsp %sr5, %t2
mfsp %sr6, %t1
stw %t2, TF_SR5(%sr3, %t3)
stw %t1, TF_SR6(%sr3, %t3)
mfsp %sr7, %t1
mfctl %pidr2, %t2
stw %t1, TF_SR7(%sr3, %t3)
stw %t2, TF_CR9(%sr3, %t3)
mtsp %r0, %sr0
mtsp %r0, %sr1
mtsp %r0, %sr2
mtsp %r0, %sr4
mtsp %r0, %sr5
mtsp %r0, %sr6
mtsp %r0, %sr7
#if pbably_not_worth_it
mfctl %pidr3, %t1
mfctl %pidr4, %t2
stw %t1, TF_CR12(%t3)
stw %t2, TF_CR13(%t3)
#endif
#if defined(DDB) || defined(KGDB)
stw %rp, HPPA_FRAME_CRP(%sp)
stw %r0, -HPPA_FRAME_SIZE(%sp)
#endif
stw %t3, -HPPA_FRAME_SIZE+4(%sp)
mfctl %sar, %t1
stw %t1, TF_CR11(%t3)
stw %r1, TF_R1(%t3)
stw %r2, TF_R2(%t3)
stw %r3, TF_R3(%t3)
GET_CURCPU(%t2)
ldo CI_TRAPSAVE(%t2), %t2
ldw 0(%t2), %r1 ! ldw 4(%t2), %t1 ! stw %r1, 0(%t3) ! stw %t1, 4(%t3)
ldw 8(%t2), %r1 ! ldw 12(%t2), %t1 ! stw %r1, 8(%t3) ! stw %t1, 12(%t3)
ldw 16(%t2), %r1 ! ldw 20(%t2), %t1 ! stw %r1, 16(%t3) ! stw %t1, 20(%t3)
ldw 24(%t2), %r1 ! ldw 28(%t2), %t1 ! stw %r1, 24(%t3) ! stw %t1, 28(%t3)
ldw 32(%t2), %r1 ! ldw 36(%t2), %t1 ! stw %r1, 32(%t3) ! stw %t1, 36(%t3)
ldw 40(%t2), %r1 ! ldw 44(%t2), %t1 ! stw %r1, 40(%t3) ! stw %t1, 44(%t3)
ldw 48(%t2), %r1 ! ldw 52(%t2), %t1 ! stw %r1, 48(%t3) ! stw %t1, 52(%t3)
ldw 56(%t2), %r1 ! ldw 60(%t2), %t1 ! stw %r1, 56(%t3) ! stw %t1, 60(%t3)
stw %r4, TF_R4(%t3)
stw %r5, TF_R5(%t3)
stw %r6, TF_R6(%t3)
stw %r7, TF_R7(%t3)
stw %r8, TF_R8(%t3)
stw %r9, TF_R9(%t3)
stw %r10, TF_R10(%t3)
stw %r11, TF_R11(%t3)
stw %r12, TF_R12(%t3)
stw %r13, TF_R13(%t3)
stw %r14, TF_R14(%t3)
stw %r15, TF_R15(%t3)
stw %r16, TF_R16(%t3)
stw %r17, TF_R17(%t3)
stw %r18, TF_R18(%t3)
stw %t4, TF_R19(%t3)
stw %r23,TF_R23(%t3)
stw %r24,TF_R24(%t3)
stw %r25,TF_R25(%t3)
stw %r26,TF_R26(%t3)
stw %r27,TF_R27(%t3)
stw %r28,TF_R28(%t3)
stw %r29,TF_R29(%t3)
stw %r31,TF_R31(%t3)
#if defined(DDB) || defined(KGDB)
mfctl %eirr, %t1
mfctl CR_VTOP, %t2
stw %t1, TF_CR23(%t3)
stw %t2, TF_CR25(%t3)
mfctl %cr24, %t1
mfctl %cr28, %t2
stw %t1, TF_CR24(%t3)
stw %t2, TF_CR28(%t3)
#endif
mfctl CR_TLS, %t1
mfctl CR_FPPADDR, %t2
stw %t1, TF_CR27(%t3)
stw %t2, TF_CR30(%t3)
ldil L%$global$, %dp
ldo R%$global$(%dp), %dp
ldw TF_FLAGS(%t3), %arg0
dep %r0, 24, 25, %arg0
copy %t3, %arg1
#if defined(DDB) || defined(KGDB)
copy %r0, %r3
#endif
.import trap, code
CALL(trap, %t1)
ldw -HPPA_FRAME_SIZE+4(%sp), %t3
ldw TF_FLAGS(%t3), %arg0
bb,>=,n %arg0, TFF_LAST_POS, L$trap_return
nop
GET_CURLWP(%t2)
ldw L_MD(%t2), %t3
L$trap_return:
ldil L%syscall_return, %t1
ldo R%syscall_return(%t1), %t1
bv,n %r0(%t1)
nop
EXIT(TLABEL(all))
.align 32
ENTRY_NOPROFILE(TLABEL(ibrk),0)
mfctl %pcoq, %r8
extru,= %r8, 31, 2, %r0
b,n L$ibrk_bad
.import etext
ldil L%etext, %r9
ldo R%etext(%r9), %r9
comb,>>=,n %r8, %r9, L$ibrk_bad
mfctl %iir, %r8
extru %r8, 31, 5, %r9
comib,<>,n HPPA_BREAK_KERNEL, %r9, L$ibrk_bad
extru %r8, 18, 13, %r9
comib,=,n HPPA_BREAK_GET_PSW, %r9, L$ibrk_getpsw
comib,=,n HPPA_BREAK_SET_PSW, %r9, L$ibrk_setpsw
L$ibrk_bad:
b TLABEL(all)
nop
L$ibrk_getpsw:
b L$ibrk_exit
mfctl %ipsw, %ret0
L$ibrk_setpsw:
mfctl %ipsw, %ret0
b L$ibrk_exit
mtctl %arg0, %ipsw
nop ! nop
L$ibrk_exit:
mtctl %r0, %pcoq
mfctl %pcoq, %r9
mtctl %r9, %pcoq
ldo 4(%r9), %r9
mtctl %r9, %pcoq
rfir
nop
EXIT(TLABEL(ibrk))