diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2002-10-30 05:55:29 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2002-10-30 05:55:29 +0000 |
| commit | 22d9ff469144738f060f17e98871a8d9745b7ef1 (patch) | |
| tree | c2cd9b652fab7a16aa47dd7b2627da6d00254f4e | |
| parent | 8db2431f617cfe75b482ad3cb441472100b2fdec (diff) | |
Notes
| -rw-r--r-- | sys/ia64/ia64/genassym.c | 32 | ||||
| -rw-r--r-- | sys/ia64/ia64/locore.S | 2 | ||||
| -rw-r--r-- | sys/ia64/ia64/locore.s | 2 | ||||
| -rw-r--r-- | sys/ia64/ia64/machdep.c | 50 | ||||
| -rw-r--r-- | sys/ia64/ia64/swtch.s | 470 | ||||
| -rw-r--r-- | sys/ia64/ia64/vm_machdep.c | 22 | ||||
| -rw-r--r-- | sys/ia64/include/pcb.h | 89 |
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 |
