* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.

* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]: 
(gen-as-const-headers): Add it. 
* sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file. 
* sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise. 
* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise. 
* sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
	* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]:
	(gen-as-const-headers): Add it.
	* sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file.
	* sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
This commit is contained in:
Jakub Jelinek 2008-05-05 09:34:18 +00:00
parent 4ce349e559
commit a86a7a3946
7 changed files with 489 additions and 0 deletions

View File

@ -1,5 +1,13 @@
2008-05-01 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]:
(gen-as-const-headers): Add it.
* sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S: Add support for
six system call parameters.
* sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise.

View File

@ -2,6 +2,10 @@ asm-CPPFLAGS = -D__ASSEMBLY__
ASFLAGS-.os += -fPIC
LD += -melf32_sparc
ifeq ($(subdir),stdlib)
gen-as-const-headers += ucontext_i.sym
endif
# When I get this to work, this is the right thing
ifeq ($(subdir),elf)
CFLAGS-rtld.c += -mcpu=v8

View File

@ -0,0 +1,85 @@
/* Save current context.
Copyright (C) 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>, 2008.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include "ucontext_i.h"
/* int __getcontext (ucontext_t *ucp)
Saves the machine context in UCP such that when it is activated,
it appears as if __getcontext() returned again.
This implementation is intended to be used for *synchronous* context
switches only. Therefore, it does not have to save anything
other than the PRESERVED state. */
ENTRY(__getcontext)
save %sp, -112, %sp
st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR]
/* In reality, we only use the GREG_PC value when setting
or swapping contexts. But we fill in NPC for completeness. */
add %i7, 8, %o0
st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC]
add %o0, 4, %o0
st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC]
rd %y, %o1
st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y]
st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1]
st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2]
st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3]
st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4]
st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5]
st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6]
st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7]
mov SIG_BLOCK, %o0
clr %o1
add %i0, UC_SIGMASK, %o2
mov 8, %o3
mov __NR_rt_sigprocmask, %g1
ta 0x10
/* Zero, success, return value. */
st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0]
st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1]
st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2]
st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3]
st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4]
st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5]
st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6]
st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7]
st %g0, [%i0 + UC_MCONTEXT + MC_GWINS]
/* Do not save FPU state, it is volatile across calls. */
stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN]
st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID]
st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR]
jmpl %i7 + 8, %g0
restore %g0, %g0, %o0
END(__getcontext)
weak_alias (__getcontext, getcontext)

View File

