lkml.org 
[lkml]   [2015]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 18/63] arm64: KVM: allows discrimination of AArch32 sysreg access
    Date
    From: Marc Zyngier <marc.zyngier@arm.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 2072d29c46b73e39b3c6c56c6027af77086f45fd upstream.

    The current handling of AArch32 trapping is slightly less than
    perfect, as it is not possible (from a handler point of view)
    to distinguish it from an AArch64 access, nor to tell a 32bit
    from a 64bit access either.

    Fix this by introducing two additional flags:
    - is_aarch32: true if the access was made in AArch32 mode
    - is_32bit: true if is_aarch32 == true and a MCR/MRC instruction
    was used to perform the access (as opposed to MCRR/MRRC).

    This allows a handler to cover all the possible conditions in which
    a system register gets trapped.

    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
    Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    arch/arm64/kvm/sys_regs.c | 6 ++++++
    arch/arm64/kvm/sys_regs.h | 2 ++
    2 files changed, 8 insertions(+)

    diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
    index 02e9d09e1d80..bf03e0fadf1f 100644
    --- a/arch/arm64/kvm/sys_regs.c
    +++ b/arch/arm64/kvm/sys_regs.c
    @@ -437,6 +437,8 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
    u32 hsr = kvm_vcpu_get_hsr(vcpu);
    int Rt2 = (hsr >> 10) & 0xf;

    + params.is_aarch32 = true;
    + params.is_32bit = false;
    params.CRm = (hsr >> 1) & 0xf;
    params.Rt = (hsr >> 5) & 0xf;
    params.is_write = ((hsr & 1) == 0);
    @@ -480,6 +482,8 @@ int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run)
    struct sys_reg_params params;
    u32 hsr = kvm_vcpu_get_hsr(vcpu);

    + params.is_aarch32 = true;
    + params.is_32bit = true;
    params.CRm = (hsr >> 1) & 0xf;
    params.Rt = (hsr >> 5) & 0xf;
    params.is_write = ((hsr & 1) == 0);
    @@ -549,6 +553,8 @@ int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run)
    struct sys_reg_params params;
    unsigned long esr = kvm_vcpu_get_hsr(vcpu);

    + params.is_aarch32 = false;
    + params.is_32bit = false;
    params.Op0 = (esr >> 20) & 3;
    params.Op1 = (esr >> 14) & 0x7;
    params.CRn = (esr >> 10) & 0xf;
    diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h
    index d50d3722998e..d411e251412c 100644
    --- a/arch/arm64/kvm/sys_regs.h
    +++ b/arch/arm64/kvm/sys_regs.h
    @@ -30,6 +30,8 @@ struct sys_reg_params {
    u8 Op2;
    u8 Rt;
    bool is_write;
    + bool is_aarch32;
    + bool is_32bit; /* Only valid if is_aarch32 is true */
    };

    struct sys_reg_desc {
    --
    2.3.5


    \
     
     \ /
      Last update: 2015-04-30 15:01    [W:3.886 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site