On 17.10.2012, at 04:36, Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> wrote: > The offsets for the registers have changed, so this patch updates the > headers and fixes the offsets and the compilation in one. This means that any Linux internal change to pt_regs will break KVM ABI compatibility? I really dislike this automatic generation of one_reg ids based on struct offsets :( Alex > > Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> > --- > linux-headers/asm-arm/kvm.h | 15 ++++----------- > linux-headers/linux/kvm.h | 5 +++++ > target-arm/kvm.c | 37 +++++++++++++++++++------------------ > 3 files changed, 28 insertions(+), 29 deletions(-) > > diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h > index 8101812..5142cab 100644 > --- a/linux-headers/asm-arm/kvm.h > +++ b/linux-headers/asm-arm/kvm.h > @@ -20,6 +20,7 @@ > #define __ARM_KVM_H__ > > #include <asm/types.h> > +#include <asm/ptrace.h> > > #define __KVM_HAVE_GUEST_DEBUG > #define __KVM_HAVE_IRQ_LINE > @@ -28,19 +29,17 @@ > (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) > > struct kvm_regs { > - __u32 usr_regs[15]; /* R0_usr - R14_usr */ > + struct pt_regs usr_regs;/* R0_usr - R14_usr, PC, CPSR */ > __u32 svc_regs[3]; /* SP_svc, LR_svc, SPSR_svc */ > __u32 abt_regs[3]; /* SP_abt, LR_abt, SPSR_abt */ > __u32 und_regs[3]; /* SP_und, LR_und, SPSR_und */ > __u32 irq_regs[3]; /* SP_irq, LR_irq, SPSR_irq */ > __u32 fiq_regs[8]; /* R8_fiq - R14_fiq, SPSR_fiq */ > - __u32 pc; /* The program counter (r15) */ > - __u32 cpsr; /* The guest CPSR */ > }; > > /* Supported Processor Types */ > -#define KVM_ARM_TARGET_CORTEX_A15 0 > -#define KVM_ARM_NUM_TARGETS 1 > +#define KVM_ARM_TARGET_CORTEX_A15 0 > +#define KVM_ARM_NUM_TARGETS 1 > > struct kvm_vcpu_init { > __u32 target; > @@ -65,12 +64,6 @@ struct kvm_sync_regs { > struct kvm_arch_memory_slot { > }; > > -/* For KVM_VCPU_GET_REG_LIST. */ > -struct kvm_reg_list { > - __u64 n; /* number of regs */ > - __u64 reg[0]; > -}; > - > /* If you need to interpret the index values, here is the key: */ > #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000 > #define KVM_REG_ARM_COPROC_SHIFT 16 > diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h > index 7a02d73..0030863 100644 > --- a/linux-headers/linux/kvm.h > +++ b/linux-headers/linux/kvm.h > @@ -746,6 +746,11 @@ struct kvm_dirty_tlb { > #define KVM_REG_SIZE_U512 0x0060000000000000ULL > #define KVM_REG_SIZE_U1024 0x0070000000000000ULL > > +struct kvm_reg_list { > + __u64 n; /* number of regs */ > + __u64 reg[0]; > +}; > + > struct kvm_one_reg { > __u64 id; > __u64 addr; > diff --git a/target-arm/kvm.c b/target-arm/kvm.c > index fee60e1..622c82e 100644 > --- a/target-arm/kvm.c > +++ b/target-arm/kvm.c > @@ -14,6 +14,7 @@ > #include <sys/mman.h> > > #include <linux/kvm.h> > +#include <linux/ptrace.h> > > #include "qemu-common.h" > #include "qemu-timer.h" > @@ -70,21 +71,21 @@ struct reg { > > const struct reg regs[] = { > /* R0_usr .. R14_usr */ > - COREREG(usr_regs[0], regs[0]), > - COREREG(usr_regs[1], regs[1]), > - COREREG(usr_regs[2], regs[2]), > - COREREG(usr_regs[3], regs[3]), > - COREREG(usr_regs[4], regs[4]), > - COREREG(usr_regs[5], regs[5]), > - COREREG(usr_regs[6], regs[6]), > - COREREG(usr_regs[7], regs[7]), > - COREREG(usr_regs[8], usr_regs[0]), > - COREREG(usr_regs[9], usr_regs[1]), > - COREREG(usr_regs[10], usr_regs[2]), > - COREREG(usr_regs[11], usr_regs[3]), > - COREREG(usr_regs[12], usr_regs[4]), > - COREREG(usr_regs[13], banked_r13[0]), > - COREREG(usr_regs[14], banked_r14[0]), > + COREREG(usr_regs.ARM_r0, regs[0]), > + COREREG(usr_regs.ARM_r1, regs[1]), > + COREREG(usr_regs.ARM_r2, regs[2]), > + COREREG(usr_regs.ARM_r3, regs[3]), > + COREREG(usr_regs.ARM_r4, regs[4]), > + COREREG(usr_regs.ARM_r5, regs[5]), > + COREREG(usr_regs.ARM_r6, regs[6]), > + COREREG(usr_regs.ARM_r7, regs[7]), > + COREREG(usr_regs.ARM_r8, usr_regs[0]), > + COREREG(usr_regs.ARM_r9, usr_regs[1]), > + COREREG(usr_regs.ARM_r10, usr_regs[2]), > + COREREG(usr_regs.ARM_fp, usr_regs[3]), > + COREREG(usr_regs.ARM_ip, usr_regs[4]), > + COREREG(usr_regs.ARM_sp, banked_r13[0]), > + COREREG(usr_regs.ARM_lr, banked_r14[0]), > /* R13, R14, SPSR for SVC, ABT, UND, IRQ banks */ > COREREG(svc_regs[0], banked_r13[1]), > COREREG(svc_regs[1], banked_r14[1]), > @@ -108,7 +109,7 @@ const struct reg regs[] = { > COREREG(fiq_regs[1], banked_r14[5]), > COREREG(fiq_regs[2], banked_spsr[5]), > /* R15 */ > - COREREG(pc, regs[15]), > + COREREG(usr_regs.ARM_pc, regs[15]), > /* A non-comprehensive set of cp15 registers. > * TODO: drive this from the cp_regs hashtable instead. > */ > @@ -150,7 +151,7 @@ int kvm_arch_put_registers(CPUARMState *env, int level) > /* Special cases which aren't a single CPUARMState field */ > cpsr = cpsr_read(env); > r.id = KVM_REG_ARM | KVM_REG_SIZE_U32 | > - KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(cpsr); > + KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(usr_regs.ARM_cpsr); > r.addr = (uintptr_t)(&cpsr); > ret = kvm_vcpu_ioctl(env, KVM_SET_ONE_REG, &r); > if (ret) { > @@ -196,7 +197,7 @@ int kvm_arch_get_registers(CPUARMState *env) > > /* Special cases which aren't a single CPUARMState field */ > r.id = KVM_REG_ARM | KVM_REG_SIZE_U32 | > - KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(cpsr); > + KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(usr_regs.ARM_cpsr); > r.addr = (uintptr_t)(&cpsr); > ret = kvm_vcpu_ioctl(env, KVM_GET_ONE_REG, &r); > if (ret) { > -- > 1.7.9.5 > > _______________________________________________ > kvmarm mailing list > kvmarm@xxxxxxxxxxxxxxxxxxxxx > https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm