aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2002-10-30 05:55:29 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2002-10-30 05:55:29 +0000
commit22d9ff469144738f060f17e98871a8d9745b7ef1 (patch)
treec2cd9b652fab7a16aa47dd7b2627da6d00254f4e
parent8db2431f617cfe75b482ad3cb441472100b2fdec (diff)
Notes
-rw-r--r--sys/ia64/ia64/genassym.c32
-rw-r--r--sys/ia64/ia64/locore.S2
-rw-r--r--sys/ia64/ia64/locore.s2
-rw-r--r--sys/ia64/ia64/machdep.c50
-rw-r--r--sys/ia64/ia64/swtch.s470
-rw-r--r--sys/ia64/ia64/vm_machdep.c22
-rw-r--r--sys/ia64/include/pcb.h89
7 files changed, 364 insertions, 303 deletions
diff --git a/sys/ia64/ia64/genassym.c b/sys/ia64/ia64/genassym.c
index 8dbc3948d578..4a0484225c6d 100644
--- a/sys/ia64/ia64/genassym.c
+++ b/sys/ia64/ia64/genassym.c
@@ -112,36 +112,10 @@ ASSYM(TF_R_R14, offsetof(struct trapframe, tf_r[FRAME_R14]));
ASSYM(TF_R_R15, offsetof(struct trapframe, tf_r[FRAME_R15]));
ASSYM(TF_F, offsetof(struct trapframe, tf_f));
-ASSYM(PCB_R4, offsetof(struct pcb, pcb_r4));
-ASSYM(PCB_R5, offsetof(struct pcb, pcb_r5));
-ASSYM(PCB_R6, offsetof(struct pcb, pcb_r6));
-ASSYM(PCB_R7, offsetof(struct pcb, pcb_r7));
-
-ASSYM(PCB_F2, offsetof(struct pcb, pcb_f2));
-ASSYM(PCB_F3, offsetof(struct pcb, pcb_f3));
-ASSYM(PCB_F4, offsetof(struct pcb, pcb_f4));
-ASSYM(PCB_F5, offsetof(struct pcb, pcb_f5));
-
-ASSYM(PCB_B0, offsetof(struct pcb, pcb_b0));
-ASSYM(PCB_B1, offsetof(struct pcb, pcb_b1));
-ASSYM(PCB_B2, offsetof(struct pcb, pcb_b2));
-ASSYM(PCB_B3, offsetof(struct pcb, pcb_b3));
-ASSYM(PCB_B4, offsetof(struct pcb, pcb_b4));
-ASSYM(PCB_B5, offsetof(struct pcb, pcb_b5));
-
-ASSYM(PCB_OLD_UNAT, offsetof(struct pcb, pcb_old_unat));
-ASSYM(PCB_SP, offsetof(struct pcb, pcb_sp));
-ASSYM(PCB_PFS, offsetof(struct pcb, pcb_pfs));
-ASSYM(PCB_BSPSTORE, offsetof(struct pcb, pcb_bspstore));
-
-ASSYM(PCB_UNAT, offsetof(struct pcb, pcb_unat));
-ASSYM(PCB_RNAT, offsetof(struct pcb, pcb_rnat));
-ASSYM(PCB_PR, offsetof(struct pcb, pcb_pr));
-ASSYM(PCB_PMAP, offsetof(struct pcb, pcb_pmap));
-
+ASSYM(PCB_CURRENT_PMAP, offsetof(struct pcb, pcb_current_pmap));
ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
-
-ASSYM(PCB_HIGHFP, offsetof(struct pcb, pcb_highfp));
+ASSYM(PCB_RP, offsetof(struct pcb, pcb_rp));
+ASSYM(PCB_UNAT47, offsetof(struct pcb, pcb_unat47));
ASSYM(UC_MCONTEXT_MC_AR_BSP, offsetof(ucontext_t, uc_mcontext.mc_ar_bsp));
ASSYM(UC_MCONTEXT_MC_AR_RNAT, offsetof(ucontext_t, uc_mcontext.mc_ar_rnat));
diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S
index c7dc7a74773c..726586db7996 100644
--- a/sys/ia64/ia64/locore.S
+++ b/sys/ia64/ia64/locore.S
@@ -120,7 +120,7 @@ ENTRY(__start, 1)
;;
ld8 out0=[out0]
;;
- add r16=PCB_B0,out0 // return to mi_startup_trampoline
+ add r16=PCB_RP,out0 // return to mi_startup_trampoline
movl r17=mi_startup_trampoline
;;
st8 [r16]=r17
diff --git a/sys/ia64/ia64/locore.s b/sys/ia64/ia64/locore.s
index c7dc7a74773c..726586db7996 100644
--- a/sys/ia64/ia64/locore.s
+++ b/sys/ia64/ia64/locore.s
@@ -120,7 +120,7 @@ ENTRY(__start, 1)
;;
ld8 out0=[out0]
;;
- add r16=PCB_B0,out0 // return to mi_startup_trampoline
+ add r16=PCB_RP,out0 // return to mi_startup_trampoline
movl r17=mi_startup_trampoline
;;
st8 [r16]=r17
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 4f739d2faa59..030f86291db6 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -704,7 +704,7 @@ ia64_init(u_int64_t arg1, u_int64_t arg2)
*/
thread0.td_frame = (struct trapframe *)thread0.td_pcb - 1;
thread0.td_pcb->pcb_sp = (u_int64_t)thread0.td_frame - 16;
- thread0.td_pcb->pcb_bspstore = (u_int64_t)proc0kstack;
+ thread0.td_pcb->pcb_ar_bsp = (u_int64_t)proc0kstack;
mutex_init();
@@ -1261,18 +1261,26 @@ fill_fpregs(td, fpregs)
struct thread *td;
struct fpreg *fpregs;
{
- fpregs->fpr_regs[2] = td->td_pcb->pcb_f2;
- fpregs->fpr_regs[3] = td->td_pcb->pcb_f3;
- fpregs->fpr_regs[4] = td->td_pcb->pcb_f4;
- fpregs->fpr_regs[5] = td->td_pcb->pcb_f5;
+ struct pcb *pcb = td->td_pcb;
- bcopy(td->td_frame->tf_f, fpregs->fpr_regs+6,
+ /*
+ * XXX - The PCB pointer should not point to the actual PCB,
+ * because it will not contain the preserved registers of
+ * the program being debugged. Instead, it should point to
+ * a PCB constructed by unwinding all the way up to the
+ * IVT handler.
+ */
+ bcopy(pcb->pcb_f + PCB_F2, fpregs->fpr_regs + 2,
+ sizeof(pcb->pcb_f[0]) * 4);
+
+ bcopy(td->td_frame->tf_f, fpregs->fpr_regs + 6,
sizeof(td->td_frame->tf_f));
- /* XXX f16-f31 */
+ bcopy(pcb->pcb_f + PCB_F16, fpregs->fpr_regs + 16,
+ sizeof(pcb->pcb_f[0]) * 16);
ia64_fpstate_save(td, 0);
- bcopy(td->td_pcb->pcb_highfp, fpregs->fpr_regs+32,
+ bcopy(pcb->pcb_highfp, fpregs->fpr_regs + 32,
sizeof(td->td_pcb->pcb_highfp));
return (0);
@@ -1283,18 +1291,30 @@ set_fpregs(td, fpregs)
struct thread *td;
struct fpreg *fpregs;
{
- td->td_pcb->pcb_f2 = fpregs->fpr_regs[2];
- td->td_pcb->pcb_f3 = fpregs->fpr_regs[3];
- td->td_pcb->pcb_f4 = fpregs->fpr_regs[4];
- td->td_pcb->pcb_f5 = fpregs->fpr_regs[5];
+ struct pcb *pcb = td->td_pcb;
+
+ /*
+ * XXX - The PCB pointer should not point to the actual PCB,
+ * because it will not contain the preserved registers of
+ * the program being debugged. Instead, it should point to
+ * a PCB constructed by unwinding all the way up to the
+ * IVT handler.
+ * XXX - An additional complication here is that we need to
+ * have the actual location of where the values should be
+ * stored as well. Some values may still reside in registers,
+ * while other may have been saved somewhere.
+ */
+ bcopy(fpregs->fpr_regs + 2, pcb->pcb_f + PCB_F2,
+ sizeof(pcb->pcb_f[0]) * 4);
- bcopy(fpregs->fpr_regs+6, td->td_frame->tf_f,
+ bcopy(fpregs->fpr_regs + 6, td->td_frame->tf_f,
sizeof(td->td_frame->tf_f));
- /* XXX f16-f31 */
+ bcopy(fpregs->fpr_regs + 16, pcb->pcb_f + PCB_F16,
+ sizeof(pcb->pcb_f[0]) * 16);
ia64_fpstate_drop(td);
- bcopy(fpregs->fpr_regs+32, td->td_pcb->pcb_highfp,
+ bcopy(fpregs->fpr_regs + 32, pcb->pcb_highfp,
sizeof(td->td_pcb->pcb_highfp));
return (0);
diff --git a/sys/ia64/ia64/swtch.s b/sys/ia64/ia64/swtch.s
index da1e270bbd6d..b17c92aed0ec 100644
--- a/sys/ia64/ia64/swtch.s
+++ b/sys/ia64/ia64/swtch.s
@@ -31,175 +31,304 @@
#include "assym.s"
/*
- * pcb_save: save process context, i.e. callee-saved registers. This
+ * pcb_save - save process context, i.e. callee-saved registers. This
* function is called by savectx() and cpu_switch().
*
+ * The callee-saved (ie preserved) registers are:
+ * r4-r7
+ * f2-f5, f16-f31
+ * p1-p5, p16-p63
+ * b1-b5
+ * ar.unat, ar.lc
+ *
+ * Notes:
+ * o We don't need to save and restore gp because its value is constant.
+ * o We don't need to save and restore ar.rsc because its value is known.
+ * o We don't need to save and restore r13 because it always points to
+ * the pcpu structure.
+ *
* Arguments:
- * in0 'struct pcb *' of the process that needs its context saved.
- * in1 return address.
+ * r8 'struct pcb *' of the process that needs its context saved.
+ * b6 return address.
*/
-
-ENTRY(pcb_save,2)
-{ .mmi
- flushrs // push out caller's dirty regs
- mov r22=ar.unat // caller's value for ar.unat
- mov r16=in0
+ENTRY(pcb_save,0)
+{ .mii
+ mov r16=ar.unat
+ add r9=8,r8
+ mov r17=b0
;;
}
{ .mmi
- mov ar.rsc=0 // stop the RSE after the flush
- ;;
- mov r22=ar.rnat // read RSE's NaT collection
- add r17=8,r16
+ st8 [r8]=r12,16 // sp
+ st8 [r9]=r16,16 // ar.unat
+ mov r18=pr
;;
}
{ .mmi
- .mem.offset 0,0
- st8.spill [r16]=r4,16 // save r4, ofs=&r6
- .mem.offset 8,0
- st8.spill [r17]=r5,16 // save r5, ofs=&r7
- mov r18=b0
+ st8 [r8]=r17,16 // rp
+ st8 [r9]=r18,24 // pr
+ add r31=PC_CURRENT_PMAP,r13
;;
}
-{ .mmi
- .mem.offset 16,0
- st8.spill [r16]=r6,16 // save r6, ofs=&f2
- .mem.offset 24,0
- st8.spill [r17]=r7,24 // save r7, ofs=&f3
- mov r19=b1
+ stf.spill [r8]=f2,32
+ stf.spill [r9]=f3,32
;;
-}
-{ .mmi
- stf.spill [r16]=f2,32 // save f2, ofs=&f4
- stf.spill [r17]=f3,32 // save f3, ofs=&f5
- mov r20=b2
+ stf.spill [r8]=f4,32
+ stf.spill [r9]=f5,32
;;
-}
-{ .mmi
- stf.spill [r16]=f4,32 // save f4, ofs=&b0
- stf.spill [r17]=f5,24 // save f5, ofs=&b1
- mov r21=b3
+ stf.spill [r8]=f16,32
+ stf.spill [r9]=f17,32
;;
-}
-{ .mmi
- st8 [r16]=r18,16 // save b0, ofs=&b2
- st8 [r17]=r19,16 // save b1, ofs=&b3
- mov r18=b4
+ stf.spill [r8]=f18,32
+ stf.spill [r9]=f19,32
+ ;;
+ stf.spill [r8]=f20,32
+ stf.spill [r9]=f21,32
+ ;;
+ stf.spill [r8]=f22,32
+ stf.spill [r9]=f23,32
+ ;;
+ stf.spill [r8]=f24,32
+ stf.spill [r9]=f25,32
+ ;;
+ stf.spill [r8]=f26,32
+ stf.spill [r9]=f27,32
+ ;;
+ stf.spill [r8]=f28,32
+ stf.spill [r9]=f29,32
+ ;;
+ stf.spill [r8]=f30,32
+ stf.spill [r9]=f31,24 // BEWARE
;;
-}
{ .mmi
- st8 [r16]=r20,16 // save b2, ofs=&b4
- st8 [r17]=r21,16 // save b3, ofs=&b5
- mov r19=b5
+ .mem.offset 0,0
+ st8.spill [r8]=r4,16
+ .mem.offset 8,0
+ st8.spill [r9]=r5,16
+ mov r17=b1
;;
}
{ .mmi
- st8 [r16]=r18,16 // save b4, ofs=&old_unat
- st8 [r17]=r19,16 // save b5, ofs=&sp
- mov r18=ar.pfs
+ .mem.offset 16,0
+ st8.spill [r8]=r6,16
+ .mem.offset 24,0
+ st8.spill [r9]=r7,16
+ mov r18=b2
;;
}
{ .mmi
- st8 [r16]=r22,16 // save old_unat, ofs=&pfs
- st8 [r17]=sp,16 // save sp, ofs=&bspstore
- mov r19=ar.lc
+ flushrs
+ mov r16=ar.unat
+ mov r19=b3
;;
}
{ .mmi
- mov r20=ar.bspstore
- mov r21=ar.unat
- add r23=PC_CURRENT_PMAP,r13
+ st8 [r8]=r16,16 // ar.unat
+ st8 [r9]=r17,16 // b1
+ mov r20=b4
;;
}
{ .mmi
- st8 [r16]=r18,16 // save pfs, ofs=&lc
- st8 [r17]=r20,16 // save bspstore, ofs=&unat
- mov r18=pr
+ st8 [r8]=r18,16 // b2
+ st8 [r9]=r19,16 // b3
+ mov r21=b5
;;
}
+ st8 [r8]=r20,16 // b4
+ st8 [r9]=r21,16 // b5
+ ;;
{ .mmi
- st8 [r16]=r19,16 // save lc, ofs=&rnat
- st8 [r17]=r21,16 // save unat, ofs=&pr
- mov b6=in1
+ mov ar.rsc=0
+ mov r16=ar.bsp
+ mov r17=ar.pfs
;;
}
{ .mmi
- st8 [r16]=r22,16 // save rnat, ofs=&pmap
- st8 [r17]=r18,16 // save pr, ofs=&ar.fsr
- nop 1
+ st8 [r8]=r16,16 // ar.bsp
+ st8 [r9]=r17,16 // ar.pfs
+ mov r18=ar.lc
;;
}
-{ .mmb
- ld8 r19=[r23]
- mov r18=ar.fsr
- nop 2
+ mov r17=ar.rnat
+ ld8 r19=[r31]
;;
-}
-{ .mmi
- st8 [r16]=r19,16 // save pmap, ofs=&ar.fcr
- st8 [r17]=r18,16 // save ar.fsr, ofs=&ar.fir
- nop 3
+ st8 [r8]=r17,16 // ar.rnat
+ st8 [r9]=r18,16 // ar.lc
;;
-}
-{ .mmb
- mov r19=ar.fcr
- mov r18=ar.fir
- nop 4
+ st8 [r8]=r19,16 // pc_current_pmap
+ mov r16=ar.fcr
;;
-}
-{ .mmi
- st8 [r16]=r19,16 // save ar.fcr, ofs=&ar.fdr
- st8 [r17]=r18,16 // save ar.fir, ofs=&ar.eflag
- nop 5
+ st8 [r9]=r16,16 // ar.fcr
+ mov r17=ar.eflag
+ ;;
+ st8 [r8]=r17,16 // ar.eflag
+ mov r16=ar.csd
+ ;;
+ st8 [r9]=r16,16 // ar.csd
+ mov r17=ar.ssd
+ ;;
+ st8 [r8]=r17,16 // ar.ssd
+ mov r16=ar.fsr
+ ;;
+ st8 [r9]=r16,16 // ar.fsr
+ mov r17=ar.fir
+ ;;
+ st8 [r8]=r17,16 // ar.fir
+ mov r16=ar.fdr
;;
-}
{ .mmb
- mov r19=ar.fdr
- mov r18=ar.eflag
- nop 6
+ st8 [r9]=r16,16 // ar.fdr
+ mov ar.rsc=3
+ br.sptk.many b6
;;
}
+END(pcb_save)
+
+/*
+ * pcb_restore - restore a process context. This does not return.
+ *
+ * Arguments:
+ * r8 'struct pcb *' of the process that needs its context saved.
+ */
+ENTRY(pcb_restore,0)
+ mov ar.rsc=0
+ add r9=8,r8
+ add r31=PCB_UNAT47,r8
+ ;;
+ ld8 r12=[r8],16 // sp
+ ld8 r30=[r9],16 // ar.unat
+ ;;
+ ld8 r16=[r8],16 // rp
+ ld8 r17=[r9],24 // pr
+ ;;
+ ldf.fill f2=[r8],32
+ ldf.fill f3=[r9],32
+ mov b0=r16
+ ;;
+ ldf.fill f4=[r8],32
+ ldf.fill f5=[r9],32
+ mov pr=r17,0x1fffe
+ ;;
+ ldf.fill f16=[r8],32
+ ldf.fill f17=[r9],32
+ ;;
+ ldf.fill f18=[r8],32
+ ldf.fill f19=[r9],32
+ ;;
+ ldf.fill f20=[r8],32
+ ldf.fill f21=[r9],32
+ ;;
+ ldf.fill f22=[r8],32
+ ldf.fill f23=[r9],32
+ ;;
+ ldf.fill f24=[r8],32
+ ldf.fill f25=[r9],32
+ ;;
+ ldf.fill f26=[r8],32
+ ldf.fill f27=[r9],32
+ ;;
+ ldf.fill f28=[r8],32
+ ldf.fill f29=[r9],32
+ ;;
+ ldf.fill f30=[r8],32
+ ldf.fill f31=[r9],24 // BEWARE
+ ;;
+ ld8 r16=[r31]
+ ;;
+ mov ar.unat=r16
+ ;;
+ .mem.offset 0,0
+ ld8.fill r4=[r8],16
+ .mem.offset 8,0
+ ld8.fill r5=[r9],16
+ ;;
+ .mem.offset 16,0
+ ld8.fill r6=[r8],24
+ .mem.offset 24,0
+ ld8.fill r7=[r9],24
+ ;;
+ loadrs
+ mov ar.unat=r30
+ ;;
+ ld8 r16=[r8],16 // b1
+ ld8 r17=[r9],16 // b2
+ ;;
+ ld8 r18=[r8],16 // b3
+ ld8 r19=[r9],16 // b4
+ mov b1=r16
+ ;;
+ ld8 r20=[r8],16 // b5
+ ld8 r21=[r9],16 // ar.bsp
+ mov b2=r17
+ ;;
+ ld8 r22=[r8],16 // ar.pfs
+ ld8 r23=[r9],24 // ar.rnat
+ mov b3=r18
+ ;;
+ ld8 r24=[r8],24 // ar.lc
+ mov b4=r19
+ mov b5=r20
+ ;;
{ .mmi
- st8 [r16]=r19,16 // save ar.fdr, ofs=&ar.csd
- st8 [r17]=r18,16 // save ar.eflag, ofs=&ssd
- nop 7
+ mov ar.bspstore=r21
;;
-}
-{ .mmb
- mov r19=ar.csd
- mov r18=ar.ssd
- nop 8
+ mov ar.rnat=r23
+ mov ar.pfs=r22
;;
}
{ .mmi
- st8 [r16]=r19 // save ar.csd
- st8 [r17]=r18 // save ar.ssd
- nop 9
+ invala
+ ;;
+ ld8 r16=[r9],16 // ar.fcr
+ mov r18=ar.lc
+ ;;
}
-{ .mib
- mov ar.rsc=3 // turn RSE back on
- mov ret0=r0
- br.sptk.few b6
+ ld8 r17=[r8],16 // ar.eflag
+ mov ar.fcr=r16
+ ;;
+ ld8 r16=[r9],16 // ar.csd
+ mov ar.eflag=r17
+ ;;
+ ld8 r17=[r8],16 // ar.ssd
+ mov ar.csd=r16
+ ;;
+ ld8 r16=[r9],16 // ar.fsr
+ mov ar.ssd=r17
+ ;;
+ ld8 r17=[r8],16 // ar.fir
+ mov ar.fsr=r16
+ ;;
+ ld8 r16=[r9],16 // ar.fdr
+ mov ar.fir=r17
+ ;;
+{ .mmb
+ mov ar.fdr=r16
+ mov ar.rsc=3
+ br.ret.sptk b0
;;
}
-END(pcb_save)
+END(pcb_restore)
+/*
+ * savectx - Save current context.
+ */
ENTRY(savectx,1)
{ .mii
-1: alloc r16=ar.pfs,0,0,2,0
+1: nop 1
mov r17=ip
;;
- add r33=2f-1b,r17
+ add r16=2f-1b,r17
+ ;;
}
-{ .mfb
- nop 1
- nop 2
- br.sptk.few pcb_save
+{ .mib
+ mov r8=r32
+ mov b6=r16
+ br.sptk.many pcb_save
}
{ .mfb
-2: nop 3
- nop 4
- br.ret.sptk rp
+2: nop 2
+ nop 3
+ br.ret.sptk rp
}
END(savectx)
@@ -213,18 +342,15 @@ END(savectx)
* Does not return. We arrange things so that savectx appears to
* return a second time with a non-zero return value.
*/
-
ENTRY(restorectx, 1)
-
- mov r15=in0
- br.cond.sptk.many 4f
-
+ mov r8=in0
+ br.cond.sptk.many pcb_restore
+ ;;
END(restorectx)
ENTRY(cpu_throw, 0)
-
- br.sptk.few 2f
-
+ br.sptk.many 2f
+ ;;
END(cpu_throw)
ENTRY(cpu_switch, 0)
@@ -233,16 +359,17 @@ ENTRY(cpu_switch, 0)
mov r17=ip
;;
}
- add r33=1f-1b,r17
+ add r16=1f-1b,r17
add r17=PC_CURTHREAD,r13
;;
ld8 r17=[r17]
;;
add r17=TD_PCB,r17
+ mov b6=r16
+ ;;
+ ld8 r8=[r17]
+ br.sptk.many pcb_save
;;
- ld8 r32=[r17]
- br.sptk.few pcb_save
-
1:
#ifdef SMP
add r17 = PC_CPUID, r13
@@ -263,10 +390,8 @@ ENTRY(cpu_switch, 0)
br.sptk 3f
#endif
-2: srlz.i
- mf
- ;;
- br.call.sptk.few rp=choosethread
+2: br.call.sptk.few rp=choosethread
+ ;;
mov r4=ret0 // save from call
3:
@@ -276,6 +401,7 @@ ENTRY(cpu_switch, 0)
ld8 out0=[r14]
mov out1=1
br.call.sptk.few rp=ia64_fpstate_save // clear fpcurthread
+ ;;
#endif
add r14=PC_CURTHREAD,r13
@@ -287,96 +413,20 @@ ENTRY(cpu_switch, 0)
;;
ld8 r15=[r15]
;;
- add r15=PCB_PMAP,r15 // &pcb_pmap
+ add r15=PCB_CURRENT_PMAP,r15 // &pcb_pmap
;;
ld8 out0=[r15]
br.call.sptk.few rp=pmap_install // install RIDs etc.
-
+ ;;
add r15=TD_PCB,r4
add r16=TD_KSTACK,r4
;;
- ld8 r15=[r15]
+ ld8 r8=[r15]
ld8 r16=[r16]
;;
mov ar.k5=r16
-
- // pcb_restore
-4:
- add r3=PCB_UNAT,r15 // point at NaT for r4..r7
- mov ar.rsc=0 ;; // switch off the RSE
- ld8 r16=[r3] // load NaT for r4..r7
- ;;
- mov ar.unat=r16
- ;;
- ld8.fill r4=[r15],8 ;; // restore r4
- ld8.fill r5=[r15],8 ;; // restore r5
- ld8.fill r6=[r15],8 ;; // restore r6
- ld8.fill r7=[r15],8 ;; // restore r7
-
- ldf.fill f2=[r15],16 ;; // restore f2
- ldf.fill f3=[r15],16 ;; // restore f3
- ldf.fill f4=[r15],16 ;; // restore f4
- ldf.fill f5=[r15],16 ;; // restore f5
-
- ld8 r16=[r15],8 ;; // restore b0
- ld8 r17=[r15],8 ;; // restore b1
- ld8 r18=[r15],8 ;; // restore b2
- ld8 r19=[r15],8 ;; // restore b3
- ld8 r20=[r15],8 ;; // restore b4
- ld8 r21=[r15],8 ;; // restore b5
-
- mov b0=r16
- mov b1=r17
- mov b2=r18
- mov b3=r19
- mov b4=r20
- mov b5=r21
-
- ld8 r16=[r15],8 ;; // caller's ar.unat
- ld8 sp=[r15],8 ;; // stack pointer
- ld8 r17=[r15],8 ;; // ar.pfs
- ld8 r18=[r15],8 ;; // ar.bspstore
- ld8 r21=[r15],16 ;; // ar.lc, skip ar.unat
- ld8 r19=[r15],8 ;; // ar.rnat
- ld8 r20=[r15],16 ;; // pr, skip pmap
-
- loadrs // invalidate register stack
- ;;
- mov ar.unat=r16
- mov ar.pfs=r17
- mov ar.lc=r21
- mov ar.bspstore=r18 ;;
- mov ar.rnat=r19
- mov pr=r20,0x1ffff
- ;;
- ld8 r16=[r15],8 // ar.fsr
- ;;
- ld8 r17=[r15],8 // ar.fcr
- mov ar.fsr=r16
- ;;
- ld8 r16=[r15],8 // ar.fir
- mov ar.fcr=r17
- ;;
- ld8 r17=[r15],8 // ar.fdr
- mov ar.fir=r16
- ;;
- ld8 r16=[r15],8 // ar.eflag
- mov ar.fdr=r17
- ;;
- ld8 r17=[r15],8 // ar.csd
- mov ar.eflag=r16
- ;;
- ld8 r16=[r15],8 // ar.ssd
- mov ar.csd=r17
- ;;
- mov ar.ssd=r16
-
- mov ar.rsc=3 // restart RSE
- invala
+ br.cond.sptk pcb_restore
;;
-9:
- br.ret.sptk.few rp
-
END(cpu_switch)
/*
@@ -397,13 +447,13 @@ ENTRY(savehighfp, 1)
;;
stf.spill [in0]=f36,32
stf.spill [r14]=f37,32
- ;;
+ ;;
stf.spill [in0]=f38,32
stf.spill [r14]=f39,32
- ;;
+ ;;
stf.spill [in0]=f40,32
stf.spill [r14]=f41,32
- ;;
+ ;;
stf.spill [in0]=f42,32
stf.spill [r14]=f43,32
;;
@@ -721,5 +771,5 @@ ENTRY(fork_trampoline, 0)
br.call.sptk.few rp=fork_exit
;;
br.cond.sptk.many exception_restore
-
- END(fork_trampoline)
+ ;;
+END(fork_trampoline)
diff --git a/sys/ia64/ia64/vm_machdep.c b/sys/ia64/ia64/vm_machdep.c
index f0cdab092309..6a634820c722 100644
--- a/sys/ia64/ia64/vm_machdep.c
+++ b/sys/ia64/ia64/vm_machdep.c
@@ -215,7 +215,7 @@ cpu_fork(td1, p2, td2, flags)
if (p2tf->tf_cr_ipsr & IA64_PSR_IS) {
p2tf->tf_r[FRAME_R8] = 0; /* child returns zero (eax) */
p2tf->tf_r[FRAME_R10] = 1; /* is child (edx) */
- td2->td_pcb->pcb_eflag &= ~PSL_C; /* no error */
+ td2->td_pcb->pcb_ar_eflag &= ~PSL_C; /* no error */
} else {
p2tf->tf_r[FRAME_R8] = 0; /* child's pid (linux) */
p2tf->tf_r[FRAME_R9] = 1; /* is child (FreeBSD) */
@@ -282,10 +282,10 @@ cpu_fork(td1, p2, td2, flags)
* straight into exception_restore. Also initialise its
* pmap to the containing proc's vmspace.
*/
- td2->td_pcb->pcb_bspstore = (u_int64_t)p2bs + td1->td_frame->tf_ndirty;
- td2->td_pcb->pcb_rnat = rnat;
- td2->td_pcb->pcb_pfs = 0;
- td2->td_pcb->pcb_pmap = (u_int64_t)
+ td2->td_pcb->pcb_ar_bsp = (u_int64_t)p2bs + td1->td_frame->tf_ndirty;
+ td2->td_pcb->pcb_ar_rnat = rnat;
+ td2->td_pcb->pcb_ar_pfs = 0;
+ td2->td_pcb->pcb_current_pmap = (u_int64_t)
vmspace_pmap(td2->td_proc->p_vmspace);
/*
@@ -298,10 +298,10 @@ cpu_fork(td1, p2, td2, flags)
* available as scratch space.
*/
td2->td_pcb->pcb_sp = (u_int64_t)p2tf - 16;
- td2->td_pcb->pcb_r4 = (u_int64_t)fork_return;
- td2->td_pcb->pcb_r5 = FDESC_FUNC(exception_restore);
- td2->td_pcb->pcb_r6 = (u_int64_t)td2;
- td2->td_pcb->pcb_b0 = FDESC_FUNC(fork_trampoline);
+ td2->td_pcb->pcb_r[PCB_R4] = (u_int64_t)fork_return;
+ td2->td_pcb->pcb_r[PCB_R5] = FDESC_FUNC(exception_restore);
+ td2->td_pcb->pcb_r[PCB_R6] = (u_int64_t)td2;
+ td2->td_pcb->pcb_rp = FDESC_FUNC(fork_trampoline);
}
/*
@@ -316,8 +316,8 @@ cpu_set_fork_handler(td, func, arg)
void (*func)(void *);
void *arg;
{
- td->td_pcb->pcb_r4 = (u_int64_t) func;
- td->td_pcb->pcb_r6 = (u_int64_t) arg;
+ td->td_pcb->pcb_r[PCB_R4] = (u_int64_t) func;
+ td->td_pcb->pcb_r[PCB_R6] = (u_int64_t) arg;
}
/*
diff --git a/sys/ia64/include/pcb.h b/sys/ia64/include/pcb.h
index beba3544d671..c5ee14574c03 100644
--- a/sys/ia64/include/pcb.h
+++ b/sys/ia64/include/pcb.h
@@ -33,46 +33,63 @@
* PCB: process control block
*/
struct pcb {
- u_int64_t pcb_r4;
- u_int64_t pcb_r5;
- u_int64_t pcb_r6;
- u_int64_t pcb_r7;
+ uint64_t pcb_sp;
+ uint64_t pcb_ar_unat;
+ uint64_t pcb_rp;
+ uint64_t pcb_pr;
+ struct ia64_fpreg pcb_f[20];
+#define PCB_F2 0
+#define PCB_F3 1
+#define PCB_F4 2
+#define PCB_F5 3
+#define PCB_F16 4
+#define PCB_F17 5
+#define PCB_F18 6
+#define PCB_F19 7
+#define PCB_F20 8
+#define PCB_F21 9
+#define PCB_F22 10
+#define PCB_F23 11
+#define PCB_F24 12
+#define PCB_F25 13
+#define PCB_F26 14
+#define PCB_F27 15
+#define PCB_F28 16
+#define PCB_F29 17
+#define PCB_F30 18
+#define PCB_F31 19
+ uint64_t pcb_r[4];
+#define PCB_R4 0
+#define PCB_R5 1
+#define PCB_R6 2
+#define PCB_R7 3
+ uint64_t pcb_unat47;
+ uint64_t pcb_b[5];
+#define PCB_B1 0
+#define PCB_B2 1
+#define PCB_B3 2
+#define PCB_B4 3
+#define PCB_B5 4
+ uint64_t pcb_ar_bsp;
+ uint64_t pcb_ar_pfs;
+ uint64_t pcb_ar_rnat;
+ uint64_t pcb_ar_lc;
- struct ia64_fpreg pcb_f2;
- struct ia64_fpreg pcb_f3;
- struct ia64_fpreg pcb_f4;
- struct ia64_fpreg pcb_f5;
+ uint64_t pcb_current_pmap;
- u_int64_t pcb_b0; /* really restart address */
- u_int64_t pcb_b1;
- u_int64_t pcb_b2;
- u_int64_t pcb_b3;
- u_int64_t pcb_b4;
- u_int64_t pcb_b5;
-
- u_int64_t pcb_old_unat; /* caller's ar.unat */
- u_int64_t pcb_sp;
- u_int64_t pcb_pfs;
- u_int64_t pcb_bspstore;
- u_int64_t pcb_lc;
-
- u_int64_t pcb_unat; /* ar.unat for r4..r7 */
- u_int64_t pcb_rnat;
- u_int64_t pcb_pr; /* predicates */
- u_int64_t pcb_pmap; /* current pmap */
-
- u_int64_t pcb_fsr;
- u_int64_t pcb_fcr;
- u_int64_t pcb_fir;
- u_int64_t pcb_fdr;
- u_int64_t pcb_eflag;
- u_int64_t pcb_csd;
- u_int64_t pcb_ssd;
-
- u_int64_t pcb_onfault; /* for copy faults */
- u_int64_t pcb_accessaddr; /* for [fs]uswintr */
+ uint64_t pcb_ar_fcr;
+ uint64_t pcb_ar_eflag;
+ uint64_t pcb_ar_csd;
+ uint64_t pcb_ar_ssd;
+ uint64_t pcb_ar_fsr;
+ uint64_t pcb_ar_fir;
+ uint64_t pcb_ar_fdr;
+ /* Aligned! */
struct ia64_fpreg pcb_highfp[96]; /* f32-f127 */
+
+ uint64_t pcb_onfault; /* for copy faults */
+ uint64_t pcb_accessaddr; /* for [fs]uswintr */
};
#ifdef _KERNEL