1107571Sgrehan/*-
2107571Sgrehan * Copyright (c) 2002 Peter Grehan.
3107571Sgrehan * All rights reserved.
4107571Sgrehan *
5107571Sgrehan * Redistribution and use in source and binary forms, with or without
6107571Sgrehan * modification, are permitted provided that the following conditions
7107571Sgrehan * are met:
8107571Sgrehan * 1. Redistributions of source code must retain the above copyright
9107571Sgrehan *    notice, this list of conditions and the following disclaimer.
10107571Sgrehan * 2. Redistributions in binary form must reproduce the above copyright
11107571Sgrehan *    notice, this list of conditions and the following disclaimer in the
12107571Sgrehan *    documentation and/or other materials provided with the distribution.
13107571Sgrehan *
14107571Sgrehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15107571Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16107571Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17107571Sgrehan * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18107571Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19107571Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20107571Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21107571Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22107571Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23107571Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24107571Sgrehan * SUCH DAMAGE.
25107571Sgrehan */
26107571Sgrehan/*      $NetBSD: cerror.S,v 1.5 2000/01/27 14:58:48 kleink Exp $        */
27107571Sgrehan
28107571Sgrehan#include <machine/asm.h>
29107571Sgrehan__FBSDID("$FreeBSD$");
30107571Sgrehan
31107571Sgrehan#include "SYS.h"
32107571Sgrehan
33107571Sgrehan	.globl  HIDENAME(cerror)
34107571Sgrehan	.globl  CNAME(__error)
35107571Sgrehan
36107571Sgrehan	/*
37107571Sgrehan	 * The __error() function is thread aware. For non-threaded
38107571Sgrehan	 * programs and the initial threaded in threaded programs,
39107571Sgrehan	 * it returns a pointer to the global errno variable.
40107571Sgrehan	 */
41107571SgrehanHIDENAME(cerror):
42107571Sgrehan	mflr	%r0
43107571Sgrehan	stwu	%r1,-16(%r1)		/* allocate new stack frame */
44107571Sgrehan	stw	%r0,20(%r1)		/* and save lr, r31 */
45107571Sgrehan	stw	%r31,8(%r1)
46107571Sgrehan	mr	%r31,%r3          /* stash errval in callee-saved register */
47107571Sgrehan	bl	PIC_PLT(CNAME(__error))
48107571Sgrehan	stw	%r31,0(%r3)		/* store errval into &errno */
49107571Sgrehan	lwz	%r0,20(%r1)
50107571Sgrehan	lwz	%r31,8(%r1)
51107571Sgrehan	mtlr	%r0
52107571Sgrehan	la	%r1,16(%r1)
53107571Sgrehan	li	%r3,-1
54107571Sgrehan	li	%r4,-1
55107571Sgrehan	blr				/* return to callers caller */
56107571Sgrehan
57217398Skib	.section .note.GNU-stack,"",%progbits
58