| 96 | } |
| 97 | |
| 98 | static int |
| 99 | arm32_sync_icache(struct thread *td, void *args) |
| 100 | { |
| 101 | struct arm_sync_icache_args ua; |
| 102 | int error; |
| 103 | ksiginfo_t ksi; |
| 104 | vm_offset_t rv; |
| 105 | |
| 106 | if ((error = copyin(args, &ua, sizeof(ua))) != 0) |
| 107 | return (error); |
| 108 | |
| 109 | if (ua.len == 0) { |
| 110 | td->td_retval[0] = 0; |
| 111 | return (0); |
| 112 | } |
| 113 | |
| 114 | /* |
| 115 | * Validate arguments. Address and length are unsigned, |
| 116 | * so we can use wrapped overflow check. |
| 117 | */ |
| 118 | if (((ua.addr + ua.len) < ua.addr) || |
| 119 | ((ua.addr + ua.len) > VM_MAXUSER_ADDRESS)) { |
| 120 | ksiginfo_init_trap(&ksi); |
| 121 | ksi.ksi_signo = SIGSEGV; |
| 122 | ksi.ksi_code = SEGV_ACCERR; |
| 123 | ksi.ksi_addr = (void *)max(ua.addr, VM_MAXUSER_ADDRESS); |
| 124 | trapsignal(td, &ksi); |
| 125 | return (EINVAL); |
| 126 | } |
| 127 | |
| 128 | rv = sync_icache(ua.addr, ua.len); |
| 129 | if (rv != 1) { |
| 130 | ksiginfo_init_trap(&ksi); |
| 131 | ksi.ksi_signo = SIGSEGV; |
| 132 | ksi.ksi_code = SEGV_MAPERR; |
| 133 | ksi.ksi_addr = (void *)rv; |
| 134 | trapsignal(td, &ksi); |
| 135 | return (EINVAL); |
| 136 | } |
| 137 | |
| 138 | td->td_retval[0] = 0; |
| 139 | return (0); |
| 140 | } |
| 141 | |
| 142 | static int |
| 143 | arm32_drain_writebuf(struct thread *td, void *args) |
no test coverage detected