kernel/x86_64: add signal handler compat code.

* x86_64_signal_handler_compat is a dump of x86 x86_signal_frame_function().
* the x86 compiler should be used to produce this code, which ends up in the
commpage.

Change-Id: I03da02c376f67ff83dbaba9bcb144da726463996
This commit is contained in:
Jérôme Duval 2018-05-15 18:50:40 +02:00 committed by Adrien Destugues
parent f42d4b5cc4
commit 95ed3b4432
2 changed files with 89 additions and 0 deletions

View File

@ -0,0 +1,40 @@
/*
* Copyright 2018, Jérôme Duval, jerome.duval@gmail.com.
* Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
* Distributed under the terms of the MIT License.
*/
#include "x86_signals.h"
#include <string.h>
#include <KernelExport.h>
#include <commpage_compat.h>
#include <cpu.h>
#include <elf.h>
#include <smp.h>
extern "C" void x86_64_signal_handler_compat(void);
extern int x86_64_signal_handler_compat_end;
void
x86_compat_initialize_commpage_signal_handler()
{
void* handlerCode = (void*)&x86_64_signal_handler_compat;
void* handlerCodeEnd = &x86_64_signal_handler_compat_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_compat_entry(
COMMPAGE_ENTRY_X86_SIGNAL_HANDLER, handlerCode, len);
// Add symbol to the commpage image.
image_id image = get_commpage_compat_image();
elf_add_memory_image_symbol(image, "commpage_compat_signal_handler",
position, len, B_SYMBOL_TYPE_TEXT);
}

View File

@ -0,0 +1,49 @@
/*
* Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*
* Dump of x86_signal_frame_function() in arch/x86/32/signals.cpp
*/
#include <asm_defs.h>
// TODO: build from arch/x86/32/signals.cpp with the x86 compiler
FUNCTION(x86_64_signal_handler_compat):
.byte 0x55 // push %ebp
.byte 0x89,0xe5 // mov %esp,%ebp
.byte 0x83,0xec,0x14 // sub $0x14,%esp
.byte 0x53 // push %ebx
.byte 0x8b,0x5d,0x08 // mov 0x8(%ebp),%ebx
.byte 0x80,0xbb,0x74,0x2,0x0,0x0,0x0 // cmpb $0x0,0x274(%ebx)
.byte 0x74,0x19 // je <x86_64_signal_frame_function_compat+0x2c>
.byte 0x8b,0x93,0x70,0x2,0x0,0x0 // mov 0x270(%ebx),%edx
.byte 0x8b,0x83,0x6c,0x2,0x0,0x0 // mov 0x26c(%ebx),%eax
.byte 0x50 // push %eax
.byte 0x8d,0x43,0x24 // lea 0x24(%ebx),%eax
.byte 0x50 // push %eax
.byte 0x53 // push %ebx
.byte 0x8b,0x3 // mov (%ebx),%eax
.byte 0x50 // push %eax
.byte 0xff,0xd2 // call *%edx
.byte 0xeb,0x19 // jmp <x86_64_signal_frame_function_compat+0x45>
.byte 0x8b,0x93,0x70,0x2,0x0,0x0 // mov 0x270(%ebx),%edx
.byte 0x83,0xc4,0xfc // add $0xfffffffc,%esp
.byte 0x8d,0x43,0x3c // lea 0x3c(%ebx),%eax
.byte 0x50 // push %eax
.byte 0x8b,0x83,0x6c,0x2,0x0,0x0 // mov 0x26c(%ebx),%eax
.byte 0x50 // push %eax
.byte 0x8b,0x03 // mov (%ebx),%eax
.byte 0x50 // push %eax
.byte 0xff,0xd2 // call *%edx
.byte 0x53 // push %ebx
.byte 0x6a,0x0 // push $0
.byte 0xb8,0x3f,0x0,0x0,0x0 // movl $ TO_STRING_LITERAL(SYSCALL_RESTORE_SIGNAL_FRAME) , %%eax;
.byte 0xcd,0x63 // int $99
.byte 0x8b,0x5d,0xe8 // mov -0x18(%ebp),%ebx
.byte 0x89,0xec // mov %ebp,%esp
.byte 0x5d // pop %ebp
.byte 0xc3 // ret
FUNCTION_END(x86_64_signal_handler_compat)
SYMBOL(x86_64_signal_handler_compat_end):