void x86_initialize_commpage_signal_handler() { void* handlerCode = (void*)&x86_64_user_signal_handler; void* handlerCodeEnd = &x86_64_user_signal_handler_end; // Copy the signal handler code to the commpage. size_t len = (size_t)((addr_t)handlerCodeEnd - (addr_t)handlerCode); addr_t position = fill_commpage_entry(COMMPAGE_ENTRY_X86_SIGNAL_HANDLER, handlerCode, len); // Add symbol to the commpage image. image_id image = get_commpage_image(); elf_add_memory_image_symbol(image, "commpage_signal_handler", position, len, B_SYMBOL_TYPE_TEXT); }
status_t x86_initialize_commpage_syscall(void) { void* syscallCode = (void *)&_user_syscall_int; void* syscallCodeEnd = &_user_syscall_int_end; // check syscall if (all_cpus_have_feature(FEATURE_COMMON, IA32_FEATURE_SEP) && !(gCPU[0].arch.family == 6 && gCPU[0].arch.model < 3 && gCPU[0].arch.stepping < 3)) { // Intel sysenter/sysexit dprintf("initialize_commpage_syscall(): sysenter/sysexit supported\n"); // the code to be used in userland syscallCode = (void *)&_user_syscall_sysenter; syscallCodeEnd = &_user_syscall_sysenter_end; // tell all CPUs to init their sysenter/sysexit related registers call_all_cpus_sync(&init_intel_syscall_registers, NULL); } else if (all_cpus_have_feature(FEATURE_EXT_AMD, IA32_FEATURE_AMD_EXT_SYSCALL)) { // AMD syscall/sysret dprintf("initialize_commpage_syscall(): syscall/sysret supported " "-- not yet by Antares, though"); } else { // no special syscall support dprintf("initialize_commpage_syscall(): no special syscall support\n"); } // fill in the table entry size_t len = (size_t)((addr_t)syscallCodeEnd - (addr_t)syscallCode); fill_commpage_entry(COMMPAGE_ENTRY_X86_SYSCALL, syscallCode, len); // add syscall to the commpage image image_id image = get_commpage_image(); elf_add_memory_image_symbol(image, "commpage_syscall", ((addr_t*)USER_COMMPAGE_ADDR)[COMMPAGE_ENTRY_X86_SYSCALL], len, B_SYMBOL_TYPE_TEXT); return B_OK; }