示例#1
0
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);
}
示例#2
0
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;
}