|
[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 |