parent
b8cd58e6a5
commit
500893e7ec
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user