mirror of
https://github.com/usatiuk/ficus.git
synced 2025-10-29 00:27:52 +01:00
fix fxsave/fxrstor
apparently the fxsaved memory needs to be zeroed out before...
This commit is contained in:
@@ -175,13 +175,15 @@ struct Task *new_ktask(void(*fn), char *name) {
|
||||
new->frame.ip = (uint64_t) fn;
|
||||
new->frame.cs = GDTSEL(gdt_code);
|
||||
new->frame.ss = GDTSEL(gdt_data);
|
||||
__builtin_ia32_fxsave64((void *) (((uintptr_t) (new->frame.ssestate) + 32) & 0xFFFFFFFFFFFFFFF0));
|
||||
for (int i = 0; i < 512; i++) new->frame.ssestate[i] = 0;
|
||||
new->frame.flags = flags();
|
||||
new->frame.guard = IDT_GUARD;
|
||||
new->addressSpace = KERN_AddressSpace;
|
||||
new->state = TS_RUNNING;
|
||||
new->mode = TASKMODE_KERN;
|
||||
|
||||
sanity_check_frame(&new->frame);
|
||||
|
||||
m_lock(&NewTasks_lock);
|
||||
append_task(&NewTasks, new);
|
||||
m_unlock(&NewTasks_lock);
|
||||
|
||||
@@ -25,13 +25,16 @@
|
||||
|
||||
; Ensure 16-byte alignment
|
||||
; This works as last bunch of bits in fxsave state aren't used
|
||||
sub rsp, 512
|
||||
; Fxsaved memory needs to be zeroed before!
|
||||
mov rsi, 0x0000000000000000
|
||||
times 64 push rsi
|
||||
|
||||
mov rsi, rsp
|
||||
add rsi, 32
|
||||
mov rdi, 0xFFFFFFFFFFFFFFF0
|
||||
and rsi, rdi
|
||||
; TODO: Fix!!
|
||||
; fxsave [rsi]
|
||||
|
||||
fxsave64 [rsi]
|
||||
|
||||
%endmacro
|
||||
%macro popaq 0
|
||||
@@ -43,7 +46,7 @@
|
||||
mov rdi, 0xFFFFFFFFFFFFFFF0
|
||||
and rsi, rdi
|
||||
|
||||
; fxrstor [rsi]
|
||||
fxrstor64 [rsi]
|
||||
add rsp, 512
|
||||
|
||||
pop r15
|
||||
|
||||
Reference in New Issue
Block a user