1/* $NetBSD: fusu.S,v 1.1 2014/08/10 05:47:37 matt Exp $ */
2
3/*-
4 * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matt Thomas of 3am Software Foundry.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <aarch64/asm.h>
33
34#include "assym.h"
35
36RCSID("$NetBSD: fusu.S,v 1.1 2014/08/10 05:47:37 matt Exp $");
37
38/* LINTSTUB: int fubyte(const void *base); */
39
40ENTRY(fubyte)
41	mrs	x2, tpidr_el1
42	ldr	x18, [x2, #CI_CURLWP]
43	adr	x3, .Lfusu_onfault
44	str	x3, [x18, #L_MD_ONFAULT]
45	ldtrb	w0, [x0]
46	str	xzr, [x18, #L_MD_ONFAULT]
47	ret
48END(fubyte)
49
50/* LINTSTUB: int fusword(const void *base); */
51
52ENTRY(fusword)
53	mrs	x2, tpidr_el1
54	ldr	x18, [x2, #CI_CURLWP]
55	adr	x3, .Lfusu_onfault
56	str	x3, [x18, #L_MD_ONFAULT]
57	ldtrh	w0, [x0]
58	str	xzr, [x18, #L_MD_ONFAULT]
59	ret
60END(fusword)
61
62/* LINTSTUB: int fuswintr(const void *base); */
63
64ENTRY(fuswintr)
65	mrs	x2, tpidr_el1
66	ldr	x18, [x2, #CI_CURLWP]
67	adr	x3, .Lfusu_onfault
68	str	x3, [x18, #L_MD_ONFAULT]
69	ldtrh	w0, [x0]
70	str	xzr, [x18, #L_MD_ONFAULT]
71	ret
72END(fuswintr)
73
74/* LINTSTUB: long fuword(const void *base); */
75
76ENTRY(fuword)
77	mrs	x2, tpidr_el1
78	ldr	x18, [x2, #CI_CURLWP]
79	adr	x3, .Lfusu_onfault
80	str	x3, [x18, #L_MD_ONFAULT]
81	ldtr	x0, [x0]
82	str	xzr, [x18, #L_MD_ONFAULT]
83	ret
84.Lfusu_onfault:
85	mvn	x0, xzr
86	ret
87END(fuword)
88
89/* LINTSTUB: int subyte(const void *base, int val); */
90
91ENTRY(subyte)
92	mrs	x2, tpidr_el1
93	ldr	x18, [x2, #CI_CURLWP]
94	adr	x3, .Lfusu_onfault
95	str	x3, [x18, #L_MD_ONFAULT]
96	sttrb	w1, [x0]
97	str	xzr, [x18, #L_MD_ONFAULT]
98	ret
99END(subyte)
100
101/* LINTSTUB: int susword(const void *base, int val); */
102
103ENTRY(susword)
104	mrs	x2, tpidr_el1
105	ldr	x18, [x2, #CI_CURLWP]
106	adr	x3, .Lfusu_onfault
107	str	x3, [x18, #L_MD_ONFAULT]
108	sttrh	w1, [x0]
109	str	xzr, [x18, #L_MD_ONFAULT]
110	ret
111END(susword)
112
113/* LINTSTUB: int suswintr(const void *base, int val); */
114
115ENTRY(suswintr)
116	mrs	x2, tpidr_el1
117	ldr	x18, [x2, #CI_CURLWP]
118	adr	x3, .Lfusu_onfault
119	str	x3, [x18, #L_MD_ONFAULT]
120	sttrh	w1, [x0]
121	str	xzr, [x18, #L_MD_ONFAULT]
122	ret
123END(suswintr)
124
125/* LINTSTUB: long suword(const void *base, int val); */
126
127ENTRY(suword)
128	mrs	x2, tpidr_el1
129	ldr	x18, [x2, #CI_CURLWP]
130	adr	x3, .Lfusu_onfault
131	str	x3, [x18, #L_MD_ONFAULT]
132	sttr	x1, [x0]
133	str	xzr, [x18, #L_MD_ONFAULT]
134	ret
135END(suword)
136