From 44f24718b1505e8d9c75e00e59f2f471a79b5f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 20 May 2018 15:54:28 +0200 Subject: [PATCH] kernel/x86_64: add compatibility source files to the build. * add x86 versions of fnsave frstor. * add missing declaration for elf32_resolve_symbol(). How-to build a x86_64/x86 bootstrap build: mkdir generated_bootstrap; cd generated_bootstrap ../configure --bootstrap /dir/to/haikuporter/haikuporter /dir/to/haikuports.cross \ /dir/to/haikuports --build-cross-tools x86_64 /dir/to/buildtools --build-cross-tools x86 -j8 --use-gcc-pipe jam -q -sHAIKU_PORTER_EXTRA_OPTIONS="-j8 --sourceforge-mirror=freefr --no-source-packages" @bootstrap-raw Change-Id: I6eae3653c42a53683ae307107fae595c4b8ebcfb --- headers/private/kernel/arch/x86/arch_cpu.h | 11 ++++++-- headers/private/kernel/elf_priv.h | 5 ++++ src/system/kernel/Jamfile | 8 ++++++ src/system/kernel/arch/x86/64/arch.S | 22 +++++++++++++++ src/system/kernel/arch/x86/Jamfile | 32 ++++++++++++++++++++-- src/system/kernel/fs/Jamfile | 4 +++ src/system/kernel/vm/Jamfile | 3 ++ 7 files changed, 79 insertions(+), 6 deletions(-) diff --git a/headers/private/kernel/arch/x86/arch_cpu.h b/headers/private/kernel/arch/x86/arch_cpu.h index 685cf4a748..170bb53ba6 100644 --- a/headers/private/kernel/arch/x86/arch_cpu.h +++ b/headers/private/kernel/arch/x86/arch_cpu.h @@ -579,9 +579,6 @@ void x86_write_msr(uint32 registerNumber, uint64 value); void x86_context_switch(struct arch_thread* oldState, struct arch_thread* newState); -void x86_fnsave(void* fpuState); -void x86_frstor(const void* fpuState); - void x86_fxsave(void* fpuState); void x86_fxrstor(const void* fpuState); @@ -592,6 +589,14 @@ void x86_fxsave_swap(void* oldFpuState, const void* newFpuState); #endif +#if !defined(__x86_64__) || defined(_COMPAT_MODE) + +void x86_fnsave(void* fpuState); +void x86_frstor(const void* fpuState); + +#endif // !defined(__x86_64__) || defined(_COMPAT_MODE) + + static inline void arch_cpu_idle(void) { diff --git a/headers/private/kernel/elf_priv.h b/headers/private/kernel/elf_priv.h index 50153b85f0..c91a6833ce 100644 --- a/headers/private/kernel/elf_priv.h +++ b/headers/private/kernel/elf_priv.h @@ -82,6 +82,11 @@ extern "C" { extern status_t elf_resolve_symbol(struct elf_image_info* image, elf_sym* symbol, struct elf_image_info* sharedImage, elf_addr* _symbolAddress); +#ifdef _COMPAT_MODE +extern status_t elf32_resolve_symbol(struct elf_image_info* image, + elf_sym* symbol, struct elf_image_info* sharedImage, + elf_addr* _symbolAddress); +#endif #ifdef __cplusplus } diff --git a/src/system/kernel/Jamfile b/src/system/kernel/Jamfile index dec23ba14d..46295c6337 100644 --- a/src/system/kernel/Jamfile +++ b/src/system/kernel/Jamfile @@ -22,6 +22,12 @@ AddResources kernel_$(TARGET_ARCH) : kernel.rdef ; SetVersionScript kernel_$(TARGET_ARCH) : kernel_versions ; SetVersionScript kernel.so : kernel_versions ; +local compatSources = ; +if $(HAIKU_KERNEL_COMPAT_MODE) = 1 { + UsePrivateHeaders [ FDirName kernel compat ] ; + compatSources = commpage_compat.cpp elf_compat.cpp ; +} + KernelMergeObject kernel_core.o : boot_item.cpp boot_splash.cpp @@ -72,6 +78,8 @@ KernelMergeObject kernel_core.o : scheduler_tracing.cpp scheduling_analysis.cpp + # compatibility + $(compatSources) : $(TARGET_KERNEL_PIC_CCFLAGS) ; diff --git a/src/system/kernel/arch/x86/64/arch.S b/src/system/kernel/arch/x86/64/arch.S index d88b05bfed..b998ce260b 100644 --- a/src/system/kernel/arch/x86/64/arch.S +++ b/src/system/kernel/arch/x86/64/arch.S @@ -119,3 +119,25 @@ FUNCTION_END(_stac) FUNCTION(_clac): clac FUNCTION_END(_clac) + + +#ifdef _COMPAT_MODE + + +/* void x86_fnsave(void *fpu_state); */ +FUNCTION(x86_fnsave): + movq %rdi, %rax + fnsave (%rax) + ret +FUNCTION_END(x86_fnsave) + +/* void x86_frstor(const void *fpu_state); */ +FUNCTION(x86_frstor): + movq %rdi, %rax + frstor (%rax) + ret +FUNCTION_END(x86_frstor) + + +#endif // _COMPAT_MODE + diff --git a/src/system/kernel/arch/x86/Jamfile b/src/system/kernel/arch/x86/Jamfile index dd068ac875..3a5c90561d 100644 --- a/src/system/kernel/arch/x86/Jamfile +++ b/src/system/kernel/arch/x86/Jamfile @@ -1,8 +1,5 @@ SubDir HAIKU_TOP src system kernel arch x86 ; -SubDirHdrs [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) - system kernel ] ; - # for syscall_numbers.h SubDirHdrs $(HAIKU_TOP) src add-ons kernel bus_managers ps2 ; SubDirHdrs $(HAIKU_TOP) src add-ons kernel bus_managers acpi acpica include ; SubDirHdrs $(HAIKU_TOP) src add-ons kernel bus_managers acpi acpica include @@ -15,6 +12,10 @@ UsePrivateHeaders shared ; SEARCH_SOURCE += [ FDirName $(SUBDIR) paging ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) timers ] ; +ObjectHdrs interrupts.S signals.cpp signals_asm.S : [ FDirName + $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) system kernel ] ; + # for syscall_numbers.h + local archSpecificSources ; if $(TARGET_ARCH) = x86_64 { SEARCH_SOURCE += [ FDirName $(SUBDIR) 64 ] ; @@ -28,6 +29,7 @@ if $(TARGET_ARCH) = x86_64 { signals.cpp signals_asm.S syscalls.cpp + syscalls_asm.S thread.cpp # paging @@ -38,6 +40,17 @@ if $(TARGET_ARCH) = x86_64 { X86PagingStructures64Bit.cpp X86VMTranslationMap64Bit.cpp ; + + if $(HAIKU_KERNEL_COMPAT_MODE) = 1 { + archSpecificSources += + arch_commpage_compat.cpp + arch_elf_compat.cpp + entry_compat.S + syscalls_compat.cpp + signals_compat_asm.S + signals_compat.cpp + ; + } } else { SEARCH_SOURCE += [ FDirName $(SUBDIR) 32 ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) paging 32bit ] ; @@ -119,3 +132,16 @@ Includes [ FGristFiles interrupts.S arch.S signals.cpp signals_asm.S ] : syscall_numbers.h ; Includes [ FGristFiles interrupts.S ] : syscall_table.h ; + +if $(TARGET_ARCH) = x86_64 && $(HAIKU_KERNEL_COMPAT_MODE) = 1 { + ObjectHdrs entry_compat.S syscalls_compat.cpp : [ FDirName + $(TARGET_COMMON_DEBUG_OBJECT_DIR_x86) system kernel ] ; + # for syscall_numbers.h + + # We need to specify the dependency on the generated syscalls file explicitly. + Includes [ FGristFiles entry_compat.S ] + : syscall_numbers.h ; + Includes [ FGristFiles entry_compat.S syscalls_compat.cpp ] + : syscall_table.h ; +} + diff --git a/src/system/kernel/fs/Jamfile b/src/system/kernel/fs/Jamfile index d2d0f84ab7..10f6fd7d7e 100644 --- a/src/system/kernel/fs/Jamfile +++ b/src/system/kernel/fs/Jamfile @@ -7,6 +7,10 @@ UsePrivateHeaders net shared storage ; UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) device_manager ] ; +if $(HAIKU_KERNEL_COMPAT_MODE) = 1 { + UsePrivateHeaders [ FDirName kernel compat ] ; +} + KernelMergeObject kernel_fs.o : EntryCache.cpp fd.cpp diff --git a/src/system/kernel/vm/Jamfile b/src/system/kernel/vm/Jamfile index a646e719c4..32b7ca24b9 100644 --- a/src/system/kernel/vm/Jamfile +++ b/src/system/kernel/vm/Jamfile @@ -5,6 +5,9 @@ UsePrivateHeaders shared ; UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) device_manager ] ; UsePrivateHeaders [ FDirName kernel disk_device_manager ] ; UsePrivateHeaders [ FDirName kernel util ] ; +if $(HAIKU_KERNEL_COMPAT_MODE) = 1 { + UsePrivateHeaders [ FDirName kernel compat ] ; +} KernelMergeObject kernel_vm.o : PageCacheLocker.cpp