mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
x86: use unambiguous register names
Eliminate the mis-naming of 64-bit fields with 32-bit register names (eflags instead of rflags etc). To ensure no piece of code was missed, transiently use the underscore prefixed names only for 32-bit register accesses. This will be cleaned up subsequently. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
62c6e94dba
commit
897129deab
12 files changed
+362
-297
No files matched your search
@@ -67,10 +67,14 @@ inttypes["x86_32"] = {
|
||||
"xen_ulong_t" : "uint32_t",
|
||||
};
|
||||
header["x86_32"] = """
|
||||
#define __DECL_REG_LO8(which) uint32_t e ## which ## x
|
||||
#define __DECL_REG_LO16(name) uint32_t e ## name
|
||||
#define __i386___X86_32 1
|
||||
#pragma pack(4)
|
||||
""";
|
||||
footer["x86_32"] = """
|
||||
#undef __DECL_REG_LO8
|
||||
#undef __DECL_REG_LO16
|
||||
#pragma pack()
|
||||
""";
|
||||
|
||||
@@ -89,10 +93,18 @@ header["x86_64"] = """
|
||||
# define __DECL_REG(name) uint64_t r ## name
|
||||
# define __align8__ FIXME
|
||||
#endif
|
||||
#define __DECL_REG_LOHI(name) __DECL_REG(name ## x)
|
||||
#define __DECL_REG_LO8 __DECL_REG
|
||||
#define __DECL_REG_LO16 __DECL_REG
|
||||
#define __DECL_REG_HI __DECL_REG
|
||||
#define __x86_64___X86_64 1
|
||||
""";
|
||||
footer["x86_64"] = """
|
||||
#undef __DECL_REG
|
||||
#undef __DECL_REG_LOHI
|
||||
#undef __DECL_REG_LO8
|
||||
#undef __DECL_REG_LO16
|
||||
#undef __DECL_REG_HI
|
||||
"""
|
||||
|
||||
###########################################################################
|
||||
|
||||
@@ -46,7 +46,7 @@ x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h:
|
||||
HOSTCFLAGS += $(CFLAGS_xeninclude)
|
||||
|
||||
x86_emulate.o: x86_emulate.c x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h
|
||||
$(HOSTCC) $(HOSTCFLAGS) -c -g -o $@ $<
|
||||
$(HOSTCC) $(HOSTCFLAGS) -D__XEN_TOOLS__ -c -g -o $@ $<
|
||||
|
||||
test_x86_emulator.o: test_x86_emulator.c blowfish.h x86_emulate/x86_emulate.h
|
||||
$(HOSTCC) $(HOSTCFLAGS) -c -g -o $@ $<
|
||||
@@ -1530,8 +1530,8 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c)
|
||||
}
|
||||
|
||||
/* IOPL privileges are virtualised: merge back into returned eflags. */
|
||||
BUG_ON((c(user_regs.eflags) & X86_EFLAGS_IOPL) != 0);
|
||||
c(user_regs.eflags |= v->arch.pv_vcpu.iopl);
|
||||
BUG_ON((c(user_regs._eflags) & X86_EFLAGS_IOPL) != 0);
|
||||
c(user_regs._eflags |= v->arch.pv_vcpu.iopl);
|
||||
|
||||
if ( !compat )
|
||||
{
|
||||
|
||||
@@ -3093,7 +3093,7 @@ void hvm_task_switch(
|
||||
if ( segr.attr.fields.db )
|
||||
sp = regs->_esp -= opsz;
|
||||
else
|
||||
sp = *(uint16_t *)®s->esp -= opsz;
|
||||
sp = regs->sp -= opsz;
|
||||
if ( hvm_virtual_to_linear_addr(x86_seg_ss, &segr, sp, opsz,
|
||||
hvm_access_write,
|
||||
16 << segr.attr.fields.db,
|
||||
|
||||
@@ -66,30 +66,23 @@ static void realmode_deliver_exception(
|
||||
}
|
||||
}
|
||||
|
||||
frame[0] = regs->eip + insn_len;
|
||||
frame[0] = regs->ip + insn_len;
|
||||
frame[1] = csr->sel;
|
||||
frame[2] = regs->eflags & ~X86_EFLAGS_RF;
|
||||
frame[2] = regs->flags & ~X86_EFLAGS_RF;
|
||||
|
||||
/* We can't test hvmemul_ctxt->ctxt.sp_size: it may not be initialised. */
|
||||
if ( hvmemul_ctxt->seg_reg[x86_seg_ss].attr.fields.db )
|
||||
{
|
||||
regs->esp -= 6;
|
||||
pstk = regs->esp;
|
||||
}
|
||||
pstk = regs->_esp -= 6;
|
||||
else
|
||||
{
|
||||
pstk = (uint16_t)(regs->esp - 6);
|
||||
regs->esp &= ~0xffff;
|
||||
regs->esp |= pstk;
|
||||
}
|
||||
pstk = regs->sp -= 6;
|
||||
|
||||
pstk += hvmemul_get_seg_reg(x86_seg_ss, hvmemul_ctxt)->base;
|
||||
(void)hvm_copy_to_guest_phys(pstk, frame, sizeof(frame));
|
||||
|
||||
csr->sel = cs_eip >> 16;
|
||||
csr->base = (uint32_t)csr->sel << 4;
|
||||
regs->eip = (uint16_t)cs_eip;
|
||||
regs->eflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_IF | X86_EFLAGS_RF);
|
||||
regs->ip = (uint16_t)cs_eip;
|
||||
regs->_eflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_IF | X86_EFLAGS_RF);
|
||||
|
||||
/* Exception delivery clears STI and MOV-SS blocking. */
|
||||
if ( hvmemul_ctxt->intr_shadow &
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
static void ioemul_handle_proliant_quirk(
|
||||
u8 opcode, char *io_emul_stub, struct cpu_user_regs *regs)
|
||||
{
|
||||
uint16_t port = regs->edx;
|
||||
uint8_t value = regs->eax;
|
||||
uint16_t port = regs->dx;
|
||||
uint8_t value = regs->al;
|
||||
|
||||
if ( (opcode != 0xee) || (port != 0xcd4) || !(value & 0x80) )
|
||||
return;
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -30,7 +30,7 @@ headers-$(CONFIG_X86) += compat/hvm/hvm_vcpu.h
|
||||
headers-y += compat/arch-$(compat-arch-y).h compat/pmu.h compat/xlat.h
|
||||
headers-$(CONFIG_FLASK) += compat/xsm/flask_op.h
|
||||
|
||||
cppflags-y := -include public/xen-compat.h
|
||||
cppflags-y := -include public/xen-compat.h -DXEN_GENERATING_COMPAT_HEADERS
|
||||
cppflags-$(CONFIG_X86) += -m32
|
||||
|
||||
# 8-byte types are 4-byte aligned on x86_32 ...
|
||||
|
||||
@@ -109,22 +109,44 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#if defined(XEN_GENERATING_COMPAT_HEADERS)
|
||||
/* nothing */
|
||||
#elif defined(__XEN__) || defined(__XEN_TOOLS__)
|
||||
/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax). */
|
||||
#define __DECL_REG_LO8(which) union { \
|
||||
uint32_t e ## which ## x, _e ## which ## x; \
|
||||
uint16_t which ## x; \
|
||||
struct { \
|
||||
uint8_t which ## l; \
|
||||
uint8_t which ## h; \
|
||||
}; \
|
||||
}
|
||||
#define __DECL_REG_LO16(name) union { \
|
||||
uint32_t e ## name, _e ## name; \
|
||||
uint16_t name; \
|
||||
}
|
||||
#else
|
||||
/* Other sources must always use the proper 32-bit name (e.g., eax). */
|
||||
#define __DECL_REG_LO8(which) uint32_t e ## which ## x
|
||||
#define __DECL_REG_LO16(name) uint32_t e ## name
|
||||
#endif
|
||||
|
||||
struct cpu_user_regs {
|
||||
uint32_t ebx;
|
||||
uint32_t ecx;
|
||||
uint32_t edx;
|
||||
uint32_t esi;
|
||||
uint32_t edi;
|
||||
uint32_t ebp;
|
||||
uint32_t eax;
|
||||
__DECL_REG_LO8(b);
|
||||
__DECL_REG_LO8(c);
|
||||
__DECL_REG_LO8(d);
|
||||
__DECL_REG_LO16(si);
|
||||
__DECL_REG_LO16(di);
|
||||
__DECL_REG_LO16(bp);
|
||||
__DECL_REG_LO8(a);
|
||||
uint16_t error_code; /* private */
|
||||
uint16_t entry_vector; /* private */
|
||||
uint32_t eip;
|
||||
__DECL_REG_LO16(ip);
|
||||
uint16_t cs;
|
||||
uint8_t saved_upcall_mask;
|
||||
uint8_t _pad0;
|
||||
uint32_t eflags; /* eflags.IF == !saved_upcall_mask */
|
||||
uint32_t esp;
|
||||
__DECL_REG_LO16(flags); /* eflags.IF == !saved_upcall_mask */
|
||||
__DECL_REG_LO16(sp);
|
||||
uint16_t ss, _pad1;
|
||||
uint16_t es, _pad2;
|
||||
uint16_t ds, _pad3;
|
||||
@@ -134,6 +156,9 @@ struct cpu_user_regs {
|
||||
typedef struct cpu_user_regs cpu_user_regs_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
|
||||
|
||||
#undef __DECL_REG_LO8
|
||||
#undef __DECL_REG_LO16
|
||||
|
||||
/*
|
||||
* Page-directory addresses above 4GB do not fit into architectural %cr3.
|
||||
* When accessing %cr3, or equivalent field in vcpu_guest_context, guests
|
||||
|
||||
@@ -130,7 +130,35 @@ struct iret_context {
|
||||
/* Bottom of iret stack frame. */
|
||||
};
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
#if defined(__XEN__) || defined(__XEN_TOOLS__)
|
||||
/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax/rax). */
|
||||
#define __DECL_REG_LOHI(which) union { \
|
||||
uint64_t r ## which ## x; \
|
||||
uint32_t _e ## which ## x; \
|
||||
uint16_t which ## x; \
|
||||
struct { \
|
||||
uint8_t which ## l; \
|
||||
uint8_t which ## h; \
|
||||
}; \
|
||||
}
|
||||
#define __DECL_REG_LO8(name) union { \
|
||||
uint64_t r ## name; \
|
||||
uint32_t _e ## name; \
|
||||
uint16_t name; \
|
||||
uint8_t name ## l; \
|
||||
}
|
||||
#define __DECL_REG_LO16(name) union { \
|
||||
uint64_t r ## name; \
|
||||
uint32_t _e ## name; \
|
||||
uint16_t name; \
|
||||
}
|
||||
#define __DECL_REG_HI(num) union { \
|
||||
uint64_t r ## num; \
|
||||
uint32_t r ## num ## d; \
|
||||
uint16_t r ## num ## w; \
|
||||
uint8_t r ## num ## b; \
|
||||
}
|
||||
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
|
||||
#define __DECL_REG(name) union { \
|
||||
uint64_t r ## name, e ## name; \
|
||||
@@ -141,30 +169,37 @@ struct iret_context {
|
||||
#define __DECL_REG(name) uint64_t r ## name
|
||||
#endif
|
||||
|
||||
#ifndef __DECL_REG_LOHI
|
||||
#define __DECL_REG_LOHI(name) __DECL_REG(name ## x)
|
||||
#define __DECL_REG_LO8 __DECL_REG
|
||||
#define __DECL_REG_LO16 __DECL_REG
|
||||
#define __DECL_REG_HI __DECL_REG
|
||||
#endif
|
||||
|
||||
struct cpu_user_regs {
|
||||
uint64_t r15;
|
||||
uint64_t r14;
|
||||
uint64_t r13;
|
||||
uint64_t r12;
|
||||
__DECL_REG(bp);
|
||||
__DECL_REG(bx);
|
||||
uint64_t r11;
|
||||
uint64_t r10;
|
||||
uint64_t r9;
|
||||
uint64_t r8;
|
||||
__DECL_REG(ax);
|
||||
__DECL_REG(cx);
|
||||
__DECL_REG(dx);
|
||||
__DECL_REG(si);
|
||||
__DECL_REG(di);
|
||||
__DECL_REG_HI(15);
|
||||
__DECL_REG_HI(14);
|
||||
__DECL_REG_HI(13);
|
||||
__DECL_REG_HI(12);
|
||||
__DECL_REG_LO8(bp);
|
||||
__DECL_REG_LOHI(b);
|
||||
__DECL_REG_HI(11);
|
||||
__DECL_REG_HI(10);
|
||||
__DECL_REG_HI(9);
|
||||
__DECL_REG_HI(8);
|
||||
__DECL_REG_LOHI(a);
|
||||
__DECL_REG_LOHI(c);
|
||||
__DECL_REG_LOHI(d);
|
||||
__DECL_REG_LO8(si);
|
||||
__DECL_REG_LO8(di);
|
||||
uint32_t error_code; /* private */
|
||||
uint32_t entry_vector; /* private */
|
||||
__DECL_REG(ip);
|
||||
__DECL_REG_LO16(ip);
|
||||
uint16_t cs, _pad0[1];
|
||||
uint8_t saved_upcall_mask;
|
||||
uint8_t _pad1[3];
|
||||
__DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */
|
||||
__DECL_REG(sp);
|
||||
__DECL_REG_LO16(flags); /* rflags.IF == !saved_upcall_mask */
|
||||
__DECL_REG_LO8(sp);
|
||||
uint16_t ss, _pad2[3];
|
||||
uint16_t es, _pad3[3];
|
||||
uint16_t ds, _pad4[3];
|
||||
@@ -175,6 +210,10 @@ typedef struct cpu_user_regs cpu_user_regs_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
|
||||
|
||||
#undef __DECL_REG
|
||||
#undef __DECL_REG_LOHI
|
||||
#undef __DECL_REG_LO8
|
||||
#undef __DECL_REG_LO16
|
||||
#undef __DECL_REG_HI
|
||||
|
||||
#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12)
|
||||
#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12)
|
||||
|
||||
@@ -57,7 +57,17 @@
|
||||
#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
|
||||
|
||||
#if defined(__i386__)
|
||||
# ifdef __XEN__
|
||||
__DeFiNe__ __DECL_REG_LO8(which) uint32_t _e ## which ## x
|
||||
__DeFiNe__ __DECL_REG_LO16(name) union { uint32_t e ## name, _e ## name; }
|
||||
# endif
|
||||
#include "xen-x86_32.h"
|
||||
# ifdef __XEN__
|
||||
__UnDeF__ __DECL_REG_LO8
|
||||
__UnDeF__ __DECL_REG_LO16
|
||||
__DeFiNe__ __DECL_REG_LO8(which) _e ## which ## x
|
||||
__DeFiNe__ __DECL_REG_LO16(name) _e ## name
|
||||
# endif
|
||||
#elif defined(__x86_64__)
|
||||
#include "xen-x86_64.h"
|
||||
#endif
|
||||
|
||||
@@ -7,6 +7,8 @@ pats = [
|
||||
[ r"__IfDeF__ (XEN_HAVE.*)", r"#ifdef \1" ],
|
||||
[ r"__ElSe__", r"#else" ],
|
||||
[ r"__EnDif__", r"#endif" ],
|
||||
[ r"__DeFiNe__", r"#define" ],
|
||||
[ r"__UnDeF__", r"#undef" ],
|
||||
[ r"\"xen-compat.h\"", r"<public/xen-compat.h>" ],
|
||||
[ r"(struct|union|enum)\s+(xen_?)?(\w)", r"\1 compat_\3" ],
|
||||
[ r"@KeeP@", r"" ],
|
||||
|
||||