tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pcb offset into uarea



On Feb 16, 2014, at 1:41 PM, David Laight <david%l8s.co.uk@localhost> wrote:

> I'm adding code to i386 and amd64 to save the ymm registers on process
> switch - allowing userspace to use the AVX instructions.
> 
> I also don't want to have to do it all again when the next set of
> extensions appear.
> This means that the size of the FPU save area (currently embedded in
> the pcb) can't be determined until runtime.
> 
> Plan A is to move the FPU save are to the end of the pcb, and then
> locate the pcb at the correct offset in the uarea so that the written
> region ends at the end of the page.
> The problem with this is that the offset of the pcb in the uarea
> is set by MI code based on some #defines - and there seem to be
> several related values.
> 
> Now on x86 (like most systems) the cpu stack advances into low memory.
> The pcb is placed at the end of the uarea with the intial stack pointer
> just below it.
> I suspect that a long time ago (when the uarea had a fixed KVA) an
> additional memory page was placed below the uarea to give interrupts
> more stack space. I don't think this happens any more.
> 
> As an aside: The uarea used to be pageable, whereas (what is now) the
> lwp structure isn't. Paging of uarea's was disabled a few years back
> - so there is no real difference between the lifetimes of an lwp a uarea.
> (zombies probably lose the uarea before the lwp).
> 
> An alternative would be to place the FP save area at the start of the uarea.
> This would mean that, on stack overflow, the FP save area would be trashed
> before some random piece of memory.
> It might even be worth putting the pcb at the start of the uarea - so that
> stack overflow crashes out the failing process, and probably earlier
> than the random corruption would.

For most ports, the pcb is at the start of the uarea.

> This gives me three options:
> A) Put the save area at the end of the pcb and dynamically adjust the pcb
>   offset.
> B) Put the save area at the start of the uarea, with the pcb at a fixed
>   offset at the end of the uarea.
> C) Put the save area at the end of the pcb, and put the pcb at the start
>   of the uarea.
> 
> Votes?
> What have I missed?

Keep a default mmx/sse save area in the pcb along with a pointer to it.
If a variant is used that needs a larger save area, dynamically allocate
it and save it in the pcb pointer.

Since it's unlikely most processes will be AVX why waste the space?



Home | Main Index | Thread Index | Old Index