xref: /openbsd/sys/arch/arm/arm/sys_machdep.c (revision 76d0caae)
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 */
55 static int arm32_sync_icache (struct proc *, char *, register_t *);
56 static int arm32_drain_writebuf (struct proc *, char *, register_t *);
57 
58 static int
59 arm32_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 
100 out:
101 	vm_map_unlock_read(map);
102 
103 	*retval = 0;
104 	return(0);
105 }
106 
107 static int
108 arm32_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 
118 int
119 sys_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