[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/2] xen/x86: address violations of Rule 11.3
From: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> Use {get,put}_unaligned_t to ensure that reads and writes are safe to perform even on potentially misaligned pointers. Signed-off-by: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> Signed-off-by: Victor Lira <victorm.lira@xxxxxxx> --- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Anthony PERARD <anthony.perard@xxxxxxxxxx> Cc: Michal Orzel <michal.orzel@xxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Julien Grall <julien@xxxxxxx> Cc: Roger Pau Monné <roger.pau@xxxxxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> Cc: Federico Serafini <federico.serafini@xxxxxxxxxxx> Cc: Bertrand Marquis <bertrand.marquis@xxxxxxx> --- xen/arch/x86/alternative.c | 12 ++++++++---- xen/arch/x86/hvm/emulate.c | 8 ++++---- xen/arch/x86/include/asm/hvm/vlapic.h | 5 +++-- xen/arch/x86/setup.c | 2 +- xen/drivers/passthrough/amd/iommu_init.c | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index d4fe56b3da..200cf2e44c 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -17,6 +17,7 @@ #include <asm/nmi.h> #include <asm/nops.h> #include <xen/livepatch.h> +#include <xen/unaligned.h> #define MAX_PATCH_LEN (255-1) @@ -168,7 +169,7 @@ void *place_ret(void *ptr) BUG_ON((int32_t)disp != disp); *p++ = 0xe9; - *(int32_t *)p = disp; + put_unaligned_t(int32_t, disp, p); p += 4; } else @@ -345,8 +346,11 @@ static int init_or_livepatch _apply_alternatives(struct alt_instr *start, /* 0xe8/0xe9 are relative branches; fix the offset. */ if ( a->repl_len >= 5 && (*buf & 0xfe) == 0xe8 ) - *(int32_t *)(buf + 1) += repl - orig; + { + int32_t val = get_unaligned_t(int32_t, buf + 1); + put_unaligned_t(int32_t, val + repl - orig, buf + 1); + } a->priv = 1; add_nops(buf + a->repl_len, total_len - a->repl_len); @@ -388,7 +392,7 @@ static int init_or_livepatch apply_alt_calls( return -EINVAL; } - disp = *(int32_t *)(orig + 2); + disp = get_unaligned_t(int32_t, orig + 2); dest = *(const void **)(orig + 6 + disp); if ( dest ) @@ -420,7 +424,7 @@ static int init_or_livepatch apply_alt_calls( buf[0] = 0x2e; buf[1] = 0xe8; - *(int32_t *)(buf + 2) = disp; + put_unaligned_t(int32_t, disp, buf + 2); } else { diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 91f004d233..3b644eed12 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -68,17 +68,17 @@ static void hvmtrace_io_assist(const ioreq_t *p) else event = p->dir ? TRC_HVM_IOPORT_READ : TRC_HVM_IOPORT_WRITE; - *(uint64_t *)buffer = p->addr; - size = (p->addr != (u32)p->addr) ? 8 : 4; + put_unaligned_t(uint64_t, p->addr, buffer); + size = (p->addr != (uint32_t)p->addr) ? 8 : 4; if ( size == 8 ) event |= TRC_64_FLAG; if ( !p->data_is_ptr ) { if ( size == 4 ) - *(uint32_t *)&buffer[size] = p->data; + put_unaligned_t(uint32_t, p->data, &buffer[size]); else - *(uint64_t *)&buffer[size] = p->data; + put_unaligned_t(uint64_t, p->data, &buffer[size]); size *= 2; } diff --git a/xen/arch/x86/include/asm/hvm/vlapic.h b/xen/arch/x86/include/asm/hvm/vlapic.h index c388551198..c7a26c0a0f 100644 --- a/xen/arch/x86/include/asm/hvm/vlapic.h +++ b/xen/arch/x86/include/asm/hvm/vlapic.h @@ -10,6 +10,7 @@ #define __ASM_X86_HVM_VLAPIC_H__ #include <xen/tasklet.h> +#include <xen/unaligned.h> #include <asm/hvm/vpt.h> #define vcpu_vlapic(x) (&(x)->arch.hvm.vlapic) @@ -85,13 +86,13 @@ struct vlapic { static inline uint32_t vlapic_get_reg(const struct vlapic *vlapic, uint32_t reg) { - return *((uint32_t *)(&vlapic->regs->data[reg])); + return get_unaligned_t(uint32_t, &vlapic->regs->data[reg]); } static inline void vlapic_set_reg( struct vlapic *vlapic, uint32_t reg, uint32_t val) { - *((uint32_t *)(&vlapic->regs->data[reg])) = val; + put_unaligned_t(uint32_t, val, &vlapic->regs->data[reg]); } void vlapic_reg_write(struct vcpu *v, unsigned int reg, uint32_t val); diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 1f5cb67bd0..5919e94f5b 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1249,7 +1249,7 @@ void asmlinkage __init noreturn __start_xen(void) (caps & 2) ? " V2" : "", !(caps & 3) ? " none" : ""); printk("EDID transfer time: %d seconds\n", caps >> 8); - if ( *(u32 *)bootsym(boot_edid_info) == 0x13131313 ) + if ( get_unaligned_t(u32, bootsym(boot_edid_info)) == 0x13131313 ) { printk(" EDID info not retrieved because "); if ( !(caps & 3) ) diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index bb25b55c85..c00aa64983 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -562,7 +562,7 @@ static void cf_check parse_event_log_entry(struct amd_iommu *iommu, u32 entry[]) unsigned int device_id = MASK_EXTR(entry[0], IOMMU_EVENT_DEVICE_ID_MASK); unsigned int domain_id = MASK_EXTR(entry[1], IOMMU_EVENT_DOMAIN_ID_MASK); unsigned int flags = MASK_EXTR(entry[1], IOMMU_EVENT_FLAGS_MASK); - uint64_t addr = *(uint64_t *)(entry + 2); + uint64_t addr = get_unaligned_t(uint64_t, entry + 2); printk(XENLOG_ERR "AMD-Vi: %s: %pp d%u addr %016"PRIx64 " flags %#x%s%s%s%s%s%s%s%s%s%s\n", -- 2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |