hw: prevent absolute addresses in x86_64 assembler

Ref #2091
This commit is contained in:
Stefan Kalkowski 2017-08-21 10:00:50 +02:00 committed by Christian Helmuth
parent b8cd58e6a5
commit 500893e7ec

View File

@ -37,8 +37,6 @@
/* mtc virt addresses */ /* mtc virt addresses */
.set MT_BASE, 0xffff0000 .set MT_BASE, 0xffff0000
.set MT_BUFFER, MT_BASE + (_mt_buffer - _mt_begin)
.set MT_MASTER, MT_BASE + (_mt_master_context_begin - _mt_begin)
.set MT_TSS, MT_BASE + (_mt_tss - _mt_begin) .set MT_TSS, MT_BASE + (_mt_tss - _mt_begin)
.set MT_ISR, MT_BASE .set MT_ISR, MT_BASE
.set MT_IRQ_STACK, MT_BASE + (_mt_kernel_interrupt_stack - _mt_begin) .set MT_IRQ_STACK, MT_BASE + (_mt_kernel_interrupt_stack - _mt_begin)
@ -70,11 +68,15 @@
.word \addr & 0xffff .word \addr & 0xffff
.word 0x0008 .word 0x0008
.word \flags .word \flags
.word \addr >> 16 .word (\addr >> 16) & 0xffff
.long \addr >> 32 .long \addr >> 32
.long 0 .long 0
.endm .endm
.macro _load_address label reg
mov \label@GOTPCREL(%rip), %\reg
.endm
.section .text .section .text
/* /*
@ -148,14 +150,17 @@
_mt_kernel_entry_pic: _mt_kernel_entry_pic:
/* Copy client context RAX to buffer */ /* Copy client context RAX to buffer */
movabs %rax, MT_BUFFER pushq %rax
/* Switch to kernel page tables */ /* Switch to kernel page tables */
movabs MT_MASTER+CR3_OFFSET, %rax _load_address _mt_master_context_begin rax
mov CR3_OFFSET(%rax), %rax
mov %rax, %cr3 mov %rax, %cr3
/* Save information on interrupt stack frame in client context */ /* Save information on interrupt stack frame in client context */
mov _mt_client_context_ptr, %rax _load_address _mt_client_context_ptr rax
mov (%rax), %rax
popq RAX_OFFSET(%rax)
popq TRAPNO_OFFSET(%rax) popq TRAPNO_OFFSET(%rax)
popq ERRCODE_OFFSET(%rax) popq ERRCODE_OFFSET(%rax)
popq (%rax) popq (%rax)
@ -171,7 +176,7 @@
pushq %rdx pushq %rdx
pushq %rcx pushq %rcx
pushq %rbx pushq %rbx
pushq _mt_buffer sub $8, %rsp
pushq %r15 pushq %r15
pushq %r14 pushq %r14
pushq %r13 pushq %r13
@ -181,34 +186,20 @@
pushq %r9 pushq %r9
pushq %r8 pushq %r8
/* Restore register values from kernel context */
mov $_mt_master_context_begin+R8_OFFSET, %rsp
popq %r8
popq %r9
popq %r10
popq %r11
popq %r12
popq %r13
popq %r14
popq %r15
popq %rax
popq %rbx
popq %rcx
popq %rdx
popq %rdi
popq %rsi
popq %rbp
/* Restore kernel stack and continue kernel execution */ /* Restore kernel stack and continue kernel execution */
mov _mt_master_context_begin+SP_OFFSET, %rsp _load_address _mt_master_context_begin rsp
jmp *_mt_master_context_begin mov (%rsp), %rax
mov SP_OFFSET(%rsp), %rsp
jmp *%rax
.global _mt_user_entry_pic .global _mt_user_entry_pic
_mt_user_entry_pic: _mt_user_entry_pic:
/* Prepare stack frame in mt buffer (Intel SDM Vol. 3A, figure 6-8) */ /* Prepare stack frame in mt buffer (Intel SDM Vol. 3A, figure 6-8) */
mov _mt_client_context_ptr, %rax _load_address _mt_client_context_ptr rax
mov $_mt_buffer+BUFFER_SIZE, %rsp mov (%rax), %rax
_load_address _mt_buffer rsp
add $BUFFER_SIZE, %rsp
pushq $0x23 pushq $0x23
pushq SP_OFFSET(%rax) pushq SP_OFFSET(%rax)
pushq FLAGS_OFFSET(%rax) pushq FLAGS_OFFSET(%rax)
@ -218,6 +209,7 @@
/* Restore register values from client context */ /* Restore register values from client context */
lea R8_OFFSET(%rax), %rsp lea R8_OFFSET(%rax), %rsp
_load_address _mt_buffer rbx
popq %r8 popq %r8
popq %r9 popq %r9
popq %r10 popq %r10
@ -226,7 +218,7 @@
popq %r13 popq %r13
popq %r14 popq %r14
popq %r15 popq %r15
popq _mt_buffer popq (%rbx)
popq %rbx popq %rbx
popq %rcx popq %rcx
popq %rdx popq %rdx
@ -239,7 +231,7 @@
mov %rax, %cr3 mov %rax, %cr3
/* Set stack back to mt buffer and restore client RAX */ /* Set stack back to mt buffer and restore client RAX */
movabs $MT_BUFFER, %rsp _load_address _mt_buffer rsp
popq %rax popq %rax
iretq iretq