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
This commit is contained in:
Jérôme Duval
2018-06-12 17:56:55 +02:00
parent a69cb33030
commit 44f24718b1
7 changed files with 79 additions and 6 deletions
+8 -3
View File
@@ -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)
{
+5
View File
@@ -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
}
+8
View File
@@ -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)
;
+22
View File
@@ -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
+29 -3
View File
@@ -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 ]
: <syscalls!$(TARGET_PACKAGING_ARCH)>syscall_numbers.h ;
Includes [ FGristFiles interrupts.S ]
: <syscalls!$(TARGET_PACKAGING_ARCH)>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 ]
: <syscalls!x86>syscall_numbers.h ;
Includes [ FGristFiles entry_compat.S syscalls_compat.cpp ]
: <syscalls!x86>syscall_table.h ;
}
+4
View File
@@ -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
+3
View File
@@ -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