Fix the ABI change of the signal delivered on the access to the page
with insufficient protection mode. For the i386 and amd64, create the tunable, machdep.prot_fault_translation, with the following behaviour: 0 = autodetect the signal to be delivered on KERN_PROTECTION_FAILURE from vm_fault based on the ELF OSABI note: no note or __FreeBSD_version < 700004 - SIGBUS/BUS_PAGE_FAULT note, and __FreeBSD_version >= 700004 - SIGSEGV/SEGV_ACCERR 1 = always SIGBUS/BUS_PAGE_FAULT 2 = always SIGSEGV/SEGV_ACCERR This would do mostly automatic correction of ABI breakage, with the exception of the untaged binaries for 7-CURRENT/RELENG_7 before the note is fixed. For them, sysctl would allow to run the binary with manual settings. Discussed with: portmgr (kris) PR: kern/118304 MFC after: 3 days
This commit is contained in:
parent
f231de478e
commit
d24031dd0c
@ -144,6 +144,9 @@ SYSCTL_INT(_machdep, OID_AUTO, kdb_on_nmi, CTLFLAG_RW,
|
||||
static int panic_on_nmi = 1;
|
||||
SYSCTL_INT(_machdep, OID_AUTO, panic_on_nmi, CTLFLAG_RW,
|
||||
&panic_on_nmi, 0, "Panic on NMI");
|
||||
static int prot_fault_translation = 0;
|
||||
SYSCTL_INT(_machdep, OID_AUTO, prot_fault_translation, CTLFLAG_RW,
|
||||
&prot_fault_translation, 0, "Select signal to deliver on protection fault");
|
||||
|
||||
extern char *syscallnames[];
|
||||
|
||||
@ -312,8 +315,32 @@ trap(struct trapframe *frame)
|
||||
if (i == SIGSEGV)
|
||||
ucode = SEGV_MAPERR;
|
||||
else {
|
||||
i = SIGSEGV; /* XXX hack */
|
||||
if (prot_fault_translation == 0) {
|
||||
/*
|
||||
* Autodetect.
|
||||
* This check also covers the images
|
||||
* without the ABI-tag ELF note.
|
||||
*/
|
||||
if (p->p_osrel >= 700004) {
|
||||
i = SIGSEGV;
|
||||
ucode = SEGV_ACCERR;
|
||||
} else {
|
||||
i = SIGBUS;
|
||||
ucode = BUS_PAGE_FAULT;
|
||||
}
|
||||
} else if (prot_fault_translation == 1) {
|
||||
/*
|
||||
* Always compat mode.
|
||||
*/
|
||||
i = SIGBUS;
|
||||
ucode = BUS_PAGE_FAULT;
|
||||
} else {
|
||||
/*
|
||||
* Always SIGSEGV mode.
|
||||
*/
|
||||
i = SIGSEGV;
|
||||
ucode = SEGV_ACCERR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -158,6 +158,9 @@ SYSCTL_INT(_machdep, OID_AUTO, kdb_on_nmi, CTLFLAG_RW,
|
||||
static int panic_on_nmi = 1;
|
||||
SYSCTL_INT(_machdep, OID_AUTO, panic_on_nmi, CTLFLAG_RW,
|
||||
&panic_on_nmi, 0, "Panic on NMI");
|
||||
static int prot_fault_translation = 0;
|
||||
SYSCTL_INT(_machdep, OID_AUTO, prot_fault_translation, CTLFLAG_RW,
|
||||
&prot_fault_translation, 0, "Select signal to deliver on protection fault");
|
||||
|
||||
extern char *syscallnames[];
|
||||
|
||||
@ -375,8 +378,32 @@ trap(struct trapframe *frame)
|
||||
if (i == SIGSEGV)
|
||||
ucode = SEGV_MAPERR;
|
||||
else {
|
||||
i = SIGSEGV; /* XXX hack */
|
||||
if (prot_fault_translation == 0) {
|
||||
/*
|
||||
* Autodetect.
|
||||
* This check also covers the images
|
||||
* without the ABI-tag ELF note.
|
||||
*/
|
||||
if (p->p_osrel >= 700004) {
|
||||
i = SIGSEGV;
|
||||
ucode = SEGV_ACCERR;
|
||||
} else {
|
||||
i = SIGBUS;
|
||||
ucode = BUS_PAGE_FAULT;
|
||||
}
|
||||
} else if (prot_fault_translation == 1) {
|
||||
/*
|
||||
* Always compat mode.
|
||||
*/
|
||||
i = SIGBUS;
|
||||
ucode = BUS_PAGE_FAULT;
|
||||
} else {
|
||||
/*
|
||||
* Always SIGSEGV mode.
|
||||
*/
|
||||
i = SIGSEGV;
|
||||
ucode = SEGV_ACCERR;
|
||||
}
|
||||
}
|
||||
addr = eva;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user