summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2018-03-20 20:34:46 +0100
committerMichael Brown2018-03-20 21:01:08 +0100
commit1df3b53051e2baa99abd00b2fe71ccfa6672331e (patch)
treef50818b2954e0a697729ef2b830090a1fb7c3ae8
parent[rng] Use fixed-point calculations for min-entropy quantities (diff)
downloadipxe-1df3b53051e2baa99abd00b2fe71ccfa6672331e.tar.gz
ipxe-1df3b53051e2baa99abd00b2fe71ccfa6672331e.tar.xz
ipxe-1df3b53051e2baa99abd00b2fe71ccfa6672331e.zip
[build] Prevent use of MMX and SSE registers
The existence of MMX and SSE is required by the System V x86_64 ABI and so is assumed by gcc, but these registers are not preserved by our own interrupt handlers and are unlikely to be preserved by other context switch handlers in a boot firmware environment. Explicitly prevent gcc from using MMX or SSE registers to avoid potential problems due to silent register corruption. We must remove the %xmm0-%xmm5 clobbers from the x86_64 version of hv_call() since otherwise gcc will complain about unknown register names. Theoretically, we should probably add code to explicitly preserve the %xmm0-%xmm5 registers across a hypercall, in order to guarantee to external code that these registers remain unchanged. In practice this is difficult since SSE registers are disabled by default: for background information see commits 71560d1 ("[librm] Preserve FPU, MMX and SSE state across calls to virt_call()") and dd9a14d ("[librm] Conditionalize the workaround for the Tivoli VMM's SSE garbling"). Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/x86_64/Makefile4
-rw-r--r--src/arch/x86_64/include/bits/hyperv.h3
2 files changed, 5 insertions, 2 deletions
diff --git a/src/arch/x86_64/Makefile b/src/arch/x86_64/Makefile
index 246905cd..b3064b75 100644
--- a/src/arch/x86_64/Makefile
+++ b/src/arch/x86_64/Makefile
@@ -13,6 +13,10 @@ CFLAGS += -m64
ASFLAGS += --64
LDFLAGS += -m elf_x86_64
+# Prevent use of MMX and SSE registers
+#
+CFLAGS += -mno-mmx -mno-sse
+
# EFI requires -fshort-wchar, and nothing else currently uses wchar_t
#
CFLAGS += -fshort-wchar
diff --git a/src/arch/x86_64/include/bits/hyperv.h b/src/arch/x86_64/include/bits/hyperv.h
index 975b1eee..fa8bb3f9 100644
--- a/src/arch/x86_64/include/bits/hyperv.h
+++ b/src/arch/x86_64/include/bits/hyperv.h
@@ -44,8 +44,7 @@ hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in,
: "=a" ( result ), "+r" ( rcx ), "+r" ( rdx ),
"+r" ( r8 )
: "m" ( hypercall )
- : "r9", "r10", "r11", "xmm0", "xmm1", "xmm2",
- "xmm3", "xmm4", "xmm5" );
+ : "r9", "r10", "r11" );
return result;
}