fix: load x87 fpu default settings
authorMinep <zelong56@gmail.com>
Sat, 17 Sep 2022 18:10:33 +0000 (19:10 +0100)
committerMinep <zelong56@gmail.com>
Sat, 17 Sep 2022 18:10:33 +0000 (19:10 +0100)
fix: forked child should inherit parent's x87 and mmx state

lunaix-os/kernel/k_init.c
lunaix-os/kernel/process/process.c

index fe9cf90a7393ff8347d9f516faea1f0e1f500f64..ce4ac6aab8d44585c04e04a0e219da3283e68741 100644 (file)
@@ -164,6 +164,11 @@ spawn_proc0()
                  : "i"(KSTACK_TOP), "i"(KCODE_SEG), "r"(proc0->intr_ctx.eip)
                  : "%ebx", "memory");
 
                  : "i"(KSTACK_TOP), "i"(KCODE_SEG), "r"(proc0->intr_ctx.eip)
                  : "%ebx", "memory");
 
+    // 加载x87默认配置
+    asm volatile("fninit\n"
+                 "fxsave (%%eax)" ::"a"(proc0->fxstate)
+                 : "memory");
+
     // 向调度器注册进程。
     commit_process(proc0);
 
     // 向调度器注册进程。
     commit_process(proc0);
 
index 82f1ffa7dcec24bd10e15f09bae93f3e66b0d899..74c93807f57115ac85f582d60c5acdd58996d313 100644 (file)
@@ -196,6 +196,8 @@ dup_proc()
     pcb->intr_ctx = __current->intr_ctx;
     pcb->parent = __current;
 
     pcb->intr_ctx = __current->intr_ctx;
     pcb->parent = __current;
 
+    memcpy(pcb->fxstate, __current->fxstate, 512);
+
     if (__current->cwd) {
         pcb->cwd = __current->cwd;
         vfs_ref_dnode(pcb->cwd);
     if (__current->cwd) {
         pcb->cwd = __current->cwd;
         vfs_ref_dnode(pcb->cwd);