[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] arm: Use HTPIDR to point to per-CPU state
# HG changeset patch # User Tim Deegan <tim@xxxxxxx> # Date 1333360445 -3600 # Node ID d90c658de78ac5c50f1b9c175167c9f94e683829 # Parent 0346309b3c3f89f6aaac096f23b07a082cd736b4 arm: Use HTPIDR to point to per-CPU state Rather than having the per-VCPU stack contain a pointer to the per-PCPU state, use the CPU's hypervisor thread ID register for that. Signed-off-by: Tim Deegan <tim@xxxxxxx> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> [ s/cpuid/id in set_processor_id -- ijc ] Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r 0346309b3c3f -r d90c658de78a xen/arch/arm/setup.c --- a/xen/arch/arm/setup.c Mon Apr 02 10:54:05 2012 +0100 +++ b/xen/arch/arm/setup.c Mon Apr 02 10:54:05 2012 +0100 @@ -167,7 +167,7 @@ void __init start_xen(unsigned long boot percpu_init_areas(); set_processor_id(0); /* needed early, for smp_processor_id() */ - __set_current((struct vcpu *)0xfffff000); /* debug sanity */ + set_current((struct vcpu *)0xfffff000); /* debug sanity */ idle_vcpu[0] = current; smp_prepare_cpus(cpus); diff -r 0346309b3c3f -r d90c658de78a xen/arch/arm/smpboot.c --- a/xen/arch/arm/smpboot.c Mon Apr 02 10:54:05 2012 +0100 +++ b/xen/arch/arm/smpboot.c Mon Apr 02 10:54:05 2012 +0100 @@ -49,6 +49,9 @@ static bool_t cpu_is_dead = 0; /* Number of non-boot CPUs ready to enter C */ unsigned long __initdata ready_cpus = 0; +/* ID of the PCPU we're running on */ +DEFINE_PER_CPU(unsigned int, cpu_id); + void __init smp_prepare_cpus (unsigned int max_cpus) { @@ -102,8 +105,6 @@ void __cpuinit start_secondary(unsigned /* Setup Hyp vector base */ WRITE_CP32((uint32_t) hyp_traps_vector, HVBAR); - dprintk(XENLOG_DEBUG, "CPU %li awake.\n", cpuid); - mmu_init_secondary_cpu(); gic_init_secondary_cpu(); @@ -119,7 +120,7 @@ void __cpuinit start_secondary(unsigned local_irq_enable(); - dprintk(XENLOG_DEBUG, "CPU %li booted.\n", cpuid); + dprintk(XENLOG_DEBUG, "CPU %u booted.\n", smp_processor_id()); startup_cpu_idle_loop(); } diff -r 0346309b3c3f -r d90c658de78a xen/include/asm-arm/cpregs.h --- a/xen/include/asm-arm/cpregs.h Mon Apr 02 10:54:05 2012 +0100 +++ b/xen/include/asm-arm/cpregs.h Mon Apr 02 10:54:05 2012 +0100 @@ -198,6 +198,7 @@ /* CP15 CR13: */ #define FCSEIDR p15,0,c13,c0,0 /* FCSE Process ID Register */ #define CONTEXTIDR p15,0,c13,c0,1 /* Context ID Register */ +#define HTPIDR p15,4,c13,c0,2 /* Hyp. Software Thread ID Register */ /* CP15 CR14: */ #define CNTPCT p15,0,c14 /* Time counter value */ diff -r 0346309b3c3f -r d90c658de78a xen/include/asm-arm/current.h --- a/xen/include/asm-arm/current.h Mon Apr 02 10:54:05 2012 +0100 +++ b/xen/include/asm-arm/current.h Mon Apr 02 10:54:05 2012 +0100 @@ -11,17 +11,16 @@ struct vcpu; -/* - * Which VCPU is "current" on this PCPU. - */ +/* Which VCPU is "current" on this PCPU. */ DECLARE_PER_CPU(struct vcpu *, curr_vcpu); +#define current (this_cpu(curr_vcpu)) +#define set_current(vcpu) do { current = (vcpu); } while (0) + +/* Per-VCPU state that lives at the top of the stack */ struct cpu_info { struct cpu_user_regs guest_cpu_user_regs; unsigned long elr; - /* The following are valid iff this VCPU is current */ - unsigned int processor_id; - unsigned long per_cpu_offset; unsigned int pad; }; @@ -31,22 +30,6 @@ static inline struct cpu_info *get_cpu_i return (struct cpu_info *)((sp & ~(STACK_SIZE - 1)) + STACK_SIZE - sizeof(struct cpu_info)); } -#define get_processor_id() (get_cpu_info()->processor_id) -#define set_processor_id(id) do { \ - struct cpu_info *ci__ = get_cpu_info(); \ - ci__->per_cpu_offset = __per_cpu_offset[ci__->processor_id = (id)]; \ -} while (0) - -#define get_current() (this_cpu(curr_vcpu)) -#define __set_current(vcpu) (this_cpu(curr_vcpu) = (vcpu)) -#define set_current(vcpu) do { \ - int cpu = get_processor_id(); \ - vcpu->arch.cpu_info->processor_id = cpu; \ - vcpu->arch.cpu_info->per_cpu_offset = __per_cpu_offset[cpu]; \ - __set_current(vcpu); \ -} while (0) -#define current (get_current()) - #define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs) #define switch_stack_and_jump(stack, fn) \ diff -r 0346309b3c3f -r d90c658de78a xen/include/asm-arm/percpu.h --- a/xen/include/asm-arm/percpu.h Mon Apr 02 10:54:05 2012 +0100 +++ b/xen/include/asm-arm/percpu.h Mon Apr 02 10:54:05 2012 +0100 @@ -5,7 +5,6 @@ extern char __per_cpu_start[], __per_cpu_data_end[]; extern unsigned long __per_cpu_offset[NR_CPUS]; void percpu_init_areas(void); -#endif /* Separate out the type, so (int[3], foo) works. */ #define __DEFINE_PER_CPU(type, name, suffix) \ @@ -16,10 +15,18 @@ void percpu_init_areas(void); #define per_cpu(var, cpu) \ (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu])) #define __get_cpu_var(var) \ - (*RELOC_HIDE(&per_cpu__##var, get_cpu_info()->per_cpu_offset)) + (*RELOC_HIDE(&per_cpu__##var, READ_CP32(HTPIDR))) #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name +DECLARE_PER_CPU(unsigned int, cpu_id); +#define get_processor_id() (this_cpu(cpu_id)) +#define set_processor_id(id) do { \ + WRITE_CP32(__per_cpu_offset[id], HTPIDR); \ + this_cpu(cpu_id) = (id); \ +} while(0) +#endif + #endif /* __ARM_PERCPU_H__ */ /* * Local variables: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |