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.
This commit is contained in:
+12
-8
@@ -356,6 +356,7 @@ if $(HAIKU_GCC_VERSION[1]) >= 4 {
|
|||||||
|
|
||||||
HAIKU_KERNEL_PIC_CCFLAGS = -fno-pic ;
|
HAIKU_KERNEL_PIC_CCFLAGS = -fno-pic ;
|
||||||
HAIKU_KERNEL_PIC_LINKFLAGS = ;
|
HAIKU_KERNEL_PIC_LINKFLAGS = ;
|
||||||
|
HAIKU_KERNEL_ADDON_LINKFLAGS = ;
|
||||||
|
|
||||||
switch $(HAIKU_ARCH) {
|
switch $(HAIKU_ARCH) {
|
||||||
case ppc :
|
case ppc :
|
||||||
@@ -389,13 +390,16 @@ switch $(HAIKU_ARCH) {
|
|||||||
case x86_64 :
|
case x86_64 :
|
||||||
{
|
{
|
||||||
# Kernel lives in the top 2GB of the address space, use kernel code
|
# 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
|
# model.
|
||||||
# code due to interrupts.
|
HAIKU_KERNEL_PIC_CCFLAGS += -mcmodel=kernel ;
|
||||||
HAIKU_KERNEL_CCFLAGS += -mcmodel=kernel -mno-red-zone
|
|
||||||
-fno-omit-frame-pointer ;
|
# Disable the red zone, which cannot be used in kernel code due to
|
||||||
HAIKU_KERNEL_C++FLAGS += -mcmodel=kernel -mno-red-zone
|
# interrupts, and always enable the frame pointer so stack traces are
|
||||||
-fno-omit-frame-pointer ;
|
# 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_PIC_LINKFLAGS += -z max-page-size=0x1000 ;
|
||||||
|
HAIKU_KERNEL_ADDON_LINKFLAGS += -z max-page-size=0x1000 ;
|
||||||
|
|
||||||
# Bootloader is 32-bit.
|
# Bootloader is 32-bit.
|
||||||
HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ;
|
HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ;
|
||||||
@@ -984,7 +988,7 @@ if $(TARGET_PLATFORM) != haiku {
|
|||||||
local buildVars =
|
local buildVars =
|
||||||
ARCH CPU GCC_VERSION KERNEL_ARCH
|
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
|
INCLUDES_SEPARATOR LOCAL_INCLUDES_OPTION SYSTEM_INCLUDES_OPTION
|
||||||
|
|
||||||
@@ -993,7 +997,7 @@ local buildVars =
|
|||||||
KERNEL_DEFINES
|
KERNEL_DEFINES
|
||||||
|
|
||||||
KERNEL_CCFLAGS KERNEL_C++FLAGS
|
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
|
BOOT_CCFLAGS BOOT_C++FLAGS BOOT_LINKFLAGS
|
||||||
WARNING_CCFLAGS WARNING_C++FLAGS
|
WARNING_CCFLAGS WARNING_C++FLAGS
|
||||||
|
|
||||||
|
|||||||
@@ -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 ;
|
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
|
# modules
|
||||||
AddFilesToFloppyBootArchive system add-ons kernel bus_managers
|
AddFilesToFloppyBootArchive system add-ons kernel bus_managers
|
||||||
: $(SYSTEM_ADD_ONS_BUS_MANAGERS) ;
|
: $(SYSTEM_ADD_ONS_BUS_MANAGERS) ;
|
||||||
@@ -121,7 +124,11 @@ if $(NET_BOOT) = 1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# boot module links
|
# boot module links
|
||||||
if $(TARGET_ARCH) != x86_64 {
|
if $(TARGET_ARCH) = x86_64 {
|
||||||
|
AddBootModuleSymlinksToFloppyBootArchive
|
||||||
|
dpc
|
||||||
|
;
|
||||||
|
} else {
|
||||||
AddBootModuleSymlinksToFloppyBootArchive
|
AddBootModuleSymlinksToFloppyBootArchive
|
||||||
$(SYSTEM_ADD_ONS_BUS_MANAGERS)
|
$(SYSTEM_ADD_ONS_BUS_MANAGERS)
|
||||||
$(PPC_ONLY)openpic
|
$(PPC_ONLY)openpic
|
||||||
|
|||||||
+19
-1
@@ -77,6 +77,24 @@ actions KernelLd bind VERSION_SCRIPT
|
|||||||
--version-script=$(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
|
rule KernelAddon
|
||||||
{
|
{
|
||||||
# KernelAddon <name> : <sources> : <static-libraries> : <res> ;
|
# KernelAddon <name> : <sources> : <static-libraries> : <res> ;
|
||||||
@@ -117,7 +135,7 @@ rule KernelAddon
|
|||||||
# compile and link
|
# compile and link
|
||||||
SetupKernel $(sources) : $(TARGET_KERNEL_PIC_FLAGS) : false ;
|
SetupKernel $(sources) : $(TARGET_KERNEL_PIC_FLAGS) : false ;
|
||||||
local linkFlags = -nostdlib -Xlinker --no-undefined
|
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) ;
|
LINKFLAGS on $(target) = [ on $(target) return $(LINKFLAGS) ] $(linkFlags) ;
|
||||||
Main $(target) : $(sources) ;
|
Main $(target) : $(sources) ;
|
||||||
LinkAgainst $(target) : $(libs) $(kernel) ;
|
LinkAgainst $(target) : $(libs) $(kernel) ;
|
||||||
|
|||||||
@@ -344,6 +344,7 @@ set_default_value HAIKU_CC gcc
|
|||||||
set_default_value HAIKU_LD ld
|
set_default_value HAIKU_LD ld
|
||||||
set_default_value HAIKU_OBJCOPY objcopy
|
set_default_value HAIKU_OBJCOPY objcopy
|
||||||
set_default_value HAIKU_RANLIB ranlib
|
set_default_value HAIKU_RANLIB ranlib
|
||||||
|
set_default_value HAIKU_ELFEDIT elfedit
|
||||||
set_default_value HAIKU_YASM yasm
|
set_default_value HAIKU_YASM yasm
|
||||||
set_default_value HAIKU_CPPFLAGS ""
|
set_default_value HAIKU_CPPFLAGS ""
|
||||||
set_default_value HAIKU_CCFLAGS ""
|
set_default_value HAIKU_CCFLAGS ""
|
||||||
@@ -510,6 +511,7 @@ if [ -n "$crossToolsPrefix" ]; then
|
|||||||
get_build_tool_path LD ld
|
get_build_tool_path LD ld
|
||||||
get_build_tool_path OBJCOPY objcopy
|
get_build_tool_path OBJCOPY objcopy
|
||||||
get_build_tool_path RANLIB ranlib
|
get_build_tool_path RANLIB ranlib
|
||||||
|
get_build_tool_path ELFEDIT elfedit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# prepare gcc settings
|
# prepare gcc settings
|
||||||
@@ -570,6 +572,7 @@ HAIKU_CC ?= ${HAIKU_CC} ;
|
|||||||
HAIKU_LD ?= ${HAIKU_LD} ;
|
HAIKU_LD ?= ${HAIKU_LD} ;
|
||||||
HAIKU_OBJCOPY ?= ${HAIKU_OBJCOPY} ;
|
HAIKU_OBJCOPY ?= ${HAIKU_OBJCOPY} ;
|
||||||
HAIKU_RANLIB ?= ${HAIKU_RANLIB} ;
|
HAIKU_RANLIB ?= ${HAIKU_RANLIB} ;
|
||||||
|
HAIKU_ELFEDIT ?= ${HAIKU_ELFEDIT} ;
|
||||||
HAIKU_YASM ?= ${HAIKU_YASM} ;
|
HAIKU_YASM ?= ${HAIKU_YASM} ;
|
||||||
HAIKU_CPPFLAGS ?= ${HAIKU_CPPFLAGS} ;
|
HAIKU_CPPFLAGS ?= ${HAIKU_CPPFLAGS} ;
|
||||||
HAIKU_CCFLAGS ?= ${HAIKU_CCFLAGS} ;
|
HAIKU_CCFLAGS ?= ${HAIKU_CCFLAGS} ;
|
||||||
|
|||||||
+36
-26
@@ -134,37 +134,47 @@ KernelLd kernel_$(TARGET_ARCH) :
|
|||||||
:
|
:
|
||||||
;
|
;
|
||||||
|
|
||||||
KernelLd kernel.so :
|
if $(HAIKU_ARCH) = x86_64 {
|
||||||
kernel_cache.o
|
# Cannot relink everything as a shared object on x86_64 as shared library
|
||||||
kernel_core.o
|
# code is required to be position-independent. Instead create a copy of the
|
||||||
kernel_debug.o
|
# executable kernel image and change the ELF header type to DYN. A bit of
|
||||||
kernel_device_manager.o
|
# a hack, but avoids having to recompile a PIC copy of the kernel code.
|
||||||
kernel_disk_device_manager.o
|
# kernel.so is only used when linking modules to provide symbol information,
|
||||||
kernel_fs.o
|
# this is sufficient for that purpose.
|
||||||
kernel_messaging.o
|
KernelSo kernel.so : kernel_$(TARGET_ARCH) ;
|
||||||
kernel_posix.o
|
} else {
|
||||||
kernel_slab.o
|
KernelLd kernel.so :
|
||||||
kernel_util.o
|
kernel_cache.o
|
||||||
kernel_vm.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_arch_$(TARGET_KERNEL_ARCH).o
|
||||||
kernel_platform_$(TARGET_BOOT_PLATFORM).o
|
kernel_platform_$(TARGET_BOOT_PLATFORM).o
|
||||||
|
|
||||||
linkhack.so
|
linkhack.so
|
||||||
|
|
||||||
# kernel libroot parts
|
# kernel libroot parts
|
||||||
kernel_os_main.o
|
kernel_os_main.o
|
||||||
kernel_os_arch_$(TARGET_ARCH).o
|
kernel_os_arch_$(TARGET_ARCH).o
|
||||||
kernel_lib_posix.o
|
kernel_lib_posix.o
|
||||||
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
||||||
kernel_misc.o
|
kernel_misc.o
|
||||||
|
|
||||||
$(HAIKU_STATIC_LIBSUPC++)
|
$(HAIKU_STATIC_LIBSUPC++)
|
||||||
|
|
||||||
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
||||||
: -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
|
: -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
|
||||||
$(TARGET_KERNEL_PIC_LINKFLAGS)
|
$(TARGET_KERNEL_PIC_LINKFLAGS)
|
||||||
;
|
;
|
||||||
|
}
|
||||||
|
|
||||||
NotFile kernel ;
|
NotFile kernel ;
|
||||||
Depends kernel : kernel_$(TARGET_ARCH) ;
|
Depends kernel : kernel_$(TARGET_ARCH) ;
|
||||||
|
|||||||
Reference in New Issue
Block a user