From 59600ef8acc6c2f2566f4303b599a03f5e527de6 Mon Sep 17 00:00:00 2001 From: Patrick Colp Date: Thu, 28 Oct 2010 12:15:41 +0100 Subject: tools: caml-stubdom: fix "red zone" bug According to the AMD64 ABI, the 128-byte area below %rsp is reserved for scratch space and should not be used by signal, interrupt, or exception handlers. However, Mini-OS does not adhere to this interface. As a result, the -mno-red-zone flag must be provided to gcc in order to force code to be compiled without this assumption. In the case of the c-stubdom or the ioemu stubdom, Makefile configuration and flags are inherited from Xen, which includes this flag. However, in the case of the ocaml stubdom, since an independent ocaml version is pulled and compiled, with its own make system in place, this flag is not present. As a default optimisation (no optimisation flags specified), gcc generates function header code that uses mov instead of push (to save a few instructions). However, with the 128-byte scratch space assumption in place, registers are moved onto the stack *before* %rsp is updated. This results in cases where when a function is being called, *after* the first mov , (%rsp) but *before* the %rsp update, sub , %rsp, if an interrupt is fired, then the stack will be clobbered (as Mini-OS uses the application stack for its stack, pushing registers onto the stack on entry and popping them off on exit). This patch fixes this issue by passing the -mno-red-zone flag to the ocaml configure script in the stubdom Makefile. Signed-off-by: Patrick Colp Signed-off-by: Ian Jackson --- stubdom/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'stubdom/Makefile') diff --git a/stubdom/Makefile b/stubdom/Makefile index 5525e83cfb..ade20496cb 100644 --- a/stubdom/Makefile +++ b/stubdom/Makefile @@ -200,7 +200,7 @@ cross-ocaml: $(OCAML_STAMPFILE) $(OCAML_STAMPFILE): ocaml-$(XEN_TARGET_ARCH)/.dirstamp cd ocaml-$(XEN_TARGET_ARCH) && ./configure -prefix $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf \ -no-pthread -no-shared-libs -no-tk -no-curses \ - -cc "$(CC) -U_FORTIFY_SOURCE -fno-stack-protector" + -cc "$(CC) -U_FORTIFY_SOURCE -fno-stack-protector -mno-red-zone" $(foreach i,$(MINIOS_HASNOT),sed -i 's,^\(#define HAS_$(i)\),//\1,' ocaml-$(XEN_TARGET_ARCH)/config/s.h ; ) $(CROSS_MAKE) -C ocaml-$(XEN_TARGET_ARCH) world $(CROSS_MAKE) -C ocaml-$(XEN_TARGET_ARCH) opt -- cgit v1.2.3