At the moment, Jailhouse is - by default - compiled with -Os.
Nevertheless, at least we should also support other optimisation levels,
such as -O2, without breaking anything.

Turns out, if we compile Jailhouse with -O2, GCC creates endless loops
inside memset. What it does - at least on my RISC-V port for example -
is to emit the following code for memset:

   ffffffdfff00a6be <memset>:
   ffffffdfff00a6be:       1141                    addi    sp,sp,-16
   ffffffdfff00a6c0:       e022                    sd      s0,0(sp)
   ffffffdfff00a6c2:       e406                    sd      ra,8(sp)
   ffffffdfff00a6c4:       842a                    mv      s0,a0
   ffffffdfff00a6c6:       c609                    beqz a2,ffffffdfff00a6d0 
<memset+0x12>
   ffffffdfff00a6c8:       0ff5f593                zext.b  a1,a1
-> ffffffdfff00a6cc:       ff3ff0ef                jal ra,ffffffdfff00a6be 
<memset>
   ffffffdfff00a6d0:       60a2                    ld      ra,8(sp)
   ffffffdfff00a6d2:       8522                    mv      a0,s0
   ffffffdfff00a6d4:       6402                    ld      s0,0(sp)
   ffffffdfff00a6d6:       0141                    addi    sp,sp,16
   ffffffdfff00a6d8:       8082                    ret

In the marked line, we end up in an endless loop. The reason is that gcc
recognises that we're about to implement a memset, and tries to take the
shortcut by replacing our implementation by calling - guess what -
memset. And here we are: endless loop.

I don't know, but this could maybe also happen with -Os if they change
optimisation strategies.

To avoid issues like this in future, better add -ffreestanding to our
compiler options. I wonder why we were missing that option in anyway.

Signed-off-by: Ralf Ramsauer <[email protected]>
---
 hypervisor/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hypervisor/Makefile b/hypervisor/Makefile
index c475b8fd..b35809f5 100644
--- a/hypervisor/Makefile
+++ b/hypervisor/Makefile
@@ -32,7 +32,7 @@ KBUILD_CFLAGS := -g -ggdb -gdwarf-3 -O0 -Wall -Wextra 
-Wno-unused-parameter \
                 -Wnested-externs -Wshadow -Wredundant-decls \
                 -Wundef -Wdeprecated \
                 -fno-strict-aliasing -fno-pic -fno-common \
-                -fno-stack-protector -fno-builtin-ffsl \
+                -fno-stack-protector -fno-builtin-ffsl -ffreestanding \
                 -D__LINUX_COMPILER_TYPES_H
 
 include $(src)/arch/$(SRCARCH)/Makefile
-- 
2.37.1

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/20220809124950.42931-1-ralf.ramsauer%40oth-regensburg.de.

Reply via email to