Track FPU register save status.

This commit is contained in:
scw 2002-07-10 15:49:33 +00:00
parent ceb5ffc06a
commit 0f3678d589
2 changed files with 32 additions and 7 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu_switch.S,v 1.1 2002/07/05 13:32:04 scw Exp $ */
/* $NetBSD: cpu_switch.S,v 1.2 2002/07/10 15:49:33 scw Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@ -85,7 +85,7 @@
*
* On entry, r1 must be the value of USR for the process
*/
#define SAVE_CTX(pcb) \
#define SAVE_CTX(pcb,mdf) \
gettr tr5, r0 /* Save target regs */ ;\
st.q pcb, PCB_CTX_REGS_TR5, r0 ;\
gettr tr6, r0 ;\
@ -128,6 +128,12 @@
shlri r0, SH5_CONREG_SR_FD_SHIFT, r0 ;\
andi r0, 1, r0 ;\
bne/u r0, r63, tr0 /* Skip FP save if FPU disabled */ ;\
andi mdf, MDP_FPSAVED, r0 /* Skip FP save if already done */ ;\
beq/u r0, r63, tr0 ;\
shlri r1, 8, mdf ;\
andi mdf, 0xff, mdf ;\
cmpgt mdf, r63, mdf /* mdf = MDP_FPUSED if fpregs dirty */;\
ori mdf, MDP_FPSAVED, mdf ;\
FPSV(pcb,PCB_CTX_FPREGS_DR0,dr0,dr2,dr4,dr6) ;\
FPSV(pcb,PCB_CTX_FPREGS_DR8,dr8,dr10,dr12,dr14) ;\
FPSV(pcb,PCB_CTX_FPREGS_DR16,dr16,dr18,dr20,dr22) ;\
@ -150,7 +156,7 @@
* On entry, r1 must be the value of USR for the process
* Note: Does not restore the Status Register
*/
#define RESTORE_CTX(pcb) \
#define RESTORE_CTX(pcb,mdf) \
ld.q pcb, PCB_CTX_REGS_TR5, r0 ;\
ptabs/u r0, tr5 /* Restore target regs */ ;\
ld.q pcb, PCB_CTX_REGS_TR6, r0 ;\
@ -192,6 +198,8 @@
shlri r0, SH5_CONREG_SR_FD_SHIFT, r0 ;\
andi r0, 1, r0 ;\
bne/u r0, r63, tr0 /* Skip FP restore if FPU disabled */ ;\
andi mdf, MDP_FPSAVED, r0 /* Skip if FP state wasn't saved */ ;\
beq/u r0, r63, tr0 ;\
fld.d pcb, PCB_CTX_FPREGS_FPSCR, dr0 ;\
fputscr fr0 ;\
FPRS(pcb,PCB_CTX_FPREGS_DR0,dr0,dr2,dr4,dr6) ;\
@ -284,9 +292,13 @@ ENTRY(cpu_switch)
getcon kcr0, r0
LDPTR r0, CI_CURPCB, r2 /* Fetch curpcb */
LDPTR r0, CI_CURPROC, r0 /* Fetch curproc */
ld.l r0, P_MD_FLAGS, r3 /* Fetch md_flags */
LDPTR r0, P_MD_REGS, r0 /* Fetch pointer to trapframe */
ld.q r0, TF_USR, r1 /* Fetch saved USR */
SAVE_CTX(r2) /* Save process context */
SAVE_CTX(r2,r3) /* Save process context */
getcon kcr0, r0
LDPTR r0, CI_CURPROC, r0 /* Fetch curproc */
st.l r0, P_MD_FLAGS, r3 /* Save FP state */
Lsw1:
pta/u _C_LABEL(idle), tr0
@ -367,8 +379,9 @@ Lsw2:
2:
LDPTR r2, P_MD_REGS, r1 /* Fetch pointer to trapframe */
ld.l r2, P_MD_FLAGS, r4
ld.q r1, TF_USR, r1 /* Fetch saved USR */
RESTORE_CTX(r3) /* Switch context to the new process */
RESTORE_CTX(r3,r4) /* Switch context to the new process */
/*
* We're running in the new process context. Only caller-saved
@ -448,14 +461,22 @@ ENTRY(switch_exit)
* int sh5_fpsave(u_int usr, struct pcb *pcb)
*
* Save FP state in the PCB
*
* Returns a value suitable for storing in curproc->p_md.md_flags to
* indicate if the FPU state was used/saved.
*/
ENTRY(sh5_fpsave)
ptabs/l r18, tr0
getcon sr, r0
or r2, r63, r1
movi 0, r2
shlri r0, SH5_CONREG_SR_FD_SHIFT, r0
andi r0, 1, r0
bne/u r0, r63, tr0 /* Skip FP save if FPU disabled */
shlri r1, 8, r0
andi r0, 0xff, r0
cmpgt r0, r63, r2 /* r2 = MDP_FPUSED if fpregs dirty */
ori r2, MDP_FPSAVED, r2
FPSV(r3,PCB_CTX_FPREGS_DR0,dr0,dr2,dr4,dr6)
FPSV(r3,PCB_CTX_FPREGS_DR8,dr8,dr10,dr12,dr14)
FPSV(r3,PCB_CTX_FPREGS_DR16,dr16,dr18,dr20,dr22)
@ -471,7 +492,7 @@ ENTRY(sh5_fpsave)
/******************************************************************************
*
* int sh5_fprestore(u_int usr, struct pcb *pcb)
* void sh5_fprestore(u_int usr, struct pcb *pcb)
*
* Restore FP state from the PCB
*/

View File

@ -1,4 +1,4 @@
# $NetBSD: genassym.cf,v 1.1 2002/07/05 13:32:04 scw Exp $
# $NetBSD: genassym.cf,v 1.2 2002/07/10 15:49:33 scw Exp $
# Copyright 2002 Wasabi Systems, Inc.
# All rights reserved.
@ -239,8 +239,12 @@ define P_WCHAN offsetof(struct proc, p_wchan)
define P_MD_SYSCALL offsetof(struct proc, p_md.md_syscall)
define P_MD_ASTPENDING offsetof(struct proc, p_md.md_astpending)
define P_MD_REGS offsetof(struct proc, p_md.md_regs)
define P_MD_FLAGS offsetof(struct proc, p_md.md_flags)
define PH_LINK offsetof(struct prochd, ph_link)
define MDP_FPUSED MDP_FPUSED
define MDP_FPSAVED MDP_FPSAVED
define T_TRAP T_TRAP
define T_AST T_AST
define T_WTLBMISS T_WTLBMISS