added 2 changesets to branch 'refs/remotes/xyzzy-github/x86_64' old head: b2cd72d8f3c4a3710fdbaf36802de3d6e74a4066 new head: 385d69fc0177827257822eec1274f4286bc6600d ---------------------------------------------------------------------------- 0cbce9a: A few 64-bit fixes for ELF/module code. 385d69f: Made it possible to build kernel modules for x86_64. Added the necessary build flags for modules, and added a module (dpc) to the floppy image for x86_64 builds for testing purposes. The module gets loaded correctly and its code runs without issue. Only non-trivial addition is the different method for generating kernel.so, this is explained in the kernel Jamfile. [ Alex Smith <alex@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- 7 files changed, 91 insertions(+), 49 deletions(-) build/jam/BuildSetup | 20 ++++++----- build/jam/FloppyBootImage | 11 ++++-- build/jam/KernelRules | 20 ++++++++++- configure | 3 ++ src/system/kernel/Jamfile | 72 ++++++++++++++++++++++---------------- src/system/kernel/elf.cpp | 12 +++---- src/system/kernel/module.cpp | 2 +- ############################################################################ Commit: 0cbce9aa4732e96acd9d593cb86ca0847a61d051 Author: Alex Smith <alex@xxxxxxxxxxxxxxxx> Date: Thu Jul 19 11:45:17 2012 UTC A few 64-bit fixes for ELF/module code. ---------------------------------------------------------------------------- diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp index e4682fe..822d818 100644 --- a/src/system/kernel/elf.cpp +++ b/src/system/kernel/elf.cpp @@ -709,7 +709,7 @@ static status_t elf_parse_dynamic_section(struct elf_image_info *image) { elf_dyn *d; - int32 neededOffset = -1; + ssize_t neededOffset = -1; TRACE(("top of elf_parse_dynamic_section\n")); @@ -1139,7 +1139,7 @@ unload_elf_image(struct elf_image_info *image) if (atomic_add(&image->ref_count, -1) > 1) return; - TRACE(("unload image %ld, %s\n", image->id, image->name)); + TRACE(("unload image %" B_PRId32 ", %s\n", image->id, image->name)); unregister_elf_image(image); delete_elf_image(image); @@ -1228,7 +1228,7 @@ load_elf_symbol_table(int fd, struct elf_image_info *image) goto error3; } - TRACE(("loaded debug %ld symbols\n", numSymbols)); + TRACE(("loaded %" B_PRId32 " debug symbols\n", numSymbols)); // insert tables into image image->debug_symbols = symbolTable; @@ -1904,9 +1904,9 @@ elf_load_user_image(const char *path, Team *team, int flags, addr_t *entry) B_PAGE_SIZE); if (programHeaders[i].p_flags & PF_WRITE) { // rw/data segment - uint32 memUpperBound = (programHeaders[i].p_vaddr % B_PAGE_SIZE) + size_t memUpperBound = (programHeaders[i].p_vaddr % B_PAGE_SIZE) + programHeaders[i].p_memsz; - uint32 fileUpperBound = (programHeaders[i].p_vaddr % B_PAGE_SIZE) + size_t fileUpperBound = (programHeaders[i].p_vaddr % B_PAGE_SIZE) + programHeaders[i].p_filesz; memUpperBound = ROUNDUP(memUpperBound, B_PAGE_SIZE); @@ -2151,7 +2151,7 @@ load_kernel_add_on(const char *path) char regionName[B_OS_NAME_LENGTH]; elf_region *region; - TRACE(("looking at program header %ld\n", i)); + TRACE(("looking at program header %" B_PRId32 "\n", i)); switch (programHeaders[i].p_type) { case PT_LOAD: diff --git a/src/system/kernel/module.cpp b/src/system/kernel/module.cpp index a2b5157..81039b8 100644 --- a/src/system/kernel/module.cpp +++ b/src/system/kernel/module.cpp @@ -1100,7 +1100,7 @@ register_preloaded_module_image(struct preloaded_image* image) int32 index = 0; TRACE(("register_preloaded_module_image(image = %p, name = \"%s\")\n", - image, image->name)); + image, image->name.Pointer())); image->is_module = false; ############################################################################ Commit: 385d69fc0177827257822eec1274f4286bc6600d Author: Alex Smith <alex@xxxxxxxxxxxxxxxx> Date: Thu Jul 19 16:53:46 2012 UTC Made it possible to build kernel modules for x86_64. Added the necessary build flags for modules, and added a module (dpc) to the floppy image for x86_64 builds for testing purposes. The module gets loaded correctly and its code runs without issue. Only non-trivial addition is the different method for generating kernel.so, this is explained in the kernel Jamfile. ---------------------------------------------------------------------------- diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 2903225..49a6d35 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -356,6 +356,7 @@ if $(HAIKU_GCC_VERSION[1]) >= 4 { HAIKU_KERNEL_PIC_CCFLAGS = -fno-pic ; HAIKU_KERNEL_PIC_LINKFLAGS = ; +HAIKU_KERNEL_ADDON_LINKFLAGS = ; switch $(HAIKU_ARCH) { case ppc : @@ -389,13 +390,16 @@ switch $(HAIKU_ARCH) { case x86_64 : { # Kernel lives in the top 2GB of the address space, use kernel code - # model. Also disable the red zone, which cannot be used in kernel - # code due to interrupts. - HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone - -fno-omit-frame-pointer ; - HAIKU_KERNEL_C++FLAGS += -mcmodel=kernel -mno-red-zone - -fno-omit-frame-pointer ; + # model. + HAIKU_KERNEL_PIC_CCFLAGS += -mcmodel=kernel ; + + # Disable the red zone, which cannot be used in kernel code due to + # interrupts, and always enable the frame pointer so stack traces are + # correct. + HAIKU_KERNEL_CCFLAGS += -mno-red-zone -fno-omit-frame-pointer ; + HAIKU_KERNEL_C++FLAGS += -mno-red-zone -fno-omit-frame-pointer ; HAIKU_KERNEL_PIC_LINKFLAGS += -z max-page-size=0x1000 ; + HAIKU_KERNEL_ADDON_LINKFLAGS += -z max-page-size=0x1000 ; # Bootloader is 32-bit. HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ; @@ -984,7 +988,7 @@ if $(TARGET_PLATFORM) != haiku { local buildVars = ARCH CPU GCC_VERSION KERNEL_ARCH - AR CC C++ LD OBJCOPY RANLIB + AR CC C++ LD OBJCOPY RANLIB ELFEDIT INCLUDES_SEPARATOR LOCAL_INCLUDES_OPTION SYSTEM_INCLUDES_OPTION @@ -993,7 +997,7 @@ local buildVars = KERNEL_DEFINES KERNEL_CCFLAGS KERNEL_C++FLAGS - KERNEL_PIC_CCFLAGS KERNEL_PIC_LINKFLAGS + KERNEL_PIC_CCFLAGS KERNEL_PIC_LINKFLAGS KERNEL_ADDON_LINKFLAGS BOOT_CCFLAGS BOOT_C++FLAGS BOOT_LINKFLAGS WARNING_CCFLAGS WARNING_C++FLAGS diff --git a/build/jam/FloppyBootImage b/build/jam/FloppyBootImage index 1af9d5b..2bfe08f 100644 --- a/build/jam/FloppyBootImage +++ b/build/jam/FloppyBootImage @@ -52,7 +52,10 @@ SYSTEM_ADD_ONS_BUS_MANAGERS = $(X86_ONLY)acpi $(ATA_ONLY)ata config_manager dpc SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs iso9660 attribute_overlay write_overlay ; -if $(TARGET_ARCH) != x86_64 { +if $(TARGET_ARCH) = x86_64 { + AddFilesToFloppyBootArchive system add-ons kernel bus_managers + : dpc ; +} else { # modules AddFilesToFloppyBootArchive system add-ons kernel bus_managers : $(SYSTEM_ADD_ONS_BUS_MANAGERS) ; @@ -121,7 +124,11 @@ if $(NET_BOOT) = 1 { } # boot module links -if $(TARGET_ARCH) != x86_64 { +if $(TARGET_ARCH) = x86_64 { + AddBootModuleSymlinksToFloppyBootArchive + dpc + ; +} else { AddBootModuleSymlinksToFloppyBootArchive $(SYSTEM_ADD_ONS_BUS_MANAGERS) $(PPC_ONLY)openpic diff --git a/build/jam/KernelRules b/build/jam/KernelRules index 25b2260..091e100 100644 --- a/build/jam/KernelRules +++ b/build/jam/KernelRules @@ -77,6 +77,24 @@ actions KernelLd bind VERSION_SCRIPT --version-script=$(VERSION_SCRIPT) } +rule KernelSo target : source +{ + # KernelSo <target> : <source> + + Depends $(target) : <build>copyattr $(source) ; + + MakeLocateDebug $(1) ; + KernelSo1 $(target) : <build>copyattr $(source) ; +} + +actions KernelSo1 +{ + $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) + + $(2[1]) --data $(2[2]) $(1) && + $(HAIKU_ELFEDIT) --output-type dyn $(1) +} + rule KernelAddon { # KernelAddon <name> : <sources> : <static-libraries> : <res> ; @@ -117,7 +135,7 @@ rule KernelAddon # compile and link SetupKernel $(sources) : $(TARGET_KERNEL_PIC_FLAGS) : false ; local linkFlags = -nostdlib -Xlinker --no-undefined - -Xlinker -soname=\"$(target:G=)\" ; + -Xlinker -soname=\"$(target:G=)\" $(TARGET_KERNEL_ADDON_LINKFLAGS) ; LINKFLAGS on $(target) = [ on $(target) return $(LINKFLAGS) ] $(linkFlags) ; Main $(target) : $(sources) ; LinkAgainst $(target) : $(libs) $(kernel) ; diff --git a/configure b/configure index 2b0dd89..160679c 100755 --- a/configure +++ b/configure @@ -344,6 +344,7 @@ set_default_value HAIKU_CC gcc set_default_value HAIKU_LD ld set_default_value HAIKU_OBJCOPY objcopy set_default_value HAIKU_RANLIB ranlib +set_default_value HAIKU_ELFEDIT elfedit set_default_value HAIKU_YASM yasm set_default_value HAIKU_CPPFLAGS "" set_default_value HAIKU_CCFLAGS "" @@ -510,6 +511,7 @@ if [ -n "$crossToolsPrefix" ]; then get_build_tool_path LD ld get_build_tool_path OBJCOPY objcopy get_build_tool_path RANLIB ranlib + get_build_tool_path ELFEDIT elfedit fi # prepare gcc settings @@ -570,6 +572,7 @@ HAIKU_CC ?= ${HAIKU_CC} ; HAIKU_LD ?= ${HAIKU_LD} ; HAIKU_OBJCOPY ?= ${HAIKU_OBJCOPY} ; HAIKU_RANLIB ?= ${HAIKU_RANLIB} ; +HAIKU_ELFEDIT ?= ${HAIKU_ELFEDIT} ; HAIKU_YASM ?= ${HAIKU_YASM} ; HAIKU_CPPFLAGS ?= ${HAIKU_CPPFLAGS} ; HAIKU_CCFLAGS ?= ${HAIKU_CCFLAGS} ; diff --git a/src/system/kernel/Jamfile b/src/system/kernel/Jamfile index d40862b..0937fbb 100644 --- a/src/system/kernel/Jamfile +++ b/src/system/kernel/Jamfile @@ -134,37 +134,47 @@ KernelLd kernel_$(TARGET_ARCH) : : ; -KernelLd kernel.so : - kernel_cache.o - kernel_core.o - kernel_debug.o - kernel_device_manager.o - kernel_disk_device_manager.o - kernel_fs.o - kernel_messaging.o - kernel_posix.o - kernel_slab.o - kernel_util.o - kernel_vm.o - - kernel_arch_$(TARGET_KERNEL_ARCH).o - kernel_platform_$(TARGET_BOOT_PLATFORM).o - - linkhack.so - - # kernel libroot parts - kernel_os_main.o - kernel_os_arch_$(TARGET_ARCH).o - kernel_lib_posix.o - kernel_lib_posix_arch_$(TARGET_ARCH).o - kernel_misc.o - - $(HAIKU_STATIC_LIBSUPC++) - - : $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld - : -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar - $(TARGET_KERNEL_PIC_LINKFLAGS) -; +if $(HAIKU_ARCH) = x86_64 { + # Cannot relink everything as a shared object on x86_64 as shared library + # code is required to be position-independent. Instead create a copy of the + # executable kernel image and change the ELF header type to DYN. A bit of + # a hack, but avoids having to recompile a PIC copy of the kernel code. + # kernel.so is only used when linking modules to provide symbol information, + # this is sufficient for that purpose. + KernelSo kernel.so : kernel_$(TARGET_ARCH) ; +} else { + KernelLd kernel.so : + kernel_cache.o + kernel_core.o + kernel_debug.o + kernel_device_manager.o + kernel_disk_device_manager.o + kernel_fs.o + kernel_messaging.o + kernel_posix.o + kernel_slab.o + kernel_util.o + kernel_vm.o + + kernel_arch_$(TARGET_KERNEL_ARCH).o + kernel_platform_$(TARGET_BOOT_PLATFORM).o + + linkhack.so + + # kernel libroot parts + kernel_os_main.o + kernel_os_arch_$(TARGET_ARCH).o + kernel_lib_posix.o + kernel_lib_posix_arch_$(TARGET_ARCH).o + kernel_misc.o + + $(HAIKU_STATIC_LIBSUPC++) + + : $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld + : -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar + $(TARGET_KERNEL_PIC_LINKFLAGS) + ; +} NotFile kernel ; Depends kernel : kernel_$(TARGET_ARCH) ;