Since I wasn't able to get -Intel tip running, I decided
to just try your kr changes. I applied csets 5981 and
5982 only and had the same symptoms as with tip, namely
no console output at all from Xen and a reboot. Should
these csets apply standalone (to xen-ia64-unstable.hg)
or is there some other dependency I missed?
Thanks,
Dan
P.S. I backed out the csets and it booted fine. Then
I applied just 5981 and it booted fine. So it appears
the problem is in 5982?
> -----Original Message-----
> From: Dong, Eddie [mailto:eddie.dong@xxxxxxxxx]
> Sent: Monday, August 15, 2005 11:55 PM
> To: Magenheimer, Dan (HP Labs Fort Collins);
> xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> Subject: RE: [Xen-ia64-devel] Returning the kr's to the guest
>
> Dan:
> The attached (removal_kr.patch) is the patch to remove all KR
> usages in HV, please comments! Staging tree will be ready
> for your pull
> if you are OK with that.
> Thanks,eddie
>
> Magenheimer, Dan (HP Labs Fort Collins) wrote:
> > Something that I've been thinking about for a long
> > time but haven't gotten around to trying, so I thought
> > I'd post it for discussion and perhaps somebody else
> > in the community might have some time to develop
> > (and thoroughly test) a patch:
> >
>
> diff -r 90c6abbd4a59 xen/arch/ia64/asm-offsets.c
> --- a/xen/arch/ia64/asm-offsets.c Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/asm-offsets.c Mon Aug 15 14:01:07 2005
> @@ -296,4 +296,11 @@
> //DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64);
> //DEFINE(IA64_TIME_SOURCE_MMIO32, TIME_SOURCE_MMIO32);
> //DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, offsetof (struct
> timespec, tv_nsec));
> + DEFINE(IA64_KR_CURRENT_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_CURRENT]));
> + DEFINE(IA64_KR_PT_BASE_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_PT_BASE]));
> + DEFINE(IA64_KR_IO_BASE_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_IO_BASE]));
> + DEFINE(IA64_KR_PERCPU_DATA_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_PER_CPU_DATA]));
> + DEFINE(IA64_KR_IO_BASE_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_IO_BASE]));
> + DEFINE(IA64_KR_CURRENT_STACK_OFFSET, offsetof (cpu_kr_ia64_t,
> _kr[IA64_KR_CURRENT_STACK]));
> +
> }
> diff -r 90c6abbd4a59 xen/arch/ia64/hyperprivop.S
> --- a/xen/arch/ia64/hyperprivop.S Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/hyperprivop.S Mon Aug 15 14:01:07 2005
> @@ -73,7 +73,8 @@
> ld4 r20=[r20] ;;
> cmp.eq p7,p0=r0,r20
> (p7) br.cond.sptk.many 1f
> - mov r20=IA64_KR(CURRENT);;
> + movl r20=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r20=[r20];;
> adds r21=IA64_VCPU_IRR0_OFFSET,r20;
> adds r22=IA64_VCPU_IRR0_OFFSET+8,r20;;
> ld8 r23=[r21],16; ld8 r24=[r22],16;;
> @@ -257,7 +258,8 @@
> st8 [r21]=r20 ;;
> // leave cr.ifs alone for later rfi
> // set iip to go to domain IVA break instruction vector
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22=[r22];;
> adds r22=IA64_VCPU_IVA_OFFSET,r22;;
> ld8 r23=[r22];;
> movl r24=0x3000;;
> @@ -340,7 +342,8 @@
> (p6) br.cond.spnt.few fast_tick_reflect_done;;
> extr.u r27=r20,0,6 // r27 has low 6 bits of itv.vector
> extr.u r26=r20,6,2;; // r26 has irr index of itv.vector
> - mov r19=IA64_KR(CURRENT);;
> + movl r19=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r19=[r19];;
> adds r22=IA64_VCPU_DOMAIN_ITM_LAST_OFFSET,r19
> adds r23=IA64_VCPU_DOMAIN_ITM_OFFSET,r19;;
> ld8 r24=[r22];;
> @@ -581,7 +584,8 @@
> st8 [r18]=r0;;
> // FIXME: need to save iipa and isr to be arch-compliant
> // set iip to go to domain IVA break instruction vector
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22=[r22];;
> adds r22=IA64_VCPU_IVA_OFFSET,r22;;
> ld8 r23=[r22];;
> add r20=r20,r23;;
> @@ -803,7 +807,8 @@
>
> // r18=&vpsr.i|vpsr.ic, r21==vpsr, r22=vcr.iip
> // make sure none of these get trashed in case going to
> just_do_rfi
> - mov r30=IA64_KR(CURRENT);;
> + movl r30=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r30=[r30];;
> adds r24=IA64_VCPU_INSVC3_OFFSET,r30;;
> mov r25=192
> adds r16=IA64_VCPU_IRR3_OFFSET,r30;;
> @@ -1010,7 +1015,8 @@
> ld4 r21=[r20];;
> cmp.eq p7,p0=r21,r0 // meta==0?
> (p7) br.spnt.many 1f ;; // already in virtual mode
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22=[r22];;
> adds r22=IA64_VCPU_META_SAVED_RR0_OFFSET,r22;;
> ld4 r23=[r22];;
> mov rr[r0]=r23;;
> @@ -1045,7 +1051,8 @@
> ld4 r21=[r20];;
> cmp.ne p7,p0=r21,r0 // meta==0?
> (p7) br.spnt.many 1f ;; // already in metaphysical mode
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22=[r22];;
> adds r22=IA64_VCPU_META_RR0_OFFSET,r22;;
> ld4 r23=[r22];;
> mov rr[r0]=r23;;
> @@ -1137,7 +1144,8 @@
> (p7) adds r20=XSI_PEND_OFS-XSI_PSR_IC_OFS,r18 ;;
> (p7) st4 [r20]=r0;;
> (p7) br.spnt.many 1f ;;
> - mov r30=IA64_KR(CURRENT);;
> + movl r30=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r30=[r30];;
> adds r24=IA64_VCPU_INSVC3_OFFSET,r30;;
> mov r25=192
> adds r22=IA64_VCPU_IRR3_OFFSET,r30;;
> @@ -1242,7 +1250,8 @@
> adds r21=1,r21;;
> st8 [r20]=r21;;
> #endif
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22=[r22];;
> adds r22=IA64_VCPU_INSVC3_OFFSET,r22;;
> ld8 r23=[r22];;
> cmp.eq p6,p0=r23,r0;;
> @@ -1307,7 +1316,8 @@
> #endif
> movl r20=THIS_CPU(cpu_info)+IA64_CPUINFO_ITM_NEXT_OFFSET;;
> ld8 r21=[r20];;
> - mov r20=IA64_KR(CURRENT);;
> + movl r20=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r20=[r20];;
> adds r20=IA64_VCPU_DOMAIN_ITM_OFFSET,r20;;
> st8 [r20]=r8;;
> cmp.geu p6,p0=r21,r8;;
> @@ -1378,7 +1388,8 @@
> st8 [r20]=r21;;
> #endif
> extr.u r26=r9,8,24 // r26 = r9.rid
> - mov r20=IA64_KR(CURRENT);;
> + movl r20=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r20=[r20];;
> adds r21=IA64_VCPU_STARTING_RID_OFFSET,r20;;
> ld4 r22=[r21];;
> adds r21=IA64_VCPU_ENDING_RID_OFFSET,r20;;
> @@ -1544,7 +1555,8 @@
> mov ar.lc=r30 ;;
> mov r29=cr.ipsr
> mov r30=cr.iip;;
> - mov r27=IA64_KR(CURRENT);;
> + movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r27=[r27];;
> adds r25=IA64_VCPU_DTLB_OFFSET,r27
> adds r26=IA64_VCPU_ITLB_OFFSET,r27;;
> ld8 r24=[r25]
> diff -r 90c6abbd4a59 xen/arch/ia64/ivt.S
> --- a/xen/arch/ia64/ivt.S Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/ivt.S Mon Aug 15 14:01:07 2005
> @@ -833,7 +833,9 @@
> cmp4.eq p7,p0=r0,r19
> (p7) br.sptk.many fast_hyperprivop
> ;;
> - mov r22=IA64_KR(CURRENT);;
> + movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r22 = [r22]
> + ;;
> adds r22=IA64_VCPU_BREAKIMM_OFFSET,r22;;
> ld4 r23=[r22];;
> cmp4.eq p6,p7=r23,r17 // Xen-reserved
> breakimm?
> @@ -842,7 +844,8 @@
> br.sptk.many fast_break_reflect
> ;;
> #endif
> - mov r16=IA64_KR(CURRENT) // r16 = current task;
> 12 cycle read lat.
> + movl r16=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + ld8 r16=[r16]
> mov r17=cr.iim
> mov r18=__IA64_BREAK_SYSCALL
> mov r21=ar.fpsr
> diff -r 90c6abbd4a59 xen/arch/ia64/linux-xen/entry.S
> --- a/xen/arch/ia64/linux-xen/entry.S Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/linux-xen/entry.S Mon Aug 15 14:01:07 2005
> @@ -191,7 +191,8 @@
>
> adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
> movl r25=init_task
> - mov r27=IA64_KR(CURRENT_STACK)
> + movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_STACK_OFFSET;;
> + ld8 r27=[r27]
> adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
> #ifdef XEN
> dep r20=0,in0,60,4 // physical address of "next"
> @@ -214,7 +215,8 @@
> ;;
> (p6) srlz.d
> ld8 sp=[r21] // load kernel stack pointer of
> new task
> - mov IA64_KR(CURRENT)=in0 // update "current" application
> register
> + movl r8=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> + st8 [r8]=in0
> mov r8=r13 // return pointer to previously
> running task
> mov r13=in0 // set "current" pointer
> ;;
> @@ -233,7 +235,8 @@
> ;;
> cmp.eq p7,p0=r25,r23
> ;;
> -(p7) mov IA64_KR(CURRENT_STACK)=r26 // remember last page we
> mapped...
> +(p7) movl r8=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_STACK_OFFSET;;
> +(p7) st8 [r8]=r26
> (p7) br.cond.sptk .done
> #endif
> rsm psr.ic // interrupts (psr.i) are
> already disabled here
> @@ -247,8 +250,8 @@
> mov cr.ifa=in0 // VA of next task...
> ;;
> mov r25=IA64_TR_CURRENT_STACK
> - mov IA64_KR(CURRENT_STACK)=r26 // remember last page we
> mapped...
> - ;;
> + movl r8=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_STACK_OFFSET;;
> + st8 [r8]=r26
> itr.d dtr[r25]=r23 // wire in new mapping...
> br.cond.sptk .done
> END(ia64_switch_to)
> @@ -947,7 +950,8 @@
> ldf.fill f11=[r2]
> bsw.0 // switch back to bank 0 (no stop bit
> required beforehand...)
> ;;
> -(pUStk) mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
> +(pUStk) movl r18=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> +(pUStk) ld8 r18=[r18]
> adds r16=PT(CR_IPSR)+16,r12
> adds r17=PT(CR_IIP)+16,r12
>
> diff -r 90c6abbd4a59 xen/arch/ia64/linux-xen/head.S
> --- a/xen/arch/ia64/linux-xen/head.S Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/linux-xen/head.S Mon Aug 15 14:01:07 2005
> @@ -226,8 +226,9 @@
> bsw.1
> ;;
> #else // CONFIG_VTI
> - mov IA64_KR(CURRENT)=r2 // virtual address
> - mov IA64_KR(CURRENT_STACK)=r16
> +// movl r12=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> +// st8
> [r12]=r2,IA64_KR_CURRENT_STACK_OFFSET-IA64_KR_CURRENT_OFFSET;;
> +// st8 [r12]=r16
> #endif // CONFIG_VTI
> mov r13=r2
> /*
> diff -r 90c6abbd4a59 xen/arch/ia64/linux-xen/setup.c
> --- a/xen/arch/ia64/linux-xen/setup.c Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/linux-xen/setup.c Mon Aug 15 14:01:07 2005
> @@ -66,6 +66,7 @@
> #endif
>
> DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
> +DEFINE_PER_CPU(cpu_kr_ia64_t, cpu_kr);
> DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
> DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
> unsigned long ia64_cycles_per_usec;
> @@ -261,9 +262,9 @@
> phys_iobase = efi_get_iobase();
> if (phys_iobase)
> /* set AR.KR0 since this is all we use it for anyway */
> - ia64_set_kr(IA64_KR_IO_BASE, phys_iobase);
> + __get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE]=phys_iobase;
> else {
> - phys_iobase = ia64_get_kr(IA64_KR_IO_BASE);
> + phys_iobase=__get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE];
> printk(KERN_INFO "No I/O port range found in EFI memory
> map, falling back "
> "to AR.KR0\n");
> printk(KERN_INFO "I/O port base = 0x%lx\n",
> phys_iobase);
> @@ -610,6 +611,8 @@
> setup_per_cpu_areas (void)
> {
> /* start_kernel() requires this... */
> + __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT] = current;
> + __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT_STACK] = -1;
> }
>
> static void
> @@ -667,8 +670,8 @@
> * physical addresses of per cpu variables with a simple:
> * phys = ar.k3 + &per_cpu_var
> */
> - ia64_set_kr(IA64_KR_PER_CPU_DATA,
> - ia64_tpa(cpu_data) - (long) __per_cpu_start);
> +// ia64_set_kr(IA64_KR_PER_CPU_DATA,
> +// ia64_tpa(cpu_data) - (long) __per_cpu_start);
>
> get_max_cacheline_size();
>
> @@ -698,7 +701,7 @@
> /* Clear the stack memory reserved for pt_regs: */
> memset(ia64_task_regs(current), 0, sizeof(struct pt_regs));
>
> - ia64_set_kr(IA64_KR_FPU_OWNER, 0);
> + __get_cpu_var(cpu_kr)._kr[IA64_KR_FPU_OWNER] = 0;
>
> /*
> * Initialize default control register to defer all speculative
> faults. The
> diff -r 90c6abbd4a59 xen/arch/ia64/linux/minstate.h
> --- a/xen/arch/ia64/linux/minstate.h Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/linux/minstate.h Mon Aug 15 14:01:07 2005
> @@ -61,7 +61,9 @@
> ;;
>
> #ifdef MINSTATE_VIRT
> -# define MINSTATE_GET_CURRENT(reg) mov reg=IA64_KR(CURRENT)
> +# define MINSTATE_GET_CURRENT(reg) \
> + movl reg=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;\
> + ld8 reg=[reg]
> # define MINSTATE_START_SAVE_MIN MINSTATE_START_SAVE_MIN_VIRT
> # define MINSTATE_END_SAVE_MIN
> MINSTATE_END_SAVE_MIN_VIRT
> #endif
> @@ -170,7 +172,8 @@
> ;;
> \
> .mem.offset 0,0; st8.spill [r16]=r13,16;
> \
> .mem.offset 8,0; st8.spill [r17]=r21,16; /* save ar.fpsr */
> \
> - mov r13=IA64_KR(CURRENT); /* establish `current' */
> \
> + movl r13=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
> \
> + ld8 r13=[r13]; /* establish 'current' */
> \
> ;;
> \
> .mem.offset 0,0; st8.spill [r16]=r15,16;
> \
> .mem.offset 8,0; st8.spill [r17]=r14,16;
> \
> diff -r 90c6abbd4a59 xen/arch/ia64/xenmisc.c
> --- a/xen/arch/ia64/xenmisc.c Fri Aug 12 03:16:25 2005
> +++ b/xen/arch/ia64/xenmisc.c Mon Aug 15 14:01:07 2005
> @@ -347,7 +347,8 @@
>
> loop:
> printf("$$$$$ PANIC in domain %d (k6=%p): ",
> - v->domain->domain_id, ia64_get_kr(IA64_KR_CURRENT));
> + v->domain->domain_id,
> + __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT]);
> va_start(args, fmt);
> (void)vsnprintf(buf, sizeof(buf), fmt, args);
> va_end(args);
> diff -r 90c6abbd4a59 xen/include/asm-ia64/linux-xen/asm/processor.h
> --- a/xen/include/asm-ia64/linux-xen/asm/processor.h Fri Aug 12
> 03:16:25 2005
> +++ b/xen/include/asm-ia64/linux-xen/asm/processor.h Mon Aug 15
> 14:01:07 2005
> @@ -183,6 +183,22 @@
>
> DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info);
>
> +typedef union {
> + struct {
> + __u64 kr0;
> + __u64 kr1;
> + __u64 kr2;
> + __u64 kr3;
> + __u64 kr4;
> + __u64 kr5;
> + __u64 kr6;
> + __u64 kr7;
> + };
> + __u64 _kr[8];
> +} cpu_kr_ia64_t;
> +
> +DECLARE_PER_CPU(cpu_kr_ia64_t, cpu_kr);
> +
> /*
> * The "local" data variable. It refers to the per-CPU data of the
> currently executing
> * CPU, much like "current" points to the per-task data of the
> currently executing task.
>
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|