xref: /haiku/src/system/kernel/arch/x86/64/signals_compat.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright 2018, Jérôme Duval, jerome.duval@gmail.com.
3  * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include "x86_signals.h"
9 
10 #include <string.h>
11 
12 #include <KernelExport.h>
13 
14 #include <commpage_compat.h>
15 #include <cpu.h>
16 #include <elf.h>
17 #include <smp.h>
18 
19 
20 extern "C" void x86_64_signal_handler_compat(void);
21 extern int x86_64_signal_handler_compat_end;
22 
23 
24 void
25 x86_compat_initialize_commpage_signal_handler()
26 {
27 	void* handlerCode = (void*)&x86_64_signal_handler_compat;
28 	void* handlerCodeEnd = &x86_64_signal_handler_compat_end;
29 
30 	// Copy the signal handler code to the commpage.
31 	size_t len = (size_t)((addr_t)handlerCodeEnd - (addr_t)handlerCode);
32 	addr_t position = fill_commpage_compat_entry(
33 		COMMPAGE_ENTRY_X86_SIGNAL_HANDLER, handlerCode, len);
34 
35 	// Add symbol to the commpage image.
36 	image_id image = get_commpage_compat_image();
37 	elf_add_memory_image_symbol(image, "commpage_compat_signal_handler",
38 		position, len, B_SYMBOL_TYPE_TEXT);
39 }
40 
41