diff --git a/headers/private/kernel/arch/x86/arch_cpu.h b/headers/private/kernel/arch/x86/arch_cpu.h index 170bb53ba6..685cf4a748 100644 --- a/headers/private/kernel/arch/x86/arch_cpu.h +++ b/headers/private/kernel/arch/x86/arch_cpu.h @@ -579,6 +579,9 @@ 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); @@ -589,14 +592,6 @@ 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/compat/OS_compat.h b/headers/private/kernel/compat/OS_compat.h index 7f4531ce91..0fbc7a952a 100644 --- a/headers/private/kernel/compat/OS_compat.h +++ b/headers/private/kernel/compat/OS_compat.h @@ -163,34 +163,6 @@ static_assert(sizeof(compat_thread_info) == 76, "size of compat_thread_info mismatch"); -inline status_t -copy_ref_var_to_user(thread_info &info, thread_info* userInfo) -{ - if (!IS_USER_ADDRESS(userInfo)) - return B_BAD_ADDRESS; - Thread* thread = thread_get_current_thread(); - bool compatMode = (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0; - if (compatMode) { - compat_thread_info compatInfo; - compatInfo.thread = info.thread; - compatInfo.team = info.team; - strlcpy(compatInfo.name, info.name, sizeof(compatInfo.name)); - compatInfo.state = info.state; - compatInfo.priority = info.priority; - compatInfo.sem = info.sem; - compatInfo.user_time = info.user_time; - compatInfo.kernel_time = info.kernel_time; - compatInfo.stack_base = (uint32)(addr_t)info.stack_base; - compatInfo.stack_end = (uint32)(addr_t)info.stack_end; - if (user_memcpy(userInfo, &compatInfo, sizeof(compatInfo)) < B_OK) - return B_BAD_ADDRESS; - } else if (user_memcpy(userInfo, &info, sizeof(info)) < B_OK) { - return B_BAD_ADDRESS; - } - return B_OK; -} - - inline status_t copy_ref_var_to_user(void* &addr, void** userAddr) { diff --git a/headers/private/kernel/compat/resource_compat.h b/headers/private/kernel/compat/resource_compat.h deleted file mode 100644 index 4a3c5db5e5..0000000000 --- a/headers/private/kernel/compat/resource_compat.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2018, Haiku Inc. All rights reserved. - * - * Distributed under the terms of the MIT License. - */ -#ifndef _KERNEL_COMPAT_RESOURCE_H -#define _KERNEL_COMPAT_RESOURCE_H - - -#include - - -typedef uint32 compat_rlim_t; -struct compat_rlimit { - compat_rlim_t rlim_cur; /* current soft limit */ - compat_rlim_t rlim_max; /* hard limit */ -}; - - -inline status_t -copy_ref_var_to_user(struct rlimit &rl, struct rlimit* urlp) -{ - if (!IS_USER_ADDRESS(urlp)) - return B_BAD_ADDRESS; - Thread* thread = thread_get_current_thread(); - bool compatMode = (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0; - if (compatMode) { - struct compat_rlimit compat_rl; - compat_rl.rlim_cur = rl.rlim_cur; - compat_rl.rlim_max = rl.rlim_max; - if (user_memcpy(urlp, &compat_rl, sizeof(compat_rl)) < B_OK) - return B_BAD_ADDRESS; - } else if (user_memcpy(urlp, &rl, sizeof(rl)) < B_OK) { - return B_BAD_ADDRESS; - } - return B_OK; -} - - -inline status_t -copy_ref_var_from_user(struct rlimit* urlp, struct rlimit &rl) -{ - if (!IS_USER_ADDRESS(urlp)) - return B_BAD_ADDRESS; - Thread* thread = thread_get_current_thread(); - bool compatMode = (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0; - if (compatMode) { - struct compat_rlimit compat_rl; - if (user_memcpy(&compat_rl, urlp, sizeof(compat_rl)) < B_OK) - return B_BAD_ADDRESS; - rl.rlim_cur = compat_rl.rlim_cur; - rl.rlim_max = compat_rl.rlim_max; - } else if (user_memcpy(&rl, urlp, sizeof(rl)) < B_OK) { - return B_BAD_ADDRESS; - } - return B_OK; -} - - -#endif // _KERNEL_COMPAT_RESOURCE_H diff --git a/headers/private/kernel/compat/thread_defs_compat.h b/headers/private/kernel/compat/thread_defs_compat.h deleted file mode 100644 index 340df5adfd..0000000000 --- a/headers/private/kernel/compat/thread_defs_compat.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2018, Haiku Inc. All rights reserved. - * - * Distributed under the terms of the MIT License. - */ -#ifndef _KERNEL_COMPAT_THREAD_DEFS_H -#define _KERNEL_COMPAT_THREAD_DEFS_H - - -#include - - -#define compat_ptr_t uint32 -struct compat_thread_creation_attributes { - compat_ptr_t entry; - compat_ptr_t name; - int32 priority; - compat_ptr_t args1; - compat_ptr_t args2; - compat_ptr_t stack_address; - uint32_t stack_size; - uint32_t guard_size; - compat_ptr_t pthread; - uint32 flags; -} _PACKED; - - -static_assert(sizeof(struct compat_thread_creation_attributes) == 40, - "size of compat_thread_creation_attributes mismatch"); - - -inline status_t -copy_ref_var_from_user(BKernel::ThreadCreationAttributes* userAttrs, - BKernel::ThreadCreationAttributes &attrs) -{ - if (!IS_USER_ADDRESS(userAttrs)) - return B_BAD_ADDRESS; - Thread* thread = thread_get_current_thread(); - bool compatMode = (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0; - if (compatMode) { - struct compat_thread_creation_attributes compatAttrs; - if (user_memcpy(&compatAttrs, userAttrs, sizeof(compatAttrs)) < B_OK) - return B_BAD_ADDRESS; - attrs.entry = (int32 (*)(void*, void*))(addr_t)compatAttrs.entry; - attrs.name = (const char*)(addr_t)compatAttrs.name; - attrs.priority = compatAttrs.priority; - attrs.args1 = (void*)(addr_t)compatAttrs.args1; - attrs.args2 = (void*)(addr_t)compatAttrs.args2; - attrs.stack_address = (void*)(addr_t)compatAttrs.stack_address; - attrs.stack_size = compatAttrs.stack_size; - attrs.guard_size = compatAttrs.guard_size; - attrs.pthread = (pthread_t)(addr_t)compatAttrs.pthread; - attrs.flags = compatAttrs.flags; - } else if (user_memcpy(&attrs, userAttrs, sizeof(attrs)) < B_OK) { - return B_BAD_ADDRESS; - } - return B_OK; -} - - -#endif // _KERNEL_COMPAT_THREAD_DEFS_H diff --git a/headers/private/kernel/elf_priv.h b/headers/private/kernel/elf_priv.h index c91a6833ce..50153b85f0 100644 --- a/headers/private/kernel/elf_priv.h +++ b/headers/private/kernel/elf_priv.h @@ -82,11 +82,6 @@ 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/headers/private/kernel/vm/VMAddressSpace.h b/headers/private/kernel/vm/VMAddressSpace.h index cf95accec9..28127ec8b4 100644 --- a/headers/private/kernel/vm/VMAddressSpace.h +++ b/headers/private/kernel/vm/VMAddressSpace.h @@ -35,10 +35,6 @@ public: addr_t Base() const { return fBase; } addr_t EndAddress() const { return fEndAddress; } size_t Size() const { return fEndAddress - fBase + 1; } - void SetSize(size_t size) { - fEndAddress = fBase + (size - 1); - fFreeSpace = size; } - size_t FreeSpace() const { return fFreeSpace; } bool IsBeingDeleted() const { return fDeleting; } diff --git a/headers/private/system/thread_defs.h b/headers/private/system/thread_defs.h index bc1cf530af..c2cc881206 100644 --- a/headers/private/system/thread_defs.h +++ b/headers/private/system/thread_defs.h @@ -37,10 +37,6 @@ enum { #define THREAD_CREATION_FLAG_DEFER_SIGNALS 0x01 // create the thread with signals deferred, i.e. with // user_thread::defer_signals set to 1 -#ifdef _COMPAT_MODE -# define THREAD_CREATION_FLAG_COMPAT_MODE 0x02 - // create the thread with a compatibility mode -#endif struct thread_creation_attributes { diff --git a/src/system/kernel/Jamfile b/src/system/kernel/Jamfile index 46295c6337..dec23ba14d 100644 --- a/src/system/kernel/Jamfile +++ b/src/system/kernel/Jamfile @@ -22,12 +22,6 @@ 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 @@ -78,8 +72,6 @@ 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 b998ce260b..d88b05bfed 100644 --- a/src/system/kernel/arch/x86/64/arch.S +++ b/src/system/kernel/arch/x86/64/arch.S @@ -119,25 +119,3 @@ 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/64/thread.cpp b/src/system/kernel/arch/x86/64/thread.cpp index 1382ff5060..7a6a35d724 100644 --- a/src/system/kernel/arch/x86/64/thread.cpp +++ b/src/system/kernel/arch/x86/64/thread.cpp @@ -18,6 +18,9 @@ #include #include #include +#ifdef _COMPAT_MODE +# include +#endif #include #include #include @@ -27,10 +30,6 @@ #include #include -#ifdef _COMPAT_MODE -# include -#endif - #include "paging/X86PagingStructures.h" #include "paging/X86VMTranslationMap.h" diff --git a/src/system/kernel/arch/x86/Jamfile b/src/system/kernel/arch/x86/Jamfile index 3a5c90561d..dd068ac875 100644 --- a/src/system/kernel/arch/x86/Jamfile +++ b/src/system/kernel/arch/x86/Jamfile @@ -1,5 +1,8 @@ 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 @@ -12,10 +15,6 @@ 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 ] ; @@ -29,7 +28,6 @@ if $(TARGET_ARCH) = x86_64 { signals.cpp signals_asm.S syscalls.cpp - syscalls_asm.S thread.cpp # paging @@ -40,17 +38,6 @@ 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 ] ; @@ -132,16 +119,3 @@ 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/arch/x86/arch_debug.cpp b/src/system/kernel/arch/x86/arch_debug.cpp index 8918c5ba2c..6bb1a4ed53 100644 --- a/src/system/kernel/arch/x86/arch_debug.cpp +++ b/src/system/kernel/arch/x86/arch_debug.cpp @@ -1,5 +1,4 @@ /* - * Copyright 2018, Jérôme Duval, jerome.duval@gmail.com. * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. @@ -36,20 +35,6 @@ struct stack_frame { addr_t return_address; }; - -#ifdef _COMPAT_MODE - - -typedef uint32 compat_addr_t; -struct compat_stack_frame { - compat_addr_t previous; - compat_addr_t return_address; -}; - - -#endif // _COMPAT_MODE - - #define NUM_PREVIOUS_LOCATIONS 32 @@ -115,28 +100,6 @@ get_next_frame_debugger(addr_t bp, addr_t* _next, addr_t* _ip) } -#ifdef _COMPAT_MODE - - -/*! Safe to be called only from inside the debugger. -*/ -static status_t -compat_get_next_frame_debugger(addr_t bp, addr_t* _next, addr_t* _ip) -{ - compat_stack_frame frame; - if (debug_memcpy(B_CURRENT_TEAM, &frame, (void*)bp, sizeof(frame)) != B_OK) - return B_BAD_ADDRESS; - - *_ip = (addr_t)frame.return_address; - *_next = (addr_t)frame.previous; - - return B_OK; -} - - -#endif // _COMPAT_MODE - - static status_t lookup_symbol(Thread* thread, addr_t address, addr_t* _baseAddress, const char** _symbolName, const char** _imageName, bool* _exactMatch) @@ -412,7 +375,7 @@ print_stack_frame(Thread* thread, addr_t ip, addr_t bp, addr_t nextBp, const char* image; addr_t baseAddress; bool exactMatch; - status_t status = B_ERROR; + status_t status; addr_t diff; diff = nextBp - bp; @@ -421,18 +384,8 @@ print_stack_frame(Thread* thread, addr_t ip, addr_t bp, addr_t nextBp, if (diff & ~((addr_t)-1 >> 1)) diff = 0; -#ifdef _COMPAT_MODE - // only lookup kernel symbols in compatibility mode - // TODO: support lookup user symbols in compatibility mode - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) == 0 - || IS_KERNEL_ADDRESS(ip)) { - status = lookup_symbol(thread, ip, &baseAddress, &symbol, &image, - &exactMatch); - } -#else status = lookup_symbol(thread, ip, &baseAddress, &symbol, &image, &exactMatch); -#endif kprintf("%2" B_PRId32 " %0*lx (+%4ld) %0*lx ", callIndex, B_PRINTF_POINTER_WIDTH, bp, diff, B_PRINTF_POINTER_WIDTH, ip); @@ -771,16 +724,6 @@ stack_trace(int argc, char** argv) } else { addr_t ip, nextBp; -#ifdef _COMPAT_MODE - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0 - && !is_kernel_stack_address(thread, bp)) { - if (compat_get_next_frame_debugger(bp, &nextBp, &ip) != B_OK) { - kprintf("%0*lx -- read fault\n", B_PRINTF_POINTER_WIDTH, - bp); - break; - } - } else -#endif if (get_next_frame_debugger(bp, &nextBp, &ip) != B_OK) { kprintf("%0*lx -- read fault\n", B_PRINTF_POINTER_WIDTH, bp); break; diff --git a/src/system/kernel/arch/x86/arch_thread.cpp b/src/system/kernel/arch/x86/arch_thread.cpp index 598c02460f..931c74b099 100644 --- a/src/system/kernel/arch/x86/arch_thread.cpp +++ b/src/system/kernel/arch/x86/arch_thread.cpp @@ -192,23 +192,6 @@ arch_team_init_team_struct(Team* p, bool kernel) status_t arch_thread_init_tls(Thread* thread) { -#ifdef _COMPAT_MODE - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) { - uint32 tls[TLS_FIRST_FREE_SLOT]; - - thread->user_local_storage = thread->user_stack_base - + thread->user_stack_size; - - // initialize default TLS fields - memset(tls, 0, sizeof(tls)); - tls[TLS_BASE_ADDRESS_SLOT] = thread->user_local_storage; - tls[TLS_THREAD_ID_SLOT] = thread->id; - tls[TLS_USER_THREAD_SLOT] = (uint32)(addr_t)thread->user_thread; - - return user_memcpy((void*)thread->user_local_storage, tls, sizeof(tls)); - } -#endif - addr_t tls[TLS_FIRST_FREE_SLOT]; thread->user_local_storage = thread->user_stack_base diff --git a/src/system/kernel/fs/Jamfile b/src/system/kernel/fs/Jamfile index 10f6fd7d7e..d2d0f84ab7 100644 --- a/src/system/kernel/fs/Jamfile +++ b/src/system/kernel/fs/Jamfile @@ -7,10 +7,6 @@ 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/team.cpp b/src/system/kernel/team.cpp index 7a44436a66..8fa4cb36e5 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -28,9 +28,6 @@ #include #include -#ifdef _COMPAT_MODE -# include -#endif #include #include #include @@ -88,7 +85,6 @@ struct team_arg { }; #define TEAM_ARGS_FLAG_NO_ASLR 0x01 -#define TEAM_ARGS_FLAG_COMPAT_FLATARGS 0x02 namespace { @@ -1349,8 +1345,7 @@ remove_team_from_group(Team* team) static status_t -create_team_user_data(Team* team, void* exactAddress = NULL, - void* baseAddress = NULL) +create_team_user_data(Team* team, void* exactAddress = NULL) { void* address; uint32 addressSpec; @@ -1359,8 +1354,7 @@ create_team_user_data(Team* team, void* exactAddress = NULL, address = exactAddress; addressSpec = B_EXACT_ADDRESS; } else { - address = baseAddress != NULL ? baseAddress - : (void*)KERNEL_USER_DATA_BASE; + address = (void*)KERNEL_USER_DATA_BASE; addressSpec = B_RANDOMIZED_BASE_ADDRESS; } @@ -1375,8 +1369,7 @@ create_team_user_data(Team* team, void* exactAddress = NULL, virtualRestrictions.address = address; virtualRestrictions.address_specification = B_EXACT_ADDRESS; } else { - virtualRestrictions.address = baseAddress != NULL ? baseAddress - : (void*)KERNEL_USER_DATA_BASE; + virtualRestrictions.address = (void*)KERNEL_USER_DATA_BASE; virtualRestrictions.address_specification = B_RANDOMIZED_BASE_ADDRESS; } @@ -1520,12 +1513,6 @@ create_team_arg(struct team_arg** _teamArg, const char* path, char** flatArgs, } } -#ifdef _COMPAT_MODE - Thread* thread = thread_get_current_thread(); - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) - teamArg->flags |= TEAM_ARGS_FLAG_COMPAT_FLATARGS; -#endif - *_teamArg = teamArg; return B_OK; } @@ -1576,119 +1563,17 @@ team_create_thread_start_internal(void* args) userEnv = userArgs + argCount + 1; path = teamArgs->path; - // set team args and update state - // TODO: this can't work with a compat flat_args - team->Lock(); - team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); - team->state = TEAM_STATE_NORMAL; - team->Unlock(); - -#ifdef _COMPAT_MODE - // in compat mode, userArgs and userEnv should only be uint32 - if ((teamArgs->flags & TEAM_ARGS_FLAG_COMPAT_FLATARGS) == 0 - && (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) { - // now make the arrays 32-bits wide - addr_t pointerOffset = 4; // sizeof(addr_t) - sizeof(uint32) - size_t pointerSize = sizeof(uint32); - uint32 *elfArgs = (uint32*)teamArgs->flat_args; - addr_t *tempArgs = (addr_t*)teamArgs->flat_args; - if (argCount > 0) { - for (int i = 0; i < argCount; i++) { - *elfArgs = (uint32)*tempArgs; - elfArgs++; - tempArgs++; - } - } - *elfArgs = NULL; - elfArgs++; - tempArgs++; - userEnv = (char**)elfArgs; - if (envCount > 0) { - for (int i = 0; i < envCount; i++) { - *elfArgs = (uint32)*tempArgs; - elfArgs++; - tempArgs++; - } - } - *elfArgs = NULL; - - // now move the flat strings - size_t stringsOffset = (argCount + envCount + 2) * sizeof(char*); - addr_t strings = (addr_t)teamArgs->flat_args + stringsOffset; - size_t strings32Offset = (argCount + envCount + 2) * sizeof(uint32); - addr_t strings32 = (addr_t)teamArgs->flat_args + strings32Offset; - memmove((void*)strings32, (void*)strings, - teamArgs->flat_args_size - stringsOffset); - - uint32 user32Args = (uint32)(addr_t)userArgs; - uint32 user32Env = user32Args + (argCount + 1) * sizeof(uint32); - if (user_strlcpy(programArgs->program_path, path, - sizeof(programArgs->program_path)) < B_OK - || user_memcpy(&programArgs->arg_count, &argCount, sizeof(int32)) - < B_OK - || user_memcpy(&programArgs->env_count, &envCount, sizeof(int32)) - < B_OK - || user_memcpy(&programArgs->args, &user32Args, sizeof(user32Args)) - < B_OK - || user_memcpy((void*)(((addr_t)&programArgs->args) + 4), - &user32Env, sizeof(user32Env)) < B_OK - || user_memcpy(&programArgs->error_port, &teamArgs->error_port, - sizeof(port_id)) < B_OK - || user_memcpy(&programArgs->error_token, &teamArgs->error_token, - sizeof(uint32)) < B_OK - || user_memcpy(&programArgs->umask, &teamArgs->umask, - sizeof(mode_t)) < B_OK - || user_memcpy(userArgs, teamArgs->flat_args, - teamArgs->flat_args_size - (stringsOffset - - strings32Offset)) < B_OK) { - // the team deletion process will clean this mess - free_team_arg(teamArgs); - return B_BAD_ADDRESS; - } - - } else if ((teamArgs->flags & TEAM_ARGS_FLAG_COMPAT_FLATARGS) != 0 - && (thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) { - uint32 user32Args = (uint32)(addr_t)userArgs; - uint32 user32Env = user32Args + (argCount + 1) * sizeof(uint32); - - if (user_strlcpy(programArgs->program_path, path, - sizeof(programArgs->program_path)) < B_OK - || user_memcpy(&programArgs->arg_count, &argCount, - sizeof(int32)) < B_OK - || user_memcpy(&programArgs->args, &user32Args, sizeof(uint32)) - < B_OK - || user_memcpy(&programArgs->env_count, &envCount, sizeof(int32)) - < B_OK - || user_memcpy(&programArgs->env, &user32Env, sizeof(uint32)) - < B_OK - || user_memcpy(&programArgs->error_port, &teamArgs->error_port, - sizeof(port_id)) < B_OK - || user_memcpy(&programArgs->error_token, &teamArgs->error_token, - sizeof(uint32)) < B_OK - || user_memcpy(&programArgs->umask, &teamArgs->umask, - sizeof(mode_t)) < B_OK - || user_memcpy(userArgs, teamArgs->flat_args, - teamArgs->flat_args_size) < B_OK) { - // the team deletion process will clean this mess - free_team_arg(teamArgs); - return B_BAD_ADDRESS; - } - } else -#endif if (user_strlcpy(programArgs->program_path, path, sizeof(programArgs->program_path)) < B_OK - || user_memcpy(&programArgs->arg_count, &argCount, sizeof(int32)) - < B_OK + || user_memcpy(&programArgs->arg_count, &argCount, sizeof(int32)) < B_OK || user_memcpy(&programArgs->args, &userArgs, sizeof(char**)) < B_OK - || user_memcpy(&programArgs->env_count, &envCount, sizeof(int32)) - < B_OK + || user_memcpy(&programArgs->env_count, &envCount, sizeof(int32)) < B_OK || user_memcpy(&programArgs->env, &userEnv, sizeof(char**)) < B_OK || user_memcpy(&programArgs->error_port, &teamArgs->error_port, sizeof(port_id)) < B_OK || user_memcpy(&programArgs->error_token, &teamArgs->error_token, sizeof(uint32)) < B_OK - || user_memcpy(&programArgs->umask, &teamArgs->umask, sizeof(mode_t)) - < B_OK + || user_memcpy(&programArgs->umask, &teamArgs->umask, sizeof(mode_t)) < B_OK || user_memcpy(userArgs, teamArgs->flat_args, teamArgs->flat_args_size) < B_OK) { // the team deletion process will clean this mess @@ -1698,25 +1583,19 @@ team_create_thread_start_internal(void* args) TRACE(("team_create_thread_start: loading elf binary '%s'\n", path)); - const char* threadName = strrchr(path, '/'); + // set team args and update state + team->Lock(); + team->SetArgs(path, teamArgs->flat_args + 1, argCount - 1); + team->state = TEAM_STATE_NORMAL; + team->Unlock(); free_team_arg(teamArgs); // the arguments are already on the user stack, we no longer need // them in this form // Clone commpage area - area_id commPageArea = -1; -#ifdef _COMPAT_MODE - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) { - team->commpage_address = (void*)KERNEL_USER32_DATA_BASE; - commPageArea = clone_commpage_compat_area(team->id, - &team->commpage_address); - } else -#endif - { - team->commpage_address = (void*)KERNEL_USER_DATA_BASE; - commPageArea = clone_commpage_area(team->id, &team->commpage_address); - } + area_id commPageArea = clone_commpage_area(team->id, + &team->commpage_address); if (commPageArea < B_OK) { TRACE(("team_create_thread_start: clone_commpage_area() failed: %s\n", strerror(commPageArea))); @@ -1757,21 +1636,11 @@ team_create_thread_start_internal(void* args) return err; } runtimeLoaderPath.UnlockBuffer(); -#ifdef _COMPAT_MODE - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) { - err = runtimeLoaderPath.Append("x86/runtime_loader"); - if (err == B_OK) { - err = elf32_load_user_image(runtimeLoaderPath.Path(), team, 0, - &entry); - } - } else -#endif - { - err = runtimeLoaderPath.Append("runtime_loader"); - if (err == B_OK) { - err = elf_load_user_image(runtimeLoaderPath.Path(), team, 0, - &entry); - } + err = runtimeLoaderPath.Append("runtime_loader"); + + if (err == B_OK) { + err = elf_load_user_image(runtimeLoaderPath.Path(), team, 0, + &entry); } } @@ -1815,8 +1684,6 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, io_context* parentIOContext = NULL; team_id teamID; bool teamLimitReached = false; - void* kernelUserDataBase = (void*)KERNEL_USER_DATA_BASE; - size_t addressSpaceSize = USER_SIZE; if (flatArgs == NULL || argCount == 0) return B_BAD_VALUE; @@ -1833,15 +1700,6 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, else threadName = path; -#ifdef _COMPAT_MODE - bool isCompatMode = false; - KPath tmpFilePath; - if (tmpFilePath.SetTo(path, KPath::NORMALIZE) == B_OK) { - isCompatMode = (elf32_load_user_image(tmpFilePath.Path(), NULL, - ELF_LOAD_USER_IMAGE_TEST_EXECUTABLE, NULL) == B_OK); - } -#endif - // create the main thread object Thread* mainThread; status = Thread::Create(threadName, mainThread); @@ -1849,14 +1707,6 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, return status; BReference mainThreadReference(mainThread, true); -#ifdef _COMPAT_MODE - if (isCompatMode) { - atomic_or(&mainThread->flags, THREAD_FLAGS_COMPAT_MODE); - kernelUserDataBase = (void*)KERNEL_USER32_DATA_BASE; - addressSpaceSize = USER32_SIZE; - } -#endif - // create team object Team* team = Team::Create(mainThread->id, path, false); if (team == NULL) @@ -1915,9 +1765,7 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, vfs_exec_io_context(team->io_context); // create an address space for this team - // TODO: check the thread compat mode in an arch specific function - status = VMAddressSpace::Create(team->id, USER_BASE, - addressSpaceSize, false, + status = VMAddressSpace::Create(team->id, USER_BASE, USER_SIZE, false, &team->address_space); if (status != B_OK) goto err2; @@ -1926,7 +1774,7 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, (teamArgs->flags & TEAM_ARGS_FLAG_NO_ASLR) == 0); // create the user data area - status = create_team_user_data(team, NULL, kernelUserDataBase); + status = create_team_user_data(team); if (status != B_OK) goto err4; @@ -2054,7 +1902,6 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, struct team_arg* teamArgs; const char* threadName; thread_id nubThreadID = -1; - void* kernelUserDataBase = (void*)KERNEL_USER_DATA_BASE; TRACE(("exec_team(path = \"%s\", argc = %" B_PRId32 ", envCount = %" B_PRId32 "): team %" B_PRId32 "\n", path, argCount, envCount, @@ -2124,26 +1971,7 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, team->address_space->SetRandomizingEnabled( (teamArgs->flags & TEAM_ARGS_FLAG_NO_ASLR) == 0); - // cut the path from the team name and rename the main thread, too - threadName = strrchr(path, '/'); - if (threadName != NULL) - threadName++; - else - threadName = path; -#ifdef _COMPAT_MODE - bool isCompatMode = false; - KPath tmpFilePath; - if (tmpFilePath.SetTo(path, KPath::NORMALIZE) == B_OK) { - isCompatMode = (elf32_load_user_image(tmpFilePath.Path(), NULL, - ELF_LOAD_USER_IMAGE_TEST_EXECUTABLE, NULL) == B_OK); - } - - // user address space shouldn't have user areas left - team->address_space->SetSize(isCompatMode ? USER32_SIZE : USER_SIZE); - if (isCompatMode) - kernelUserDataBase = (void*)KERNEL_USER32_DATA_BASE; -#endif - status = create_team_user_data(team, NULL, kernelUserDataBase); + status = create_team_user_data(team); if (status != B_OK) { // creating the user data failed -- we're toast free_team_arg(teamArgs); @@ -2159,6 +1987,12 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, team->SetName(path); team->Unlock(); + // cut the path from the team name and rename the main thread, too + threadName = strrchr(path, '/'); + if (threadName != NULL) + threadName++; + else + threadName = path; rename_thread(thread_get_current_thread_id(), threadName); atomic_or(&team->flags, TEAM_FLAG_EXEC_DONE); @@ -2177,13 +2011,8 @@ exec_team(const char* path, char**& _flatArgs, size_t flatArgsSize, // cannot fail (the allocation for the team would have failed already) ThreadLocker currentThreadLocker(currentThread); currentThread->user_thread = userThread; -#ifdef _COMPAT_MODE - if (isCompatMode) - atomic_or(¤tThread->flags, THREAD_FLAGS_COMPAT_MODE); - else - atomic_and(¤tThread->flags, ~THREAD_FLAGS_COMPAT_MODE); -#endif currentThreadLocker.Unlock(); + // create the user stack for the thread status = thread_create_user_stack(currentThread->team, currentThread, NULL, 0, sizeof(user_space_program_args) + teamArgs->flat_args_size); diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index cece263bf3..b10f32a4e5 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -51,12 +50,6 @@ #include #include -#ifdef _COMPAT_MODE -# include -# include -# include -#endif - #include "TeamThreadTables.h" @@ -559,14 +552,11 @@ status_t ThreadCreationAttributes::InitFromUserAttributes( const thread_creation_attributes* userAttributes, char* nameBuffer) { - if (userAttributes == NULL) + if (userAttributes == NULL || !IS_USER_ADDRESS(userAttributes) + || user_memcpy((thread_creation_attributes*)this, userAttributes, + sizeof(thread_creation_attributes)) != B_OK) { return B_BAD_ADDRESS; - - status_t status = copy_ref_var_from_user( - (BKernel::ThreadCreationAttributes*)userAttributes, - *this); - if (status != B_OK) - return status; + } if (stack_size != 0 && (stack_size < MIN_USER_STACK_SIZE @@ -825,10 +815,6 @@ create_thread_user_stack(Team* team, Thread* thread, void* _stackBase, thread->name, thread->id); stackBase = (uint8*)USER_STACK_REGION; -#ifdef _COMPAT_MODE - if ((thread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) - stackBase = (uint8*)USER32_STACK_REGION; -#endif virtual_address_restrictions virtualRestrictions = {}; virtualRestrictions.address_specification = B_RANDOMIZED_BASE_ADDRESS; @@ -914,12 +900,6 @@ thread_create_thread(const ThreadCreationAttributes& attributes, bool kernel) (int32)THREAD_MAX_SET_PRIORITY); thread->state = B_THREAD_SUSPENDED; -#ifdef _COMPAT_MODE - Thread* currentThread = thread_get_current_thread(); - if ((currentThread->flags & THREAD_FLAGS_COMPAT_MODE) != 0) - thread->flags |= THREAD_FLAGS_COMPAT_MODE; -#endif - thread->sig_block_mask = attributes.signal_mask; // init debug structure @@ -3530,8 +3510,10 @@ _user_get_thread_info(thread_id id, thread_info *userInfo) status = _get_thread_info(id, &info, sizeof(thread_info)); - if (status >= B_OK) - status = copy_ref_var_to_user(info, userInfo); + if (status >= B_OK + && user_memcpy(userInfo, &info, sizeof(thread_info)) < B_OK) + return B_BAD_ADDRESS; + return status; } @@ -3552,9 +3534,11 @@ _user_get_next_thread_info(team_id team, int32 *userCookie, if (status < B_OK) return status; - if (user_memcpy(userCookie, &cookie, sizeof(int32)) < B_OK) + if (user_memcpy(userCookie, &cookie, sizeof(int32)) < B_OK + || user_memcpy(userInfo, &info, sizeof(thread_info)) < B_OK) return B_BAD_ADDRESS; - return copy_ref_var_to_user(info, userInfo); + + return status; } @@ -3736,9 +3720,9 @@ _user_getrlimit(int resource, struct rlimit *urlp) ret = common_getrlimit(resource, &rl); if (ret == 0) { - status_t status = copy_ref_var_to_user(rl, urlp); - if (status != B_OK) - return status; + ret = user_memcpy(urlp, &rl, sizeof(struct rlimit)); + if (ret < 0) + return ret; return 0; } @@ -3755,10 +3739,10 @@ _user_setrlimit(int resource, const struct rlimit *userResourceLimit) if (userResourceLimit == NULL) return EINVAL; - status_t status = copy_ref_var_from_user((struct rlimit*)userResourceLimit, - resourceLimit); - if (status != B_OK) - return status; + if (!IS_USER_ADDRESS(userResourceLimit) + || user_memcpy(&resourceLimit, userResourceLimit, + sizeof(struct rlimit)) < B_OK) + return B_BAD_ADDRESS; return common_setrlimit(resource, &resourceLimit); } diff --git a/src/system/kernel/vm/Jamfile b/src/system/kernel/vm/Jamfile index 32b7ca24b9..a646e719c4 100644 --- a/src/system/kernel/vm/Jamfile +++ b/src/system/kernel/vm/Jamfile @@ -5,9 +5,6 @@ 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