Better names for syscall/signal functions copied to the commpage.
This commit is contained in:
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
|
|
||||||
// user syscall assembly stubs
|
// user syscall assembly stubs
|
||||||
extern "C" void _user_syscall_int(void);
|
extern "C" void x86_user_syscall_int(void);
|
||||||
extern unsigned int _user_syscall_int_end;
|
extern unsigned int x86_user_syscall_int_end;
|
||||||
extern "C" void _user_syscall_sysenter(void);
|
extern "C" void x86_user_syscall_sysenter(void);
|
||||||
extern unsigned int _user_syscall_sysenter_end;
|
extern unsigned int x86_user_syscall_sysenter_end;
|
||||||
|
|
||||||
// sysenter handler
|
// sysenter handler
|
||||||
extern "C" void x86_sysenter();
|
extern "C" void x86_sysenter();
|
||||||
@@ -78,8 +78,8 @@ init_amd_syscall_registers(void* dummy, int cpuNum)
|
|||||||
void
|
void
|
||||||
x86_initialize_syscall(void)
|
x86_initialize_syscall(void)
|
||||||
{
|
{
|
||||||
void* syscallCode = (void *)&_user_syscall_int;
|
void* syscallCode = (void *)&x86_user_syscall_int;
|
||||||
void* syscallCodeEnd = &_user_syscall_int_end;
|
void* syscallCodeEnd = &x86_user_syscall_int_end;
|
||||||
|
|
||||||
// check syscall
|
// check syscall
|
||||||
if (all_cpus_have_feature(FEATURE_COMMON, IA32_FEATURE_SEP)
|
if (all_cpus_have_feature(FEATURE_COMMON, IA32_FEATURE_SEP)
|
||||||
@@ -89,8 +89,8 @@ x86_initialize_syscall(void)
|
|||||||
dprintf("initialize_commpage_syscall(): sysenter/sysexit supported\n");
|
dprintf("initialize_commpage_syscall(): sysenter/sysexit supported\n");
|
||||||
|
|
||||||
// the code to be used in userland
|
// the code to be used in userland
|
||||||
syscallCode = (void *)&_user_syscall_sysenter;
|
syscallCode = (void *)&x86_user_syscall_sysenter;
|
||||||
syscallCodeEnd = &_user_syscall_sysenter_end;
|
syscallCodeEnd = &x86_user_syscall_sysenter_end;
|
||||||
|
|
||||||
// tell all CPUs to init their sysenter/sysexit related registers
|
// tell all CPUs to init their sysenter/sysexit related registers
|
||||||
call_all_cpus_sync(&init_intel_syscall_registers, NULL);
|
call_all_cpus_sync(&init_intel_syscall_registers, NULL);
|
||||||
|
|||||||
@@ -11,21 +11,21 @@
|
|||||||
/* user space half of the syscall mechanism, to be copied into the commpage */
|
/* user space half of the syscall mechanism, to be copied into the commpage */
|
||||||
|
|
||||||
// int 99 fallback
|
// int 99 fallback
|
||||||
FUNCTION(_user_syscall_int):
|
FUNCTION(x86_user_syscall_int):
|
||||||
int $99
|
int $99
|
||||||
ret
|
ret
|
||||||
FUNCTION_END(_user_syscall_int)
|
FUNCTION_END(x86_user_syscall_int)
|
||||||
SYMBOL(_user_syscall_int_end):
|
SYMBOL(x86_user_syscall_int_end):
|
||||||
|
|
||||||
|
|
||||||
// Intel sysenter/sysexit
|
// Intel sysenter/sysexit
|
||||||
FUNCTION(_user_syscall_sysenter):
|
FUNCTION(x86_user_syscall_sysenter):
|
||||||
// sysexit forces us to trash edx (-> eip) and ecx (-> esp), but they are
|
// sysexit forces us to trash edx (-> eip) and ecx (-> esp), but they are
|
||||||
// scratch registers anyway. We use ecx right away to store esp.
|
// scratch registers anyway. We use ecx right away to store esp.
|
||||||
movl %esp, %ecx
|
movl %esp, %ecx
|
||||||
sysenter
|
sysenter
|
||||||
ret
|
ret
|
||||||
FUNCTION_END(_user_syscall_sysenter)
|
FUNCTION_END(x86_user_syscall_sysenter)
|
||||||
SYMBOL(_user_syscall_sysenter_end):
|
SYMBOL(x86_user_syscall_sysenter_end):
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,15 @@
|
|||||||
#include <smp.h>
|
#include <smp.h>
|
||||||
|
|
||||||
|
|
||||||
extern "C" void _user_signal_handler(void);
|
extern "C" void x86_64_user_signal_handler(void);
|
||||||
extern int _user_signal_handler_end;
|
extern int x86_64_user_signal_handler_end;
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
x86_initialize_commpage_signal_handler()
|
x86_initialize_commpage_signal_handler()
|
||||||
{
|
{
|
||||||
void* handlerCode = (void*)&_user_signal_handler;
|
void* handlerCode = (void*)&x86_64_user_signal_handler;
|
||||||
void* handlerCodeEnd = &_user_signal_handler_end;
|
void* handlerCodeEnd = &x86_64_user_signal_handler_end;
|
||||||
|
|
||||||
// Copy the signal handler code to the commpage.
|
// Copy the signal handler code to the commpage.
|
||||||
size_t len = (size_t)((addr_t)handlerCodeEnd - (addr_t)handlerCode);
|
size_t len = (size_t)((addr_t)handlerCodeEnd - (addr_t)handlerCode);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// Userspace signal handler wrapper, copied to the commpage.
|
// Userspace signal handler wrapper, copied to the commpage.
|
||||||
FUNCTION(_user_signal_handler):
|
FUNCTION(x86_64_user_signal_handler):
|
||||||
push %rbp
|
push %rbp
|
||||||
movq %rsp, %rbp
|
movq %rsp, %rbp
|
||||||
|
|
||||||
@@ -52,5 +52,5 @@ FUNCTION(_user_signal_handler):
|
|||||||
leaq SIGNAL_FRAME_DATA_context(%r12), %rdx
|
leaq SIGNAL_FRAME_DATA_context(%r12), %rdx
|
||||||
movq SIGNAL_FRAME_DATA_user_data(%r12), %rcx
|
movq SIGNAL_FRAME_DATA_user_data(%r12), %rcx
|
||||||
jmp .Lcall_handler
|
jmp .Lcall_handler
|
||||||
FUNCTION_END(_user_signal_handler)
|
FUNCTION_END(x86_64_user_signal_handler)
|
||||||
SYMBOL(_user_signal_handler_end):
|
SYMBOL(x86_64_user_signal_handler_end):
|
||||||
|
|||||||
Reference in New Issue
Block a user