Fri Jun 19 07:24:41 2020 UTC ()
Return correct signo and si_code to userland when page fault.
Taken from powerpc/trap.c. Found by tests in lib/libc/sys.


(rin)
diff -r1.79 -r1.80 src/sys/arch/powerpc/ibm4xx/trap.c

cvs diff -r1.79 -r1.80 src/sys/arch/powerpc/ibm4xx/trap.c (expand / switch to unified diff)

--- src/sys/arch/powerpc/ibm4xx/trap.c 2020/06/19 07:19:19 1.79
+++ src/sys/arch/powerpc/ibm4xx/trap.c 2020/06/19 07:24:41 1.80
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: trap.c,v 1.79 2020/06/19 07:19:19 rin Exp $ */ 1/* $NetBSD: trap.c,v 1.80 2020/06/19 07:24:41 rin Exp $ */
2 2
3/* 3/*
4 * Copyright 2001 Wasabi Systems, Inc. 4 * Copyright 2001 Wasabi Systems, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. 7 * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -57,27 +57,27 @@ @@ -57,27 +57,27 @@
57 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 57 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
58 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 58 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
59 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 59 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
60 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 60 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
61 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 61 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
62 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 62 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
63 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 63 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
64 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 64 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
65 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 65 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
66 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 66 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
67 */ 67 */
68 68
69#include <sys/cdefs.h> 69#include <sys/cdefs.h>
70__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.79 2020/06/19 07:19:19 rin Exp $"); 70__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.80 2020/06/19 07:24:41 rin Exp $");
71 71
72#include "opt_altivec.h" 72#include "opt_altivec.h"
73#include "opt_ddb.h" 73#include "opt_ddb.h"
74#include "opt_kgdb.h" 74#include "opt_kgdb.h"
75 75
76#define __UFETCHSTORE_PRIVATE 76#define __UFETCHSTORE_PRIVATE
77 77
78#include <sys/param.h> 78#include <sys/param.h>
79#include <sys/cpu.h> 79#include <sys/cpu.h>
80#include <sys/kauth.h> 80#include <sys/kauth.h>
81#include <sys/proc.h> 81#include <sys/proc.h>
82#include <sys/reboot.h> 82#include <sys/reboot.h>
83#include <sys/syscall.h> 83#include <sys/syscall.h>
@@ -237,58 +237,68 @@ out: @@ -237,58 +237,68 @@ out:
237 237
238 DBPRINTF(TDB_ALL, 238 DBPRINTF(TDB_ALL,
239 ("trap(EXC_DSI|EXC_USER) at %lx %s fault on %lx %x\n", 239 ("trap(EXC_DSI|EXC_USER) at %lx %s fault on %lx %x\n",
240 tf->tf_srr0, (ftype & VM_PROT_WRITE) ? "write" : "read", 240 tf->tf_srr0, (ftype & VM_PROT_WRITE) ? "write" : "read",
241 tf->tf_dear, tf->tf_esr)); 241 tf->tf_dear, tf->tf_esr));
242 KASSERT(l == curlwp && (l->l_stat == LSONPROC)); 242 KASSERT(l == curlwp && (l->l_stat == LSONPROC));
243// KASSERT(curpcb->pcb_onfault == NULL); 243// KASSERT(curpcb->pcb_onfault == NULL);
244 rv = uvm_fault(&p->p_vmspace->vm_map, trunc_page(tf->tf_dear), 244 rv = uvm_fault(&p->p_vmspace->vm_map, trunc_page(tf->tf_dear),
245 ftype); 245 ftype);
246 if (rv == 0) { 246 if (rv == 0) {
247 break; 247 break;
248 } 248 }
249 KSI_INIT_TRAP(&ksi); 249 KSI_INIT_TRAP(&ksi);
250 ksi.ksi_signo = SIGSEGV; 
251 ksi.ksi_trap = EXC_DSI; 250 ksi.ksi_trap = EXC_DSI;
252 ksi.ksi_addr = (void *)tf->tf_dear; 251 ksi.ksi_addr = (void *)tf->tf_dear;
253 if (rv == ENOMEM) { 252vm_signal:
254 printf("UVM: pid %d (%s) lid %d, uid %d killed: " 253 switch (rv) {
255 "out of swap\n", 254 case EINVAL:
256 p->p_pid, p->p_comm, l->l_lid, 255 ksi.ksi_signo = SIGBUS;
257 l->l_cred ? 256 ksi.ksi_code = BUS_ADRERR;
258 kauth_cred_geteuid(l->l_cred) : -1); 257 break;
 258 case EACCES:
 259 ksi.ksi_signo = SIGSEGV;
 260 ksi.ksi_code = SEGV_ACCERR;
 261 break;
 262 case ENOMEM:
259 ksi.ksi_signo = SIGKILL; 263 ksi.ksi_signo = SIGKILL;
 264 printf("UVM: pid %d.%d (%s), uid %d killed: "
 265 "out of swap\n", p->p_pid, l->l_lid, p->p_comm,
 266 l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1);
 267 break;
 268 default:
 269 ksi.ksi_signo = SIGSEGV;
 270 ksi.ksi_code = SEGV_MAPERR;
 271 break;
260 } 272 }
261 trapsignal(l, &ksi); 273 trapsignal(l, &ksi);
262 break; 274 break;
263 275
264 case EXC_ITMISS|EXC_USER: 276 case EXC_ITMISS|EXC_USER:
265 case EXC_ISI|EXC_USER: 277 case EXC_ISI|EXC_USER:
266 ftype = VM_PROT_EXECUTE; 278 ftype = VM_PROT_EXECUTE;
267 DBPRINTF(TDB_ALL, 279 DBPRINTF(TDB_ALL,
268 ("trap(EXC_ISI|EXC_USER) at %lx execute fault tf %p\n", 280 ("trap(EXC_ISI|EXC_USER) at %lx execute fault tf %p\n",
269 tf->tf_srr0, tf)); 281 tf->tf_srr0, tf));
270// KASSERT(curpcb->pcb_onfault == NULL); 282// KASSERT(curpcb->pcb_onfault == NULL);
271 rv = uvm_fault(&p->p_vmspace->vm_map, trunc_page(tf->tf_srr0), 283 rv = uvm_fault(&p->p_vmspace->vm_map, trunc_page(tf->tf_srr0),
272 ftype); 284 ftype);
273 if (rv == 0) { 285 if (rv == 0) {
274 break; 286 break;
275 } 287 }
276 KSI_INIT_TRAP(&ksi); 288 KSI_INIT_TRAP(&ksi);
277 ksi.ksi_signo = SIGSEGV; 
278 ksi.ksi_trap = EXC_ISI; 289 ksi.ksi_trap = EXC_ISI;
279 ksi.ksi_addr = (void *)tf->tf_srr0; 290 ksi.ksi_addr = (void *)tf->tf_srr0;
280 ksi.ksi_code = (rv == EACCES ? SEGV_ACCERR : SEGV_MAPERR); 291 goto vm_signal;
281 trapsignal(l, &ksi); 
282 break; 292 break;
283 293
284 case EXC_AST|EXC_USER: 294 case EXC_AST|EXC_USER:
285 cpu_ast(l, curcpu()); 295 cpu_ast(l, curcpu());
286 break; 296 break;
287 297
288 case EXC_ALI|EXC_USER: 298 case EXC_ALI|EXC_USER:
289 if (fix_unaligned(l, tf) != 0) { 299 if (fix_unaligned(l, tf) != 0) {
290 KSI_INIT_TRAP(&ksi); 300 KSI_INIT_TRAP(&ksi);
291 ksi.ksi_signo = SIGBUS; 301 ksi.ksi_signo = SIGBUS;
292 ksi.ksi_trap = EXC_ALI; 302 ksi.ksi_trap = EXC_ALI;
293 ksi.ksi_addr = (void *)tf->tf_dear; 303 ksi.ksi_addr = (void *)tf->tf_dear;
294 trapsignal(l, &ksi); 304 trapsignal(l, &ksi);