Rewrite cpu_switch(). The most notable change is the fact that we now

have f16-f31 as part of the context. The PCB has been reorganized to
better match how we save and restore the (preserved) registers. This
commit also moves the context restoriation to its own function (named
pcb_restore), as we did with pcb_save.

Only minimal effort has been put in writing optimal assembly. The
expectation is that there will be more rounds of changes.
This commit is contained in:
Marcel Moolenaar 2002-10-30 05:55:29 +00:00
parent 8db2431f61
commit 22d9ff4691
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106189
7 changed files with 397 additions and 336 deletions

View File

@ -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));

View File

@ -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

View File

@ -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

View File

@ -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;
bcopy(fpregs->fpr_regs+6, td->td_frame->tf_f,
/*
* 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,
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);

View File

@ -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
;;
}
{ .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
;;
}
{ .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
;;
}
{ .mmi
stf.spill [r16]=f2,32 // save f2, ofs=&f4
stf.spill [r17]=f3,32 // save f3, ofs=&f5
mov r20=b2
;;
}
{ .mmi
stf.spill [r16]=f4,32 // save f4, ofs=&b0
stf.spill [r17]=f5,24 // save f5, ofs=&b1
mov r21=b3
;;
}
{ .mmi
st8 [r16]=r18,16 // save b0, ofs=&b2
st8 [r17]=r19,16 // save b1, ofs=&b3
mov r18=b4
;;
}
{ .mmi
st8 [r16]=r20,16 // save b2, ofs=&b4
st8 [r17]=r21,16 // save b3, ofs=&b5
mov r19=b5
;;
}
{ .mmi
st8 [r16]=r18,16 // save b4, ofs=&old_unat
st8 [r17]=r19,16 // save b5, ofs=&sp
mov r18=ar.pfs
;;
}
{ .mmi
st8 [r16]=r22,16 // save old_unat, ofs=&pfs
st8 [r17]=sp,16 // save sp, ofs=&bspstore
mov r19=ar.lc
;;
}
{ .mmi
mov r20=ar.bspstore
mov r21=ar.unat
add r23=PC_CURRENT_PMAP,r13
;;
}
{ .mmi
st8 [r16]=r18,16 // save pfs, ofs=&lc
st8 [r17]=r20,16 // save bspstore, ofs=&unat
st8 [r8]=r12,16 // sp
st8 [r9]=r16,16 // ar.unat
mov r18=pr
;;
}
{ .mmi
st8 [r16]=r19,16 // save lc, ofs=&rnat
st8 [r17]=r21,16 // save unat, ofs=&pr
mov b6=in1
st8 [r8]=r17,16 // rp
st8 [r9]=r18,24 // pr
add r31=PC_CURRENT_PMAP,r13
;;
}
stf.spill [r8]=f2,32
stf.spill [r9]=f3,32
;;
stf.spill [r8]=f4,32
stf.spill [r9]=f5,32
;;
stf.spill [r8]=f16,32
stf.spill [r9]=f17,32
;;
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
.mem.offset 0,0
st8.spill [r8]=r4,16
.mem.offset 8,0
st8.spill [r9]=r5,16
mov r17=b1
;;
}
{ .mmi
st8 [r16]=r22,16 // save rnat, ofs=&pmap
st8 [r17]=r18,16 // save pr, ofs=&ar.fsr
nop 1
.mem.offset 16,0
st8.spill [r8]=r6,16
.mem.offset 24,0
st8.spill [r9]=r7,16
mov r18=b2
;;
}
{ .mmi
flushrs
mov r16=ar.unat
mov r19=b3
;;
}
{ .mmi
st8 [r8]=r16,16 // ar.unat
st8 [r9]=r17,16 // b1
mov r20=b4
;;
}
{ .mmi
st8 [r8]=r18,16 // b2
st8 [r9]=r19,16 // b3
mov r21=b5
;;
}
st8 [r8]=r20,16 // b4
st8 [r9]=r21,16 // b5
;;
{ .mmi
mov ar.rsc=0
mov r16=ar.bsp
mov r17=ar.pfs
;;
}
{ .mmi
st8 [r8]=r16,16 // ar.bsp
st8 [r9]=r17,16 // ar.pfs
mov r18=ar.lc
;;
}
mov r17=ar.rnat
ld8 r19=[r31]
;;
st8 [r8]=r17,16 // ar.rnat
st8 [r9]=r18,16 // ar.lc
;;
st8 [r8]=r19,16 // pc_current_pmap
mov r16=ar.fcr
;;
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
ld8 r19=[r23]
mov r18=ar.fsr
nop 2
;;
}
{ .mmi
st8 [r16]=r19,16 // save pmap, ofs=&ar.fcr
st8 [r17]=r18,16 // save ar.fsr, ofs=&ar.fir
nop 3
;;
}
{ .mmb
mov r19=ar.fcr
mov r18=ar.fir
nop 4
;;
}
{ .mmi
st8 [r16]=r19,16 // save ar.fcr, ofs=&ar.fdr
st8 [r17]=r18,16 // save ar.fir, ofs=&ar.eflag
nop 5
;;
}
{ .mmb
mov r19=ar.fdr
mov r18=ar.eflag
nop 6
;;
}
{ .mmi
st8 [r16]=r19,16 // save ar.fdr, ofs=&ar.csd
st8 [r17]=r18,16 // save ar.eflag, ofs=&ssd
nop 7
;;
}
{ .mmb
mov r19=ar.csd
mov r18=ar.ssd
nop 8
;;
}
{ .mmi
st8 [r16]=r19 // save ar.csd
st8 [r17]=r18 // save ar.ssd
nop 9
}
{ .mib
mov ar.rsc=3 // turn RSE back on
mov ret0=r0
br.sptk.few b6
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
mov ar.bspstore=r21
;;
mov ar.rnat=r23
mov ar.pfs=r22
;;
}
{ .mmi
invala
;;
ld8 r16=[r9],16 // ar.fcr
mov r18=ar.lc
;;
}
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_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
;;
}
{ .mib
mov r8=r32
mov b6=r16
br.sptk.many pcb_save
}
{ .mfb
nop 1
nop 2
br.sptk.few 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
br.cond.sptk pcb_restore
;;
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
;;
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)

View File

@ -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;
}
/*

View File

@ -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