Re: [PATCH 2/3] x86_64: Define 128-bit memory-mapped I/O operations
From: "H. Peter Anvin" <hpa@zytor.com>
Date: 2012-08-22 03:49:39
On 08/21/2012 08:29 PM, David Miller wrote:
What we do is we have a FPU stack that grows up from the end of the thread_info struct, towards the bottom of the kernel stack.
We have 8K of kernel stack, and an xstate which is pushing a kilobyte already. This seems like a nightmare. Even if we allocate a larger stack for this sole purpose, we'd have to put a pretty hard cap on how far it could grow.
Slot 0 is always the user FPU state. Slot 1 and further are kernel FPU state save areas. We hold a counter which keep track of how far deeply saved we are in the stack. Not for the purpose of space saving, but for overhead reduction we sometimes can get away with only saving away half of the FPU registers. The chip provides a pair of dirty bits, one for the lower half of the FPU register file and one for the upper half. We only save the bits that are actually dirty. Furthermore, when we have FPU using code in the kernel that only uses the lower half of the registers, we only save away that part of the state around the routine.
This is messy on x86; it is somewhat doable but it gets really hairy because of the monolithic [f]xsave/[f]xrstor instruction. -hpa