1 /* $OpenBSD: process.m88k.S,v 1.5 2006/11/17 20:54:47 deraadt Exp $ */
4 * Copyright (c) 2004, Miodrag Vallat.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
28 #include <machine/asm.h>
32 .globl _C_LABEL(PRE_Block)
35 * savecontext(int (*f)(), struct savearea *a1, char *newsp)
38 /* save all registers but r0, r2, r3 and r31 on stack - we could
39 skip r4 but saving it allows us to use it as a temporary below. */
60 /* set preemption lock */
61 or.u r4, r0, hi16(_C_LABEL(PRE_Block))
63 st r1, r4, lo16(_C_LABEL(PRE_Block))
66 /* save stack pointer, and fetch the new one if non NULL */
75 /* should not return, invoke abort() if this happens */
80 * returnto(struct savearea *a2)
86 /* restore registers */
100 ld.d r24, r31, 4 * 20
101 ld.d r26, r31, 4 * 22
102 ld.d r28, r31, 4 * 24
105 addu r31, r31, 4 * 30
107 /* clear preemption lock and return */
108 or.u r2, r0, hi16(_C_LABEL(PRE_Block))
110 st r0, r2, lo16(_C_LABEL(PRE_Block))