@ -0,0 +1,93 @@
/* Create new context.
Copyright (C) 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>, 2008.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <stdarg.h>
#include <stdint.h>
#include <ucontext.h>
/* Sets up the outgoing arguments and the program counter for a user
context for the requested function call.
Returning to the correct parent context is pretty simple on
Sparc. We only need to link up the register windows correctly.
Since global registers are clobbered by calls, we need not be
concernred about those, and thus is all could be worked out without
using a trampoline.
Except that we must deal with the signal mask, thus a trampoline
is unavoidable. 32-bit stackframe layout:
+-----------------------------------------+
| 7th and further parameters |
+-----------------------------------------+
| backup storage for initial 6 parameters |
+-----------------------------------------+
| struct return pointer |
+-----------------------------------------+
| 8 incoming registers |
+-----------------------------------------+
| 8 local registers |
%sp --> +-----------------------------------------+
*/
void
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
{
extern void __start_context (void);
unsigned long int *sp;
va_list ap;
int i;
sp = (unsigned long int *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
sp -= 16 + 7 + argc;
sp = (unsigned long int *) (((uintptr_t) sp) & ~(8 - 1));
for (i = 0; i < 8; i++)
sp[i + 8] = ucp->uc_mcontext.gregs[REG_O0 + i];
/* The struct return pointer is essentially unused, so we can
place the link there. */
sp[16] = (unsigned long int) ucp->uc_link;
va_start (ap, argc);
/* Fill in outgoing arguments, including those which will
end up being passed on the stack. */
for (i = 0; i < argc; i++)
{
unsigned long int arg = va_arg (ap, unsigned long int);
if (i < 6)
ucp->uc_mcontext.gregs[REG_O0 + i] = arg;
else
sp[i + 23] = arg;
}
va_end (ap);
ucp->uc_mcontext.gregs[REG_O6] = (unsigned long int) sp;
ucp->uc_mcontext.gregs[REG_O7] = ((unsigned long int) __start_context) - 8;
ucp->uc_mcontext.gregs[REG_PC] = (unsigned long int) func;
ucp->uc_mcontext.gregs[REG_nPC] = ucp->uc_mcontext.gregs[REG_PC] + 4;
}
weak_alias (__makecontext, makecontext)

View File

@ -0,0 +1,119 @@
/* Install given context.
Copyright (C) 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>, 2008.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <sys/trap.h>
#include "ucontext_i.h"
/* int __setcontext (const ucontext_t *ucp)
Restores the machine context in UCP and thereby resumes execution
in that context.
This implementation is intended to be used for *synchronous* context
switches only. Therefore, it does not have to restore anything
other than the PRESERVED state. */
ENTRY(__setcontext)
save %sp, -112, %sp
mov SIG_SETMASK, %o0
add %i0, UC_SIGMASK, %o1
clr %o2
mov 8, %o3
mov __NR_rt_sigprocmask, %g1
ta 0x10
/* This is a bit on the expensive side, and we could optimize
the unwind similar to how the 32-bit sparc longjmp code
does if performance of this routine really matters. */
ta ST_FLUSH_WINDOWS
ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1
cmp %g1, 0
be 1f
nop
ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30
1:
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1
wr %g1, 0x0, %y
/* We specifically do not restore %g1 since we need it here as
a temporary. */
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6
restore
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1
jmpl %g1, %g0
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0
END(__setcontext)
weak_alias (__setcontext, setcontext)
/* This is the helper code which gets called if a function which is
registered with 'makecontext' returns. In this case we have to
install the context listed in the uc_link element of the context
'makecontext' manipulated at the time of the 'makecontext' call.
If the pointer is NULL the process must terminate. */
ENTRY(__start_context)
ld [%sp + (16 * 4)], %g1
cmp %g1, 0
be,a 1f
clr %o0
call __setcontext
mov %g1, %o0
/* If this returns (which can happen if the syscall fails) we'll
exit the program with the return error value (-1). */
1: call exit
nop
/* The 'exit' call should never return. In case it does cause
the process to terminate. */
unimp
END(__start_context)

View File

@ -0,0 +1,119 @@
/* Save current context and install the given one.
Copyright (C) 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@davemloft.net>, 2008.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <sys/trap.h>
#include "ucontext_i.h"
/* int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp);
Saves the machine context in oucp such that when it is activated,
it appears as if __swapcontext() returned again, restores the
machine context in ucp and thereby resumes execution in that
context.
This implementation is intended to be used for *synchronous* context
switches only. Therefore, it does not have to save anything
other than the PRESERVED state. */
ENTRY(__swapcontext)
save %sp, -112, %sp
ta ST_FLUSH_WINDOWS
st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR]
add %i7, 8, %o0
st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC]
add %o0, 4, %o0
st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC]
rd %y, %o1
st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y]
st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1]
st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2]
st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3]
st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4]
st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5]
st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6]
st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7]
st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0]
st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1]
st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2]
st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3]
st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4]
st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5]
st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6]
st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7]
st %g0, [%i0 + UC_MCONTEXT + MC_GWINS]
stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN]
st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID]
st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR]
mov SIG_SETMASK, %o0
add %i1, UC_SIGMASK, %o1
add %i0, UC_SIGMASK, %o2
mov 8, %o3
mov __NR_rt_sigprocmask, %g1
ta 0x10
mov %i1, %i0
ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1
cmp %g1, 0
be 1f
nop
ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28
ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30
1:
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1
wr %g1, 0x0, %y
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5
ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6
restore
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1
jmpl %g1, %g0
ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0
END(__swapcontext)
weak_alias (__swapcontext, swapcontext)

View File

