#include <sys/reboot.h>
#include <machine/param.h>
#include <machine/asm.h>
#include <machine/psl.h>
#include <machine/trap.h>
#include <machine/iomod.h>
#include <machine/pdc.h>
#include <machine/frame.h>
#include <machine/reg.h>
#include "assym.h"
#define MFCPU_C_PCXST(r,x) .word 0x14001a00 | ((r) << 21) | ((x) << 16)
#define MTCPU_PCXST(x,r) .word 0x14001600 | ((r) << 21) | ((x) << 16)
#define MFCPU_C_PCXL(r,x) .word 0x14000600 | ((r) << 21) | ((x) << 16)
#define MFCPU_T_PCXL(r,x) .word 0x14001800 | ((r) << 21) | ((x))
#define MTCPU_PCXL(x,r) .word 0x14000240 | ((r) << 21) | ((x) << 16)
#define DR_PAGE0_PCXL .word 0x14000e00
#define DR_PAGE1_PCXL .word 0x14000e40
#define MFCPU_PCXU(r,x) .word 0x140008a0 | ((r) << 21) | ((x))
#define MTCPU_PCXU(x,r) .word 0x14001840 | ((r) << 21) | ((x) << 16)
.import $global$, data
.import pdc, data
.import cpu_info, data
.import panic, code
LEAF_ENTRY($kernel_setup)
rsm RESET_PSL, r0
nop ! nop ! nop ! nop ! nop ! nop
ldi HPPA_PID_KERNEL, r1
mtctl r1, pidr1
mtctl r1, pidr2
#if pbably_not_worth_it
mtctl r0, pidr3
mtctl r0, pidr4
#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
ldi -1, r1
mtctl r0, eiem
mtctl r1, eirr
ldil L%$ivaaddr, t2
ldo R%$ivaaddr(t2), t2
mtctl t2, iva
ldil L%$global$,dp
ldo R%$global$(dp),dp
copy arg1, sp
ldo 0(arg1), r3
stw,ma r0, HPPA_FRAME_SIZE(sp)
stw r0, HPPA_FRAME_CRP(sp)
stw r0, HPPA_FRAME_PSP(sp)
mtctl r0, pcsq
mtctl r0, pcsq
mtctl rp, pcoq
ldo 4(rp), rp
mtctl rp, pcoq
mtctl arg2, ipsw
rfi
nop
nop
EXIT($kernel_setup)
ENTRY(pdc_call,160)
mfctl eiem, t1
mtctl r0, eiem
stw rp, HPPA_FRAME_CRP(sp)
copy arg0, r31
copy sp, ret1
ldil L%kernelmapped, ret0
ldw R%kernelmapped(ret0), ret0
comb,= r0, ret0, pdc_call_unmapped1
nop
ldil L%pdc_stack, ret1
ldw R%pdc_stack(ret1), ret1
pdc_call_unmapped1
copy sp, r1
ldo HPPA_FRAME_SIZE+24*4(ret1), sp
stw r1, HPPA_FRAME_PSP(sp)
stw ret0, HPPA_FRAME_ARG(21)(sp)
stw t1, HPPA_FRAME_ARG(22)(sp)
copy arg2, arg0
copy arg3, arg1
ldw HPPA_FRAME_ARG(4)(r1), arg2
ldw HPPA_FRAME_ARG(5)(r1), arg3
ldw HPPA_FRAME_ARG(6)(r1), t1
ldw HPPA_FRAME_ARG(7)(r1), t2
ldw HPPA_FRAME_ARG(8)(r1), t3
ldw HPPA_FRAME_ARG(9)(r1), t4
stw t1, HPPA_FRAME_ARG(4)(sp)
stw t2, HPPA_FRAME_ARG(5)(sp)
stw t3, HPPA_FRAME_ARG(6)(sp)
stw t4, HPPA_FRAME_ARG(7)(sp)
ldw HPPA_FRAME_ARG(10)(r1), t1
ldw HPPA_FRAME_ARG(11)(r1), t2
ldw HPPA_FRAME_ARG(12)(r1), t3
ldw HPPA_FRAME_ARG(13)(r1), t4
stw t1, HPPA_FRAME_ARG(8)(sp)
stw t2, HPPA_FRAME_ARG(9)(sp)
stw t3, HPPA_FRAME_ARG(10)(sp)
stw t4, HPPA_FRAME_ARG(11)(sp)
mfctl cr24, t1
mfctl cr25, t2
mfctl cr26, t3
mfctl cr27, t4
stw t1, HPPA_FRAME_ARG(12)(sp)
stw t2, HPPA_FRAME_ARG(13)(sp)
stw t3, HPPA_FRAME_ARG(14)(sp)
stw t4, HPPA_FRAME_ARG(15)(sp)
mfctl cr28, t1
mfctl cr29, t2
mfctl cr30, t3
mfctl cr31, t4
stw t1, HPPA_FRAME_ARG(16)(sp)
stw t2, HPPA_FRAME_ARG(17)(sp)
stw t3, HPPA_FRAME_ARG(18)(sp)
stw t4, HPPA_FRAME_ARG(19)(sp)
comb,= r0, ret0, pdc_call_unmapped2
nop
copy arg0, t4
ldi PSL_Q, arg0
break HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
stw ret0, HPPA_FRAME_ARG(23)(sp)
copy t4, arg0
pdc_call_unmapped2
.call
blr r0, rp
bv,n (r31)
nop
ldw HPPA_FRAME_ARG(12)(sp), t1
ldw HPPA_FRAME_ARG(13)(sp), t2
ldw HPPA_FRAME_ARG(14)(sp), t3
ldw HPPA_FRAME_ARG(15)(sp), t4
mtctl t1, cr24
mtctl t2, cr25
mtctl t3, cr26
mtctl t4, cr27
ldw HPPA_FRAME_ARG(16)(sp), t1
ldw HPPA_FRAME_ARG(17)(sp), t2
ldw HPPA_FRAME_ARG(18)(sp), t3
ldw HPPA_FRAME_ARG(19)(sp), t4
mtctl t1, cr28
mtctl t2, cr29
mtctl t3, cr30
mtctl t4, cr31
ldw HPPA_FRAME_ARG(21)(sp), t1
ldw HPPA_FRAME_ARG(22)(sp), t2
comb,= r0, t1, pdc_call_unmapped3
nop
copy ret0, t3
ldw HPPA_FRAME_ARG(23)(sp), arg0
break HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
copy t3, ret0
pdc_call_unmapped3
ldw HPPA_FRAME_PSP(sp), sp
ldw HPPA_FRAME_CRP(sp), rp
bv r0(rp)
mtctl t2, eiem
EXIT(pdc_call)
.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,code
.call
ldil L%$syscall, t2
be R%$syscall(sr1, t2)
nop ! nop ! nop ! nop
.size gateway_page, .-gateway_page
.align NBPG
.export gateway_page_end, entry
gateway_page_end
.export $syscall,entry
.proc
.callinfo calls
.entry
$syscall
mfctl cr29, t2
ldw CI_CURPROC(sr1, t2), t2
ldw P_ADDR(sr1, t2), t3
ldo NBPG(t3), t3
stw t3, P_MD_REGS(sr1, t2)
ldo TRAPFRAME_SIZEOF(t3), t3
stw t4, TF_R19 -TRAPFRAME_SIZEOF(sr1, t3)
stw t1, TF_R22 -TRAPFRAME_SIZEOF(sr1, t3)
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
stw,ma r0, HPPA_FRAME_SIZE+HPPA_FRAME_MAXARGS(sr1, sp)
stw r0, HPPA_FRAME_CRP(sr1, sp)
mfctl r29, 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)
mfsp sr0, arg0
stw arg0, TF_IISQH-TRAPFRAME_SIZEOF(sr1, t3)
stw arg0, TF_IISQT-TRAPFRAME_SIZEOF(sr1, t3)
ldo 4(r31), arg1
stw r31, TF_IIOQH-TRAPFRAME_SIZEOF(sr1, t3)
stw arg1, TF_IIOQT-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
#ifdef DDB
mfctl eirr, arg0
mfctl vtop, arg1
stw arg0, TF_CR23-TRAPFRAME_SIZEOF(sr1, t3)
stw arg1, TF_CR25-TRAPFRAME_SIZEOF(sr1, t3)
mfctl cr28, arg1
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
.import syscall,code
ldil L%syscall, r1
ldo R%syscall(r1), r1
.call
blr r0, rp
bv,n 0(r1)
nop
mfctl cr29, r1
ldw CI_CURPROC(r1), r1
ldw P_MD_REGS(r1), t3
.exit
.procend
.export $syscall_return, entry
.proc
.callinfo no_calls
.entry
$syscall_return
#ifdef MULTIPROCESSOR
mfctl eiem, t1
stw t1, TF_CR15(t3)
#endif
mtctl r0, eiem
mfctl cr29, t2
ldo CI_TRAP_SAVE(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_CR0(sr3, t3), t1
mtctl t1, rctr
ldw TF_CR27(sr3, t3), t1
ldw TF_CR30(sr3, t3), t2
mtctl t1, cr27
mtctl t2, cr30
ssm 0, r0
mfctl cr29, t3
ldo CI_TRAP_SAVE(t3), t3
nop ! nop ! nop ! nop ! nop
rsm RESET_PSL, r0
$syscall_return_phys
mtctl r0, cr26
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, .-$syscall
$syscall_end
#define TLABEL(name) $trap$name
#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 TLABEL(name)$num, entry ! \
.label TLABEL(name)$num ! \
TRAP(all,num) ! \
.size TLABEL(name)$num, .-TLABEL(name)$num
#define CTRAP(name,num,pre) \
.export TLABEL(name)$num, entry ! \
.label TLABEL(name)$num ! \
pre ! \
TRAP(name,num) ! \
.size TLABEL(name)$num, .-TLABEL(name)$num
#define STRAP(name,num,pre) \
.export TLABEL(name)$num, entry ! \
.label TLABEL(name)$num ! \
pre ! \
mtctl r1, tr7 ! \
.export trap_ep_##num, entry ! \
.label trap_ep_##num ! \
.call ! \
b __CONCAT($name,_l) ! \
ldi num, r1 ! \
b __CONCAT($name,_t)+8 ! \
b __CONCAT($name,_s)+12 ! \
b __CONCAT($name,_u)+16 ! \
.size TLABEL(name)$num, .-TLABEL(name)$num
#define ITLBPRE \
mfctl pcoq,r9 ! \
mfctl pcsq,r8
#define DTLBPRE \
mfctl ior, r9 ! \
mfctl isr, r8
#define HPMCPRE nop
#define INTRPRE \
mfctl eirr, r8 ! \
mtctl r8, eirr
.align NBPG
.export $ivaaddr, entry
.export hpmc_v, entry
$ivaaddr
ATRAP(null,T_NONEXIST)
hpmc_v
CTRAP(hpmc,T_HPMC,HPMCPRE)
ATRAP(power,T_POWERFAIL)
ATRAP(recnt,T_RECOVERY)
CTRAP(intr,T_INTERRUPT,INTRPRE)
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)
CTRAP(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(unk29,29)
ATRAP(unk30,30)
ATRAP(unk31,31)
ATRAP(unk32,32)
ATRAP(unk33,33)
ATRAP(unk34,34)
ATRAP(unk35,35)
ATRAP(unk36,36)
ATRAP(unk37,37)
ATRAP(unk38,38)
ATRAP(unk39,39)
ATRAP(unk40,40)
ATRAP(unk41,41)
ATRAP(unk42,42)
ATRAP(unk43,43)
ATRAP(unk44,44)
ATRAP(unk45,45)
ATRAP(unk46,46)
ATRAP(unk47,47)
ATRAP(unk48,48)
ATRAP(unk49,49)
ATRAP(unk50,50)
ATRAP(unk51,51)
ATRAP(unk52,52)
ATRAP(unk53,53)
ATRAP(unk54,54)
ATRAP(unk55,55)
ATRAP(unk56,56)
ATRAP(unk57,57)
ATRAP(unk58,58)
ATRAP(unk59,59)
ATRAP(unk60,60)
ATRAP(unk61,61)
ATRAP(unk62,62)
ATRAP(unk63,63)
.size $ivaaddr, .-$ivaaddr
.export TLABEL(excpt), entry
ENTRY(TLABEL(excpt),0)
copy rp, r1
copy arg0, r8
mfctl cr30, r9
#if HFP_REGS != 0
ldo HFP_REGS(r9), r9
#endif
.import fpu_save, code
.call
bl fpu_save, rp
copy r9, arg0
copy r1, rp
copy r8, arg0
mfctl cr29, r1
mtctl r0, ccr
ldw CI_FPU_STATE(r1), r16
stw r0, CI_FPU_STATE(r1)
stw r0, HFP_CPU(r16)
sync
ldw 0(r9), r1
bb,>=,n r1, HPPA_FPU_T_POS, excpt_notrap
ldw 1*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 2*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 3*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 4*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 5*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 6*4(r9), r1
comb,<>,n r0, r1, excpt_emulate
ldw 7*4(r9), r1
excpt_emulate
bb,>=,n r1, 5, excpt_notrap
ldw 0(r9), r16
depi 0, HPPA_FPU_T_POS, 1, r16
.import $fpu_emulate, code
b $fpu_emulate
stw r16, 0(r9)
excpt_notrap
sync
b TLABEL(all)
ldi T_EXCEPTION, r1
EXIT(TLABEL(excpt))
.export TLABEL(emu), entry
ENTRY(TLABEL(emu),0)
mfctl iir, r8
extru r8, 5, 6, r9
comib,= 4, r9, TLABEL(all)
ldi T_ILLEGAL, r1
ldil L%cpu_fpuena, r1
ldw R%cpu_fpuena(r1), r9
comib,= 0, r9, $fpusw_emu
mfctl ccr, r1
extru,<> r1, 25, 2, r0
b,n $fpusw_set
nop
$fpusw_emu
mfctl cr29, r1
mtctl r0, ccr
ldw CI_FPU_STATE(r1), r16
stw r0, CI_FPU_STATE(r1)
stw r0, HFP_CPU(r16)
sync
#if 0
mfctl iir, r1
extru r1, 5, 6, r1
comib,= 0xb, r9, TLABEL(all)
ldi T_ILLEGAL, r1
mfctl iir, r1
extru r1, 5, 6, r1
comib,= 0x9, r9, TLABEL(all)
ldi T_ILLEGAL, r1
#endif
mfctl iir, r1
.import $fpu_emulate, code
b $fpu_emulate
nop
$fpusw_set
depi 3, 25, 2, r1
mtctl r1, ccr
mfctl cr29, r16
mfctl cr30, r9
ldw CI_FPU_STATE(r16), r16
comb,=,n r16, r0, $fpusw_nosave
comb,=,n r16, r9, $fpusw_done
copy arg0, r17
copy rp, r1
#if HFP_REGS != 0
ldo HFP_REGS(r16), r16
#endif
.import fpu_save, code
.call
bl fpu_save, rp
copy r16, arg0
copy r1, rp
copy r17, arg0
mfctl cr29, r1
ldw CI_FPU_STATE(r1), r16
stw r0, CI_FPU_STATE(r1)
stw r0, HFP_CPU(r16)
sync
$fpusw_nosave
#ifdef MULTIPROCESSOR
ldw HFP_CPU(r9), r1
comb,=,n r1, r0, $fpusw_noshoot
ldi (1 << HPPA_IPI_FPU_SAVE), r1
ldw HFP_CPU(r9), r16
stw r1, CI_IPI(r16)
ldi 1, r1
ldw CI_HPA(r16), r16
stw r1, 0(r16)
$fpusw_spin
sync
ldw HFP_CPU(r9), r1
comb,<>,n r1, r0, $fpusw_spin
$fpusw_noshoot
#endif
.import uvmexp, data
ldil L%(uvmexp+FPSWTCH), r1
ldw R%(uvmexp+FPSWTCH)(r1), r16
ldo 31*8+HFP_REGS(r9), r17
ldo 1(r16), r16
stw r16, R%(uvmexp+FPSWTCH)(r1)
fldds,ma -8(r17), fr31
fldds,ma -8(r17), fr30
fldds,ma -8(r17), fr29
fldds,ma -8(r17), fr28
fldds,ma -8(r17), fr27
fldds,ma -8(r17), fr26
fldds,ma -8(r17), fr25
fldds,ma -8(r17), fr24
fldds,ma -8(r17), fr23
fldds,ma -8(r17), fr22
fldds,ma -8(r17), fr21
fldds,ma -8(r17), fr20
fldds,ma -8(r17), fr19
fldds,ma -8(r17), fr18
fldds,ma -8(r17), fr17
fldds,ma -8(r17), fr16
fldds,ma -8(r17), fr15
fldds,ma -8(r17), fr14
fldds,ma -8(r17), fr13
fldds,ma -8(r17), fr12
fldds,ma -8(r17), fr11
fldds,ma -8(r17), fr10
fldds,ma -8(r17), fr9
fldds,ma -8(r17), fr8
fldds,ma -8(r17), fr7
fldds,ma -8(r17), fr6
fldds,ma -8(r17), fr5
fldds,ma -8(r17), fr4
fldds,ma -8(r17), fr3
fldds,ma -8(r17), fr2
fldds,ma -8(r17), fr1
fldds 0(r17), fr0
mfctl cr29, r1
stw r9, CI_FPU_STATE(r1)
stw r1, HFP_CPU(r9)
sync
$fpusw_done
rfir
nop
EXIT(TLABEL(emu))
#define VTAG ! \
shd r0, r9, 1, r16 ! \
dep r8, 31, 16, r16 ! \
depi 1, 0, 1, r16
#if 0
.export dtlb_c, data
BSS(dtlb_c, 8)
.export tlbd_c, data
BSS(tlbd_c, 8)
.export itlb_c, data
BSS(itlb_c, 8)
.text
#define TLB_STATS_PRE(t) \
mfctl itmr, r17 ! \
mtctl r17, tr5
#define TLB_STATS_AFT(t) \
mfctl 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
#if defined(HP7000_CPU) || defined(HP7100_CPU) || defined(HP7200_CPU)
#define TLB_PULL(bits,lbl) ! \
! \
mfctl 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
.align 32
LEAF_ENTRY($tlbd_s)
ALTENTRY($tlbd_t)
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($tlbd_s)
LEAF_ENTRY($itlb_s)
ALTENTRY($itlb_t)
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($itlb_s)
LEAF_ENTRY($dtlb_s)
ALTENTRY($dtlb_t)
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($dtlb_s)
LEAF_ENTRY($dtlbna_s)
ALTENTRY($itlbna_s)
ALTENTRY($dtlbna_t)
ALTENTRY($itlbna_t)
TLB_STATS_PRE(dtlb)
TLB_PULL(0, $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
$dtlbna_s_fake
$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($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)
#define TLB_PULL_L(bits,lbl) ! \
! \
mfctl 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
.align 32
LEAF_ENTRY($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
sub,<> r16, r24, r0
stw r0, 0(r17)
#endif
TLB_STATS_AFT(tlbd)
rfir
nop
EXIT($tlbd_l)
LEAF_ENTRY($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($itlb_l)
LEAF_ENTRY($dtlbna_l)
ALTENTRY($itlbna_l)
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, $dtlbna_l_fake)
IDTLBAF(17)
IDTLBPF(25)
TLB_STATS_AFT(dtlb)
rfir
nop
$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($dtlbna_l)
LEAF_ENTRY($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 $dtlb_done_l
extru r9, 19, 10, r16
ldwx,s r16(r24), r17
sh2addl r16, r24, r25
combt,=,n r0, r17, $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
ldo 16(r24), r24
stw r16, 0(r24)
stw r25, 4(r24)
stw r17, 8(r24)
$dtlb_done_l
#endif
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT($dtlb_l)
#endif
#if defined(HP8000_CPU) || defined(HP8200_CPU) || defined(HP8500_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($tlbd_u)
TLB_STATS_PRE(tlbd)
TLB_PULL_L(1, TLABEL(all))
TLB_PCX2PCXU
idtlbt r17, r25
TLB_STATS_AFT(tlbd)
rfir
nop
EXIT($tlbd_u)
LEAF_ENTRY($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($itlb_u)
LEAF_ENTRY($dtlbna_u)
ALTENTRY($itlbna_u)
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, $dtlbna_u_fake)
TLB_PCX2PCXU
idtlbt r17, r25
TLB_STATS_AFT(dtlb)
rfir
nop
$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($dtlbna_u)
LEAF_ENTRY($dtlb_u)
TLB_STATS_PRE(dtlb)
TLB_PULL_L(0, TLABEL(all))
TLB_PCX2PCXU
idtlbt r17, r25
TLB_STATS_AFT(dtlb)
rfir
nop
EXIT($dtlb_u)
.level 1.1
#endif
.align 64
.export TLABEL(all), entry
ENTRY(TLABEL(all),0)
mtctl t3, cr26
mfctl cr29, t3
ldo CI_TRAP_SAVE(t3), t3
stw t1, TF_R22(t3)
stw t2, TF_R21(t3)
mfctl cr26, t1
stw sp, TF_R30(t3)
stw t1, TF_R20(t3)
mfctl eiem, t1
mfctl ipsw, t2
stw t1, TF_CR15(t3)
stw t2, TF_CR22(t3)
mfsp sr3, t1
mfctl pidr1, t2
stw t1, TF_SR3(t3)
stw t2, TF_CR8(t3)
ldi HPPA_PID_KERNEL,t1
mtctl t1, pidr1
mtsp r0, sr3
mfctl cr29, t1
ldw CI_PSW(t1), t2
mtctl r0, eiem
mtctl t2, ipsw
mfctl pcsq, t1
mtctl r0, pcsq
mfctl pcsq, t2
stw t1, TF_IISQH(t3)
stw t2, TF_IISQT(t3)
mtctl r0, pcsq
mfctl pcoq, t1
ldil L%SYSCALLGATE, t2
ldo TF_PHYS-1(sp), sp
dep t1, 31, PGSHIFT, t2
dep,<> t1, 31, 2, r0
comb,<> t1, t2, $trap_from_kernel
dep r0, 31, 6, sp
mfctl cr29, t2
ldw CI_CURPROC(t2), t2
depi 1, T_USER_POS, 1, r1
depi 1, TFF_LAST_POS, 1, r1
ldw P_ADDR(t2), sp
ldo NBPG(sp), sp
$trap_from_kernel
ldil L%$trapnowvirt, t2
ldo R%$trapnowvirt(t2), t2
mtctl t2, pcoq
stw t1, TF_IIOQH(t3)
ldo 4(t2), t2
mfctl pcoq, t1
stw t1, TF_IIOQT(t3)
mtctl t2, pcoq
mfctl isr, t1
mfctl ior, t2
stw t1, TF_CR20(t3)
stw t2, TF_CR21(t3)
mfctl iir, t2
stw t2, TF_CR19(t3)
stw r1, TF_FLAGS(t3)
mfctl rctr, t1
copy sp, t3
ldo HPPA_FRAME_SIZE+TRAPFRAME_SIZEOF(sp), sp
rfir
nop ! nop ! nop ! nop ! nop ! nop ! nop ! nop
$trapnowvirt
mfctl 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
mfctl sar, t1
stw t1, TF_CR11(t3)
stw r1, TF_R1(t3)
stw r2, TF_R2(t3)
stw r3, TF_R3(t3)
copy sp, r3
stw,mb r0, -HPPA_FRAME_SIZE(r3)
mfctl cr29, t2
ldo CI_TRAP_SAVE(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 r19, 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)
#ifdef DDB
mfctl eirr, t1
mfctl vtop, t2
stw t1, TF_CR23(t3)
stw t2, TF_CR25(t3)
mfctl cr28, t2
stw t2, TF_CR28(t3)
#endif
mfctl cr27, t1
mfctl cr30, 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
copy arg0, r4
copy arg1, r5
.import trap, code
ldil L%trap,t1
ldo R%trap(t1),t1
.call
blr r0,rp
bv,n r0(t1)
nop
copy r5, t3
extru,<> r4, TFF_LAST_POS, 1, r0
b $syscall_return
mfctl cr29, t1
ldw CI_CURPROC(t1), t2
sub,<> r0, t2, r0
ldw P_MD_REGS(t2), t3
b $syscall_return
nop
EXIT(TLABEL(all))
#if defined(HP7000_CPU)
LEAF_ENTRY(desidhash_s)
sync
MFCPU_C_PCXST(DR_CPUCFG,22)
MFCPU_C_PCXST(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_PCXST(22,DR_CPUCFG)
MTCPU_PCXST(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(desidhash_t)
sync
MFCPU_C_PCXST(DR_CPUCFG,22)
MFCPU_C_PCXST(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_PCXST(22,DR_CPUCFG)
MTCPU_PCXST(22,DR_CPUCFG)
nop
nop
bv 0(rp)
extru t1, 4, 5, ret0
EXIT(desidhash_t)
#endif
#ifdef HP7300LC_CPU
.data
BSS(eaio_l2_mask, 4)
LEAF_ENTRY(eaio_l2)
ldil L%eaio_l2_mask, t2
ldw R%eaio_l2_mask(t2), t1
or t1, arg0, t1
MTCPU_PCXL(22, DR0_PCXL2_ACCEL_IO)
nop
nop
bv 0(rp)
stw t1, R%eaio_l2_mask(t2)
EXIT(eaio_l2)
#endif
#if defined(HP7100LC_CPU) || defined(HP7300LC_CPU)
LEAF_ENTRY(ibtlb_l)
rsm (PSL_R|PSL_I), t4
nop ! nop ! nop ! nop ! nop ! nop ! nop
bv 0(rp)
mtsm t4
EXIT(ibtlb_l)
LEAF_ENTRY(desidhash_l)
MFCPU_C_PCXL(DR_CPUCFG,22)
nop
nop
depi 0, DR0_PCXL_L2IHASH_EN, 2, t1
#if 0
depi 0, DR0_PCXL_DUAL_DIS, 2, t1
#endif
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, 4, t1
sync
MTCPU_PCXL(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)
.level 2.0w
LEAF_ENTRY(desidhash_u)
MFCPU_PCXU(2,28)
depdi 0, 54, 1, r28
MTCPU_PCXU(28,2)
bv r0(rp)
copy r0, ret0
EXIT(desidhash_u)
LEAF_ENTRY(ibtlb_u)
bv 0(rp)
nop
EXIT(ibtlb_u)
LEAF_ENTRY(pbtlb_u)
bv 0(rp)
nop
EXIT(pbtlb_u)
.level 1.1
#endif
.export TLABEL(hpmc), entry
ENTRY(TLABEL(hpmc),0)
ALTENTRY(hpmc_tramp)
mtsp r0, sr0
ldil L%hppa_vtop, t1
ldw R%hppa_vtop(t1), t1
mtctl t1, CR_VTOP
.import hpmc_dump, code
ldil L%hpmc_dump, rp
ldo R%hpmc_dump(rp), rp
mfctl cr29, %arg2
ldw CI_PSW(%arg2), %arg2
depi 0, PSL_I_POS, 1, %arg2
stw %arg2, CI_PSW(t1)
ldil L%emrg_stack, arg1
b $kernel_setup
ldw R%emrg_stack(arg1), arg1
ldil L%HPPA_GBCAST, t1
ldi CMD_RESET, t2
stw t2, R%HPPA_GBCAST(t1)
hpmc_never_dies
b hpmc_never_dies
nop
ALTENTRY(hpmc_tramp_end)
EXIT(TLABEL(hpmc))
ENTRY(hppa_toc,0)
mtsp r0, sr0
ldil L%hppa_vtop, t1
ldw R%hppa_vtop(t1), t1
mtctl t1, CR_VTOP
.import boot, code
ldil L%boot, rp
ldo R%boot(rp), rp
mfctl cr29, %arg2
ldw CI_PSW(%arg2), %arg2
depi 0, PSL_I_POS, 1, %arg2
stw %arg2, CI_PSW(t1)
ldi 0, arg0
ldil L%emrg_stack, arg1
b $kernel_setup
ldw R%emrg_stack(arg1), arg1
ALTENTRY(hppa_toc_end)
.word 0
EXIT(hppa_toc)
ENTRY(hppa_pfr,0)
mtsp r0, sr0
ldil L%hppa_vtop, t1
ldw R%hppa_vtop(t1), t1
mtctl t1, CR_VTOP
.import boot, code
ldil L%boot, rp
ldo R%boot(rp), rp
mfctl cr29, %arg2
ldw CI_PSW(%arg2), %arg2
depi 0, PSL_I_POS, 1, %arg2
stw %arg2, CI_PSW(t1)
ldi RB_HALT|RB_POWERDOWN, arg0
ldil L%emrg_stack, arg1
b $kernel_setup
ldw R%emrg_stack(arg1), arg1
ALTENTRY(hppa_pfr_end)
.word 0
EXIT(hppa_pfr)
#if 0
.align 8
intr_ticks
.word 0, 0
#define INTR_PROF_PRE \
mfctl itmr, r9 ! \
mtctl r9, tr5
#define INTR_PROF_AFT \
mfctl itmr, r8 ! \
mfctl tr5, r9 ! \
ldil L%intr_ticks, r1 ! \
ldo R%intr_ticks(r1), r1 ! \
sub r8, r9, r8 ! \
ldw 0(r1), r16 ! \
ldw 4(r1), r17 ! \
add r8, r16, r16 ! \
addi 1, r17, r17 ! \
stw r16, 0(r1) ! \
stw r17, 4(r1)
#else
#define INTR_PROF_PRE
#define INTR_PROF_AFT
#endif
.import imask, data
.import intr_table, data
.align 32
ENTRY(TLABEL(intr),0)
INTR_PROF_PRE
ldil L%intr_table + CPU_NINTS*HPPA_IV_SIZEOF, r1
ldo R%intr_table + CPU_NINTS*HPPA_IV_SIZEOF(r1), r1
mfctl cr29, r17
b $intr_cont
ldw CI_IPENDING(r17), r24
$intr_ffs
addi -HPPA_IV_SIZEOF, r1, r1
bb,>= r8, 0, $intr_ffs
zdep r8, 30, 31, r8
ldb IV_FLAGS(r1), r17
bb,>=,n r17, 31, $intr_nocall
ldw IV_HANDLER(r1), r16
ldw IV_ARG(r1), r9
mtctl r1, tr7
bv r0(r16)
ldw IV_NEXT(r1), r1
$intr_nocall
ldw IV_BIT(r1), r17
or r17, r24, r24
$intr_cont
comb,<>,n r0, r8, $intr_ffs
ldw -HPPA_IV_SIZEOF(r1), r0
mfctl cr29, r17
stw r24, CI_IPENDING(r17)
ldw CI_CPL(r17), r17
ldil L%imask, r16
ldo R%imask(r16), r16
ldwx,s r17(r16), r25
INTR_PROF_AFT
ldi T_INTERRUPT, r1
andcm,= r24, r25, r0
b TLABEL(all)
nop
rfir
nop
EXIT(TLABEL(intr))
.align 32
LEAF_ENTRY(gsc_intr)
ldw 0(r9), r16
$gsc_intr_loop
comb,=,n r0, r16, $intr_cont
mfctl tr7, r1
$gsc_ffs
addi HPPA_IV_SIZEOF, r1, r1
bb,>= r16, 31, $gsc_ffs
shd r0, r16, 1, r16
ldo -HPPA_IV_SIZEOF(r1), r9
$gsc_share
ldw IV_BIT(r9), r17
ldw IV_SHARE(r9), r9
comb,<> r0, r9, $gsc_share
or r17, r24, r24
b,n $gsc_intr_loop
EXIT(gsc_intr)
.align 32
LEAF_ENTRY(dino_intr)
ldw 3*4(r9), r16
$dino_intr_loop
comb,=,n r0, r16, $intr_cont
mfctl tr7, r1
$dino_ffs
addi HPPA_IV_SIZEOF, r1, r1
bb,>= r16, 31, $dino_ffs
shd r0, r16, 1, r16
ldo -HPPA_IV_SIZEOF(r1), r9
$dino_share
ldw IV_BIT(r9), r17
ldw IV_SHARE(r9), r9
comb,<> r0, r9, $dino_share
or r17, r24, r24
b,n $dino_intr_loop
EXIT(dino_intr)
.export TLABEL(ibrk), entry
ENTRY(TLABEL(ibrk),0)
mfctl pcoq, r8
extru,= r8, 31, 2, r0
b,n $ibrk_bad
.import etext
ldil L%etext, r9
ldo R%etext(r9), r9
comb,>>=,n r8, r9, $ibrk_bad
mfctl iir, r8
extru r8, 31, 5, r9
comib,<>,n HPPA_BREAK_KERNEL, r9, $ibrk_bad
extru r8, 18, 13, r9
comib,=,n HPPA_BREAK_GET_PSW, r9, $ibrk_getpsw
comib,=,n HPPA_BREAK_SET_PSW, r9, $ibrk_setpsw
comib,=,n HPPA_BREAK_SPLLOWER, r9, $ibrk_spllower
$ibrk_bad
b TLABEL(all)
nop
$ibrk_getpsw
b $ibrk_exit
mfctl ipsw, ret0
$ibrk_setpsw
mfctl ipsw, ret0
b $ibrk_exit
mtctl arg0, ipsw
$ibrk_spllower
mtctl r0, pcoq
mfctl pcoq, r9
mtctl r9, pcoq
ldo 4(r9), r9
mtctl r9, pcoq
mfctl cr29, r17
ldw CI_IPENDING(r17), r8
ldil L%imask, r9
ldo R%imask(r9), r9
ldw CI_CPL(r17), ret0
ldwx,s arg0(r9), r16
stw arg0, CI_CPL(r17)
ldi T_INTERRUPT, r1
andcm,= r8, r16, r0
b TLABEL(all)
nop
rfir
nop
nop ! nop
$ibrk_exit
mtctl r0, pcoq
mfctl pcoq, r9
mtctl r9, pcoq
ldo 4(r9), r9
mtctl r9, pcoq
rfir
nop
EXIT(TLABEL(ibrk))
LEAF_ENTRY(fpu_exit)
depi 3, 25, 2, r1
mtctl r1, ccr
ldil L%fpu_scratch, %r25
ldo R%fpu_scratch(%r25), %r25
fstds %fr0, 0(%r25)
sync
bv %r0(%rp)
mtctl r0, ccr
EXIT(fpu_exit)
LEAF_ENTRY(fpu_save)
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)
bv r0(rp)
sync
EXIT(fpu_save)
#ifdef FPEMUL
ENTRY($fpu_emulate,320)
copy r31, r9
mfctl cr29, r31
ldw CI_STACK(r31), r31
stw r2 , TF_R2 (r31)
stw r3 , TF_R3 (r31)
stw r4 , TF_R4 (r31)
stw r5 , TF_R5 (r31)
stw r6 , TF_R6 (r31)
stw r7 , TF_R7 (r31)
stw r10, TF_R10(r31)
stw r11, TF_R11(r31)
stw r12, TF_R12(r31)
stw r13, TF_R13(r31)
stw r14, TF_R14(r31)
stw r15, TF_R15(r31)
stw r18, TF_R18(r31)
stw r19, TF_R19(r31)
stw r20, TF_R20(r31)
stw r21, TF_R21(r31)
stw r22, TF_R22(r31)
stw r23, TF_R23(r31)
stw r26, TF_R26(r31)
stw r27, TF_R27(r31)
stw r28, TF_R28(r31)
stw r29, TF_R29(r31)
stw sp, TF_R30(r31)
stw r9, TF_R31(r31)
copy r1, arg0
mfctl sar, r1
stw r1, TF_CR11(r31)
stw arg0, TF_CR19(r31)
ldo TRAPFRAME_SIZEOF(r31), r3
ldo TRAPFRAME_SIZEOF+HPPA_FRAME_SIZE(r31), sp
ldil L%$global$, dp
ldo R%$global$(dp), dp
.import fpu_emulate, code
ldil L%fpu_emulate,t1
ldo R%fpu_emulate(t1),t1
mfctl cr30, arg2
.call
blr r0,rp
bv,n 0(t1)
nop
mfctl cr30, r25
ldi 32, r1
ldw 4(r25), r17
zdep ret0, 5, 6, r17
stw r17, 4(r25)
mfctl cr29, r31
ldw CI_STACK(r31), r31
ldw TF_CR11(r31), r1
ldw TF_R2 (r31), r2
ldw TF_R3 (r31), r3
mtsar r1
copy ret0, r1
ldw TF_R4 (r31), r4
ldw TF_R5 (r31), r5
ldw TF_R6 (r31), r6
ldw TF_R7 (r31), r7
ldw TF_R10(r31), r10
ldw TF_R11(r31), r11
ldw TF_R12(r31), r12
ldw TF_R13(r31), r13
ldw TF_R14(r31), r14
ldw TF_R15(r31), r15
ldw TF_R18(r31), r18
ldw TF_R19(r31), r19
ldw TF_R20(r31), r20
ldw TF_R21(r31), r21
ldw TF_R22(r31), r22
ldw TF_R23(r31), r23
ldw TF_R26(r31), r26
ldw TF_R27(r31), r27
ldw TF_R28(r31), r28
ldw TF_R29(r31), r29
ldw TF_R30(r31), r30
ldw TF_R31(r31), r31
bb,>=,n r1, 24, $fpu_emulate_done
b TLABEL(all)
ldi T_EMULATION, r1
$fpu_emulate_done
comb,<> r0, r1, TLABEL(all)
ldi T_EXCEPTION, r1
rfir
nop
EXIT($fpu_emulate)
#endif
.import dcache_stride, data
LEAF_ENTRY(fdcache)
ldil L%dcache_stride,t1
ldw R%dcache_stride(t1), arg3
mtsp arg0, sr1
add arg1, arg2, arg0
zdep arg3, 27, 28, t1
comb,< arg2, t1, fdc_short
addi -1, t1, t1
andcm arg2, t1, t1
add arg1, t1, t1
fdc,m arg3(sr1, arg1)
fdc_long
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
fdc,m arg3(sr1, arg1)
comb,<<,n arg1, t1, fdc_long
fdc,m arg3(sr1, arg1)
fdc_short
comb,<<,n arg1, arg0, fdc_short
fdc,m arg3(sr1, arg1)
addi -1, arg0, arg1
fdc r0(sr1, arg1)
sync
syncdma
bv r0(r2)
nop
EXIT(fdcache)
.import dcache_stride, data
LEAF_ENTRY(pdcache)
ldil L%dcache_stride,t1
ldw R%dcache_stride(t1), arg3
mtsp arg0, sr1
add arg1, arg2, arg0
zdep arg3, 27, 28, t1
comb,< arg2, t1, pdc_short
addi -1, t1, t1
andcm arg2, t1, t1
add arg1, t1, t1
pdc,m arg3(sr1, arg1)
pdc_long
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
pdc,m arg3(sr1, arg1)
comb,<<,n arg1, t1, pdc_long
pdc,m arg3(sr1, arg1)
pdc_short
comb,<<,n arg1, arg0, pdc_short
pdc,m arg3(sr1, arg1)
addi -1, arg0, arg1
pdc r0(sr1, arg1)
sync
syncdma
bv r0(r2)
nop
EXIT(pdcache)
.import icache_stride, data
LEAF_ENTRY(ficache)
ldil L%icache_stride,t1
ldw R%icache_stride(t1), arg3
mtsp arg0, sr1
add arg1, arg2, arg0
zdep arg3, 27, 28, t1
comb,< arg2, t1, fic_short
addi -1, t1, t1
andcm arg2, t1, t1
add arg1, t1, t1
fic,m arg3(sr1, arg1)
fic_long
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
fic,m arg3(sr1, arg1)
comb,<<,n arg1, t1, fic_long
fic,m arg3(sr1, arg1)
fic_short
comb,<<,n arg1, arg0, fic_short
fic,m arg3(sr1, arg1)
addi -1, arg0, arg1
fic r0(sr1, arg1)
sync
syncdma
bv r0(r2)
nop
EXIT(ficache)
#ifdef DDB
LEAF_ENTRY(setjmp)
stwm r3,4(arg0)
stwm r4,4(arg0)
stwm r5,4(arg0)
stwm r6,4(arg0)
stwm r7,4(arg0)
stwm r8,4(arg0)
stwm r9,4(arg0)
stwm r10,4(arg0)
stwm r11,4(arg0)
stwm r12,4(arg0)
stwm r13,4(arg0)
stwm r14,4(arg0)
stwm r15,4(arg0)
stwm r16,4(arg0)
stwm r17,4(arg0)
stwm r18,4(arg0)
stwm r27,4(arg0)
stwm rp,4(arg0)
stwm sp,4(arg0)
bv 0(rp)
copy r0, ret0
EXIT(setjmp)
LEAF_ENTRY(longjmp)
ldwm 4(arg0),r3
ldwm 4(arg0),r4
ldwm 4(arg0),r5
ldwm 4(arg0),r6
ldwm 4(arg0),r7
ldwm 4(arg0),r8
ldwm 4(arg0),r9
ldwm 4(arg0),r10
ldwm 4(arg0),r11
ldwm 4(arg0),r12
ldwm 4(arg0),r13
ldwm 4(arg0),r14
ldwm 4(arg0),r15
ldwm 4(arg0),r16
ldwm 4(arg0),r17
ldwm 4(arg0),r18
ldwm 4(arg0),r27
ldwm 4(arg0),rp
ldwm 4(arg0),sp
bv 0(rp)
ldi 1, ret0
EXIT(longjmp)
#endif
.align 32
LEAF_ENTRY(copy_on_fault)
mtsp r0, sr1
mtsp r0, sr2
stw r1, PCB_ONFAULT+U_PCB(r2)
ldw HPPA_FRAME_CRP(sp), rp
ldo -64(sp), sp
bv 0(rp)
ldi EFAULT, %ret0
EXIT(copy_on_fault)
LEAF_ENTRY(spstrcpy)
ldw HPPA_FRAME_ARG(4)(sp), t2
ldo 64(sp), sp
add t2, arg1, t2
stw rp, HPPA_FRAME_CRP(sp)
mfctl cr29, t1
ldw CI_CURPROC(t1), t3
ldil L%copy_on_fault, t4
ldw P_ADDR(t3), r2
ldo R%copy_on_fault(t4), t4
ldw PCB_ONFAULT+U_PCB(r2), r1
stw t4, PCB_ONFAULT+U_PCB(r2)
mtsp arg0, sr1
mtsp arg2, sr2
copy arg1, arg0
copy r0, ret0
$spstrcpy_loop
ldbs,ma 1(sr1, arg1), t1
comb,= r0, t1, $spstrcpy_exit
stbs,ma t1, 1(sr2, arg3)
comb,<>,n t2, arg1, $spstrcpy_loop
nop
ldi ENAMETOOLONG, ret0
$spstrcpy_exit
mtsp r0, sr1
mtsp r0, sr2
stw r1, PCB_ONFAULT+U_PCB(r2)
ldw HPPA_FRAME_CRP(sp), rp
sub arg1, arg0, arg1
ldo -64(sp), sp
ldw HPPA_FRAME_ARG(5)(sp), arg0
sub,= r0, arg0, r0
stw arg1, 0(arg0)
bv 0(rp)
nop
EXIT(spstrcpy)
LEAF_ENTRY(spcopy32)
extru arg1, 31, 2, t3
extru arg3, 31, 2, t4
comb,<>,n 0, t3, $spcopy32_misaligned
comb,<>,n 0, t4, $spcopy32_misaligned
ldo 64(sp), sp
stw rp, HPPA_FRAME_CRP(sp)
mfctl cr29, t1
ldw CI_CURPROC(t1), t3
ldil L%copy_on_fault, t2
ldw P_ADDR(t3), r2
ldo R%copy_on_fault(t2), t2
ldw PCB_ONFAULT+U_PCB(r2), r1
stw t2, PCB_ONFAULT+U_PCB(r2)
mtsp arg0, sr1
mtsp arg2, sr2
ldw 0(sr1, arg1), t1
stw t1, 0(sr2, arg3)
mtsp r0, sr1
mtsp r0, sr2
stw r1, PCB_ONFAULT+U_PCB(r2)
ldw HPPA_FRAME_CRP(sp), rp
ldo -64(sp), sp
bv 0(rp)
copy r0, ret0
$spcopy32_misaligned
bv 0(rp)
ldi EFAULT, ret0
EXIT(spcopy32)
.align 32
ENTRY(cpu_switchto,128)
copy r3, r1
stw rp, HPPA_FRAME_CRP(sp)
copy sp, r3
stwm r1, HPPA_FRAME_SIZE+16*4(sp)
#ifdef DIAGNOSTIC
b kstack_check
nop
switch_error
copy arg1, arg2
copy arg0, arg1
ldil L%panic, r1
ldil L%Lcspstr, arg0
ldo R%panic(r1), r1
ldo R%Lcspstr(arg0), arg0
.call
blr %r0, rp
bv,n %r0(r1)
nop
Lcspstr
.asciz "cpu_switch:old=%p, new=%p"
.align 8
kstack_check
ldw P_ADDR(arg1), arg2
ldw U_PCB+PCB_KSP(arg2), t1
ldo NBPG(arg2), arg2
comb,>>,n arg2, t1, switch_error
nop
sub t1, arg2, t1
ldil L%USPACE, arg2
ldo R%USPACE(arg2), arg2
comb,<<=,n arg2, t1, switch_error
nop
kstack_ok
#endif
ldi SONPROC, t1
stb t1, P_STAT(arg1)
mfctl cr29, t1
stw arg1, CI_CURPROC(t1)
comb,=,n r0, arg0, switch_exited
ldw P_ADDR(arg0), t1
stw r4, 1*4(r3)
stw sp, U_PCB+PCB_KSP(t1)
stw r5, 2*4(r3)
stw r6, 3*4(r3)
stw r7, 4*4(r3)
stw r8, 5*4(r3)
stw r9, 6*4(r3)
stw r10, 7*4(r3)
stw r11, 8*4(r3)
stw r12, 9*4(r3)
stw r13, 10*4(r3)
stw r14, 11*4(r3)
stw r15, 12*4(r3)
stw r16, 13*4(r3)
stw r17, 14*4(r3)
stw r18, 15*4(r3)
fdc r0(t1)
stw r0, HPPA_FRAME_ARG(1)(sp)
sync
switch_exited
ldw P_ADDR(arg1), t2
ldw P_MD_REGS(arg1), t1
ldw U_PCB+PCB_KSP(t2), sp
mtctl r0, ccr
ldw TF_CR30(t1), t2
ldw TF_CR9(t1), t3
mtctl t2, cr30
mtctl t3, pidr2
ldo -(HPPA_FRAME_SIZE+16*4)(sp), r3
ldw HPPA_FRAME_ARG(0)(sp), arg0
ldw HPPA_FRAME_ARG(1)(sp), t4
sub,= r0, t4, r0
b switch_return
ldw 1*4(r3), r4
ldw 2*4(r3), r5
ldw 3*4(r3), r6
ldw 4*4(r3), r7
ldw 5*4(r3), r8
ldw 6*4(r3), r9
ldw 7*4(r3), r10
ldw 8*4(r3), r11
ldw 9*4(r3), r12
ldw 10*4(r3), r13
ldw 11*4(r3), r14
ldw 12*4(r3), r15
ldw 13*4(r3), r16
ldw 14*4(r3), r17
ldw 15*4(r3), r18
switch_return
ldw HPPA_FRAME_CRP(r3), rp
bv 0(rp)
ldwm -(HPPA_FRAME_SIZE+16*4)(sp), r3
EXIT(cpu_switchto)
LEAF_ENTRY(cpu_idle_enter)
bv 0(rp)
nop
EXIT(cpu_idle_enter)
LEAF_ENTRY(cpu_idle_cycle)
bv 0(rp)
nop
EXIT(cpu_idle_cycle)
LEAF_ENTRY(cpu_idle_leave)
bv 0(rp)
nop
EXIT(cpu_idle_leave)
ENTRY(proc_trampoline,0)
copy r0, r3
copy t4, r5
copy arg0, r4
bl proc_trampoline_mi, rp
nop
copy r4, arg0
copy r5, t4
.call
blr r0, rp
bv,n r0(t4)
nop
mfctl cr29, t1
ldw CI_CURPROC(t1), t2
.call
b $syscall_return
ldw P_MD_REGS(t2), t3
EXIT(proc_trampoline)
#ifdef MULTIPROCESSOR
ENTRY(hw_cpu_spinup_trampoline, 0)
rsm RESET_PSL, r0
nop ! nop ! nop ! nop ! nop ! nop
ldi HPPA_PID_KERNEL, r1
mtctl r1, pidr1
mtctl r1, pidr2
#if pbably_not_worth_it
mtctl r0, pidr3
mtctl r0, pidr4
#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
mtctl r0, ccr
ldi -1, r1
mtctl r0, eiem
mtctl r1, eirr
ldil L%$ivaaddr, t2
ldo R%$ivaaddr(t2), t2
mtctl t2, iva
ldil L%$global$,dp
ldo R%$global$(dp),dp
ldil L%cpu_hatch_info, r3
ldw R%cpu_hatch_info(r3), r3
mtctl r3, cr29
ldw CI_STACK(r3), sp
stw,ma r0, HPPA_FRAME_SIZE(sp)
stw r0, HPPA_FRAME_CRP(sp)
stw r0, HPPA_FRAME_PSP(sp)
ldil L%TFF_LAST, t1
stw t1, TF_FLAGS-TRAPFRAME_SIZEOF(sp)
ldil L%hppa_vtop, t1
ldw R%hppa_vtop(t1), t1
mtctl t1, CR_VTOP
ldil L%$q_enabled, t1
ldo R%$q_enabled(t1), t1
mtctl r0, pcsq
mtctl r0, pcsq
mtctl t1, pcoq
ldo 4(t1), t1
mtctl t1, pcoq
ldi PSL_Q|PSL_I, t2
mtctl t2, ipsw
rfi
nop
$q_enabled
ldil L%cpu_hw_init, r1
ldo R%cpu_hw_init(r1), r1
.import cpu_hw_init, code
.call
blr r0, rp
bv,n (r1)
nop
ldil L%$cpu_spinup_vm, t1
ldo R%$cpu_spinup_vm(t1), t1
mtctl r0, pcsq
mtctl r0, pcsq
mtctl t1, pcoq
ldo 4(t1), t1
mtctl t1, pcoq
mfctl cr29, t2
ldw CI_PSW(t2), t2
mtctl t2, ipsw
rfi
nop
$cpu_spinup_vm
b cpu_hatch
nop
EXIT(hw_cpu_spinup_trampoline)
#endif
.section .rodata
.align 4
.export sigcode, entry
.label sigcode
.proc
.callinfo frame=0,calls, save_rp, save_sp
.entry
sigcode:
bb,>=,n arg3, 30, sigcode_call
dep r0, 31, 2, arg3
ldw 4(arg3), r19
ldw 0(arg3), arg3
sigcode_call
.call
ble 0(sr0, arg3)
copy r31, rp
ldil L%SYSCALLGATE, r1
copy r4, arg0
.call
.globl sigcodecall
sigcodecall:
ble 4(sr7, r1)
ldi SYS_sigreturn, t1
.globl sigcoderet
sigcoderet:
break 0,0
ALTENTRY(esigcode)
EXIT(sigcode)
.globl sigfill
sigfill:
break 0,0
esigfill:
.align 4
.globl sigfillsiz
sigfillsiz:
.word esigfill - sigfill
.text
.end