diff options
author | Ian Moffett <ian@osmora.org> | 2024-03-13 21:27:39 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-03-13 21:48:21 -0400 |
commit | fc9c7bab5bb64dd2242e9e9dff98060d64af2a32 (patch) | |
tree | 7595e81043217c2e6ba81fe1cec5850bf7ae77b7 /sys/arch/amd64 | |
parent | 8b68f956154b43b2b2fe2b8783ae6f23bf90d47b (diff) |
kernel/amd64: machdep: Add pcb init code
This commit adds a processor specific routine which sets up the
Process Control Block for a thread
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r-- | sys/arch/amd64/amd64/machdep.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c index 809e395..0789f5a 100644 --- a/sys/arch/amd64/amd64/machdep.c +++ b/sys/arch/amd64/amd64/machdep.c @@ -154,6 +154,31 @@ intr_unmask(void) __ASMV("sti"); } +int +processor_init_pcb(struct proc *proc) +{ + struct pcb *pcb = &proc->pcb; + const uint16_t FPU_FCW = 0x33F; + const uint32_t SSE_MXCSR = 0x1F80; + + /* Allocate FPU save area, aligned on a 16 byte boundary */ + pcb->fpu_state = PHYS_TO_VIRT(vm_alloc_pageframe(1)); + if (pcb->fpu_state == 0) { + return -1; + } + + /* + * Setup x87 FPU control word and SSE MXCSR bits + * as per the sysv ABI + */ + __ASMV("fldcw %0\n" + "ldmxcsr %1" + :: "m" (FPU_FCW), + "m" (SSE_MXCSR) : "memory"); + + amd64_fxsave(pcb->fpu_state); + return 0; +} void processor_init(void) { |