@ -0,0 +1,61 @@
#include <stddef.h>
#include <signal.h>
#include <sys/ucontext.h>
--
SIG_BLOCK
SIG_SETMASK
UC_FLAGS offsetof (ucontext_t, uc_flags)
UC_LINK offsetof (ucontext_t, uc_link)
UC_SIGMASK offsetof (ucontext_t, uc_sigmask)
UC_STACK offsetof (ucontext_t, uc_stack)
UC_MCONTEXT offsetof (ucontext_t, uc_mcontext)
MC_GREGS offsetof (mcontext_t, gregs)
MC_GWINS offsetof (mcontext_t, gwins)
MC_FPREGS offsetof (mcontext_t, fpregs)
MC_XRS offsetof (mcontext_t, xrs)
MC_FILLER offsetof (mcontext_t, filler)
GREG_PSR (REG_PSR * sizeof(greg_t))
GREG_PC (REG_PC * sizeof(greg_t))
GREG_NPC (REG_nPC * sizeof(greg_t))
GREG_Y (REG_Y * sizeof(greg_t))
GREG_G1 (REG_G1 * sizeof(greg_t))
GREG_G2 (REG_G2 * sizeof(greg_t))
GREG_G3 (REG_G3 * sizeof(greg_t))
GREG_G4 (REG_G4 * sizeof(greg_t))
GREG_G5 (REG_G5 * sizeof(greg_t))
GREG_G6 (REG_G6 * sizeof(greg_t))
GREG_G7 (REG_G7 * sizeof(greg_t))
GREG_O0 (REG_O0 * sizeof(greg_t))
GREG_O1 (REG_O1 * sizeof(greg_t))
GREG_O2 (REG_O2 * sizeof(greg_t))
GREG_O3 (REG_O3 * sizeof(greg_t))
GREG_O4 (REG_O4 * sizeof(greg_t))
GREG_O5 (REG_O5 * sizeof(greg_t))
GREG_O6 (REG_O6 * sizeof(greg_t))
GREG_O7 (REG_O7 * sizeof(greg_t))
FPU_D0 offsetof (fpregset_t, fpu_fr.fpu_dregs[0])
FPU_D2 offsetof (fpregset_t, fpu_fr.fpu_dregs[1])
FPU_D4 offsetof (fpregset_t, fpu_fr.fpu_dregs[2])
FPU_D6 offsetof (fpregset_t, fpu_fr.fpu_dregs[3])
FPU_D8 offsetof (fpregset_t, fpu_fr.fpu_dregs[4])
FPU_D10 offsetof (fpregset_t, fpu_fr.fpu_dregs[5])
FPU_D12 offsetof (fpregset_t, fpu_fr.fpu_dregs[6])
FPU_D14 offsetof (fpregset_t, fpu_fr.fpu_dregs[7])
FPU_D16 offsetof (fpregset_t, fpu_fr.fpu_dregs[8])
FPU_D18 offsetof (fpregset_t, fpu_fr.fpu_dregs[9])
FPU_D20 offsetof (fpregset_t, fpu_fr.fpu_dregs[10])
FPU_D22 offsetof (fpregset_t, fpu_fr.fpu_dregs[11])
FPU_D24 offsetof (fpregset_t, fpu_fr.fpu_dregs[12])
FPU_D26 offsetof (fpregset_t, fpu_fr.fpu_dregs[13])
FPU_D28 offsetof (fpregset_t, fpu_fr.fpu_dregs[14])
FPU_D30 offsetof (fpregset_t, fpu_fr.fpu_dregs[15])
FPU_Q offsetof (fpregset_t, fpu_q)
FPU_FSR offsetof (fpregset_t, fpu_fsr)
FPU_QCNT offsetof (fpregset_t, fpu_qcnt)
FPU_Q_ENTRY_SZ offsetof (fpregset_t, fpu_q_entrysize)
FPU_EN offsetof (fpregset_t, fpu_en)
XRS_ID offsetof (xrs_t, xrs_id)
XRS_PTR offsetof (xrs_t, xrs_ptr)