Adds 64 bit option
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 8 Jun 2013 00:25:37 +0000 (17:25 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 8 Jun 2013 00:36:33 +0000 (17:36 -0700)
Had to move the CROSS_COMPILE detection section to after including auto.conf,
so that we get up-to-date values for it.  Otherwise, when switching bitness, we
could get the same cross compiler as the previous run.

This also gets rid of the old $(error) when we can't find the cross compiler.
Instead, we detect it when we bulid.  The clean targets shouldn't rely on those
XCC related values anyways, but we'll see.

This also auto-includes common.h (and also ros/common.h) into every kernel
file.

Kconfig
Makefile
kern/arch/x86/Kconfig
kern/arch/x86/Makefile
kern/include/common.h [new file with mode: 0644]
kern/include/ros/common.h

diff --git a/Kconfig b/Kconfig
index 951cc5d..e45d031 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -9,6 +9,12 @@ config SRCARCH
        string
        option env="ARCH"
 
+config 64BIT
+       bool "64-bit kernel"
+       default n
+       help
+               Say yes to build a 64-bit kernel, amd64 / x86_64, riscv64, etc.
+
 source "kern/arch/$SRCARCH/Kconfig"
 
 source "kern/src/net/Kconfig"
index fa2e392..ab6855c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -185,68 +185,6 @@ export quiet Q KBUILD_VERBOSE
 $(srctree)/scripts/Kbuild.include: ;
 include $(srctree)/scripts/Kbuild.include
 
-# Akaros Build Environment
-# =========================================================================
-AKAROSINCLUDE   := -I$(srctree)/kern/include/
-
-# CROSS_COMPILE is defined per-arch.  Each arch can set other makeflags, kbuild
-# directories, etc. 
--include $(srctree)/kern/arch/$(ARCH)/Makefile
-
-CC         := $(CROSS_COMPILE)gcc 
-CPP        := $(CROSS_COMPILE)g++
-AS         := $(CROSS_COMPILE)as
-AR         := $(CROSS_COMPILE)ar
-LD         := $(CROSS_COMPILE)ld
-OBJCOPY        := $(CROSS_COMPILE)objcopy
-OBJDUMP        := $(CROSS_COMPILE)objdump
-NM         := $(CROSS_COMPILE)nm
-STRIP   := $(CROSS_COMPILE)strip
-
-ifeq ($(goals-has-build-targets),1)
-ifeq ($(shell which $(CROSS_COMPILE)gcc 2>/dev/null ),)
-$(error Could not find a $(CROSS_COMPILE) version of GCC/binutils. \
-        Be sure to build the cross-compiler and update your PATH)
-endif
-# Computing these without a cross compiler complains loudly
-gcc-lib := $(shell $(CC) -print-libgcc-file-name)
-NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
-XCC_TARGET_ROOT := $(dir $(shell which $(CC)))../$(patsubst %-,%,\
-                                                   $(CROSS_COMPILE))
-endif
-
-CFLAGS_KERNEL += -O2 -pipe -MD -gstabs
-CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
-CFLAGS_KERNEL += -fno-strict-aliasing -fno-omit-frame-pointer
-CFLAGS_KERNEL += -fno-stack-protector
-CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused
-CFLAGS_KERNEL += -DROS_KERNEL 
-CFLAGS_KERNEL += -include include/generated/autoconf.h
-
-# TODO: do we need this, or can we rely on the compiler's defines?
-CFLAGS_KERNEL += -D$(ARCH)
-
-# TODO: this requires our own strchr (kern/src/stdio.c), which is a potential
-# source of bugs/problems.
-# note we still pull in stdbool and stddef from the compiler
-CFLAGS_KERNEL += -fno-builtin
-
-AFLAGS_KERNEL := $(CFLAGS_KERNEL)
-
-KBUILD_BUILTIN := 1
-KBUILD_CHECKSRC := 0
-
-export AKAROSINCLUDE CROSS_COMPILE
-export CC CPP AS AR LD OBJCOPY OBJDUMP NM STRIP
-export CFLAGS_KERNEL AFLAGS_KERNEL
-export NOSTDINC_FLAGS XCC_TARGET_ROOT
-export KBUILD_BUILTIN KBUILD_CHECKSRC
-
-CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline
-CXXFLAGS_USER += -O2
-
-export CFLAGS_USER CXXFLAGS_USER
-
 # Kbuild Target/Goals Parsing
 # =========================================================================
 # Need to figure out if we're a config or not, and whether or not to include
@@ -341,6 +279,72 @@ else
 include/config/auto.conf: ;
 endif # $(dot-config)
 
+# Akaros Build Environment
+# =========================================================================
+AKAROSINCLUDE   := -I$(srctree)/kern/include/
+
+# CROSS_COMPILE is defined per-arch.  Each arch can set other makeflags, kbuild
+# directories, etc. 
+-include $(srctree)/kern/arch/$(ARCH)/Makefile
+
+CC         := $(CROSS_COMPILE)gcc 
+CPP        := $(CROSS_COMPILE)g++
+AS         := $(CROSS_COMPILE)as
+AR         := $(CROSS_COMPILE)ar
+LD         := $(CROSS_COMPILE)ld
+OBJCOPY        := $(CROSS_COMPILE)objcopy
+OBJDUMP        := $(CROSS_COMPILE)objdump
+NM         := $(CROSS_COMPILE)nm
+STRIP   := $(CROSS_COMPILE)strip
+
+# These may have bogus values if there is no compiler.  The kernel and user
+# build targets will check cc-exists.  Hopefully no cleaning targets rely on
+# these.  Note that if you change configs, these will get computed once, before
+# silentoldconfig kicks in to regenerate auto.conf, and these values will
+# temporarily be stale.
+gcc-lib := $(shell $(CC) -print-libgcc-file-name 2>/dev/null)
+NOSTDINC_FLAGS += -nostdinc -isystem \
+                  $(shell $(CC) -print-file-name=include 2>/dev/null)
+XCC_TARGET_ROOT := $(dir $(shell which $(CC)))../$(patsubst %-,%,\
+                                                   $(CROSS_COMPILE))
+
+CFLAGS_KERNEL += -O2 -pipe -MD -gstabs
+CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
+CFLAGS_KERNEL += -fno-strict-aliasing -fno-omit-frame-pointer
+CFLAGS_KERNEL += -fno-stack-protector
+CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused
+CFLAGS_KERNEL += -DROS_KERNEL 
+CFLAGS_KERNEL += -include include/generated/autoconf.h -include include/common.h
+ifeq ($(CONFIG_64BIT),y)
+CFLAGS_KERNEL += -m64
+else
+CFLAGS_KERNEL += -m32
+endif
+
+# TODO: do we need this, or can we rely on the compiler's defines?
+CFLAGS_KERNEL += -D$(ARCH)
+
+# TODO: this requires our own strchr (kern/src/stdio.c), which is a potential
+# source of bugs/problems.
+# note we still pull in stdbool and stddef from the compiler
+CFLAGS_KERNEL += -fno-builtin
+
+AFLAGS_KERNEL := $(CFLAGS_KERNEL)
+
+KBUILD_BUILTIN := 1
+KBUILD_CHECKSRC := 0
+
+export AKAROSINCLUDE CROSS_COMPILE
+export CC CPP AS AR LD OBJCOPY OBJDUMP NM STRIP
+export CFLAGS_KERNEL AFLAGS_KERNEL
+export NOSTDINC_FLAGS XCC_TARGET_ROOT
+export KBUILD_BUILTIN KBUILD_CHECKSRC
+
+CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline
+CXXFLAGS_USER += -O2
+
+export CFLAGS_USER CXXFLAGS_USER
+
 # Akaros include stuff (includes custom make targets and user overrides)
 # =========================================================================
 
@@ -456,10 +460,15 @@ $(sort $(akaros-deps)): $(akaros-dirs) ;
 
 # Recursively Kbuild all of our directories.  If we're changing arches
 # mid-make, we might have issues ( := on akaros-dirs, etc).
-PHONY += $(akaros-dirs)
-$(akaros-dirs): scripts symlinks
+PHONY += $(akaros-dirs) cc_exists
+$(akaros-dirs): scripts symlinks cc-exists
        $(Q)$(MAKE) $(build)=$@
 
+cc-exists:
+       @if [ "`which $(CROSS_COMPILE)gcc`" = "" ]; then echo \
+           Could not find a $(CROSS_COMPILE) version of GCC/binutils. \
+           Be sure to build the cross-compiler and update your PATH; exit 1; fi
+
 $(CMP_KERNEL_OBJ): $(KERNEL_OBJ)
        @echo "Compressing kernel image"
        $(Q)gzip -c $^ > $@
@@ -484,7 +493,7 @@ user-dirs = parlib pthread benchutil
 pthread: parlib
 
 PHONY += install-libs $(user-dirs)
-install-libs: $(user-dirs) symlinks
+install-libs: $(user-dirs) symlinks cc-exists
 
 $(user-dirs):
        @cd user/$@ && $(MAKE) && $(MAKE) install
index b18407b..9ad1e21 100644 (file)
@@ -1,6 +1,12 @@
 config X86
        def_bool y
 
+config X86_32
+       def_bool !64BIT
+
+config X86_64
+       def_bool 64BIT
+
 menu "x86 Hacks"
 
 config PCI_VERBOSE
index 3df576d..73f976e 100644 (file)
@@ -1 +1,5 @@
+ifeq ($(CONFIG_X86_64),y)
+CROSS_COMPILE := x86_64-ros-
+else
 CROSS_COMPILE := i686-ros-
+endif
diff --git a/kern/include/common.h b/kern/include/common.h
new file mode 100644 (file)
index 0000000..e156f9d
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef ROS_KERN_COMMON_H
+#define ROS_KERN_COMMON_H
+
+#include <ros/common.h>
+
+/* Force a rebuild of the whole kernel if 64BIT-ness changed */
+#ifdef CONFIG_64BIT
+#endif
+
+#endif /* ROS_KERN_COMMON_H */
+
index 3540d05..77b03da 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef ROS_COMMON_H
 #define ROS_COMMON_H
 
+#ifndef __ASSEMBLER__
 #ifndef __IVY__
 #include <ros/noivy.h>
 #endif
@@ -166,4 +167,6 @@ static inline bool mult_will_overflow_u64(uint64_t a, uint64_t b)
        initialized = TRUE;                                                        \
 }
 
+#endif /* __ASSEMBLER__ */
+
 #endif /* ROS_COMMON_H */