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