1/*	$OpenBSD: sys_machdep.c,v 1.7 2021/05/16 03:39:27 jsg Exp $	*/
2/*	$NetBSD: sys_machdep.c,v 1.6 2003/07/15 00:24:42 lukem Exp $	*/
3
4/*
5 * Copyright (c) 1995-1997 Mark Brinicombe.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by Mark Brinicombe
19 * 4. The name of the company nor the name of the author may be used to
20 *    endorse or promote products derived from this software without specific
21 *    prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * RiscBSD kernel project
36 *
37 * sys_machdep.c
38 *
39 * Machine dependant syscalls
40 *
41 * Created      : 10/01/96
42 */
43
44#include <sys/param.h>
45#include <sys/systm.h>
46#include <sys/proc.h>
47#include <sys/mount.h>
48#include <uvm/uvm_extern.h>
49#include <sys/sysctl.h>
50#include <sys/syscallargs.h>
51
52#include <machine/sysarch.h>
53
54/* Prototypes */
55static int arm32_sync_icache (struct proc *, char *, register_t *);
56static int arm32_drain_writebuf (struct proc *, char *, register_t *);
57
58static int
59arm32_sync_icache(struct proc *p, char *args, register_t *retval)
60{
61	struct arm_sync_icache_args ua;
62	struct vm_map *map = &p->p_vmspace->vm_map;
63	struct vm_map_entry *entry;
64	vaddr_t va;
65	vsize_t sz, chunk;
66	int error;
67
68	if ((error = copyin(args, &ua, sizeof(ua))) != 0)
69		return (error);
70
71	va = ua.addr;
72	sz = ua.len;
73
74	vm_map_lock_read(map);
75
76	if (va + sz <= vm_map_min(map) || va >= vm_map_max(map) ||
77	    va + sz < va)
78		goto out;
79
80	if (va < vm_map_min(map)) {
81		sz -= vm_map_min(map) - va;
82		va = vm_map_min(map);
83	} else if (va + sz >= vm_map_max(map)) {
84		sz = vm_map_max(map) - va;
85	}
86
87	chunk = PAGE_SIZE - (va & PAGE_MASK);
88	while (sz > 0) {
89		if (chunk > sz)
90			chunk = sz;
91
92		if (uvm_map_lookup_entry(map, va, &entry))
93			cpu_icache_sync_range(va, chunk);
94
95		va += chunk;
96		sz -= chunk;
97		chunk = PAGE_SIZE;
98	}
99
100out:
101	vm_map_unlock_read(map);
102
103	*retval = 0;
104	return(0);
105}
106
107static int
108arm32_drain_writebuf(struct proc *p, char *args, register_t *retval)
109{
110	/* No args. */
111
112	cpu_drain_writebuf();
113
114	*retval = 0;
115	return(0);
116}
117
118int
119sys_sysarch(struct proc *p, void *v, register_t *retval)
120{
121	struct sys_sysarch_args /* {
122		syscallarg(int) op;
123		syscallarg(void *) parms;
124	} */ *uap = v;
125	int error = 0;
126
127	switch(SCARG(uap, op)) {
128	case ARM_SYNC_ICACHE :
129		error = arm32_sync_icache(p, SCARG(uap, parms), retval);
130		break;
131
132	case ARM_DRAIN_WRITEBUF :
133		error = arm32_drain_writebuf(p, SCARG(uap, parms), retval);
134		break;
135
136	default:
137		error = EINVAL;
138		break;
139	}
140	return (error);
141}
142