mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-14 01:00:07 +00:00
* 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:
parent
4ce349e559
commit
a86a7a3946
@ -1,5 +1,13 @@
|
|||||||
2008-05-01 David S. Miller <davem@davemloft.net>
|
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
|
* sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S: Add support for
|
||||||
six system call parameters.
|
six system call parameters.
|
||||||
* sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise.
|
* sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise.
|
||||||
|
@ -2,6 +2,10 @@ asm-CPPFLAGS = -D__ASSEMBLY__
|
|||||||
ASFLAGS-.os += -fPIC
|
ASFLAGS-.os += -fPIC
|
||||||
LD += -melf32_sparc
|
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
|
# When I get this to work, this is the right thing
|
||||||
ifeq ($(subdir),elf)
|
ifeq ($(subdir),elf)
|
||||||
CFLAGS-rtld.c += -mcpu=v8
|
CFLAGS-rtld.c += -mcpu=v8
|
||||||
|
85
sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
Normal file
85
sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
Normal 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)
|
93
sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
Normal file
93
sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
Normal 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)
|
119
sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
Normal file
119
sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
Normal 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)
|
119
sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
Normal file
119
sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
Normal 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)
|
61
sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
Normal file
61
sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
Normal 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)
|
Loading…
Reference in New Issue
Block a user