Merge branch 'fixes' into next
Merge our fixes branch, primarily to bring in the ebb selftests build fix and the pkey fix, which is a dependency for some future work.
This commit is contained in:
commit
ef9f7cfaa5
|
@ -213,7 +213,7 @@ request buffers are not in memory. The operating system handles the fault by
|
||||||
updating CSB with the following data:
|
updating CSB with the following data:
|
||||||
|
|
||||||
csb.flags = CSB_V;
|
csb.flags = CSB_V;
|
||||||
csb.cc = CSB_CC_TRANSLATION;
|
csb.cc = CSB_CC_FAULT_ADDRESS;
|
||||||
csb.ce = CSB_CE_TERMINATION;
|
csb.ce = CSB_CE_TERMINATION;
|
||||||
csb.address = fault_address;
|
csb.address = fault_address;
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,8 @@ struct coprocessor_completion_block {
|
||||||
#define CSB_CC_CHAIN (37)
|
#define CSB_CC_CHAIN (37)
|
||||||
#define CSB_CC_SEQUENCE (38)
|
#define CSB_CC_SEQUENCE (38)
|
||||||
#define CSB_CC_HW (39)
|
#define CSB_CC_HW (39)
|
||||||
|
/* P9 DD2 NX Workbook 3.2 (Table 4-36): Address translation fault */
|
||||||
|
#define CSB_CC_FAULT_ADDRESS (250)
|
||||||
|
|
||||||
#define CSB_SIZE (0x10)
|
#define CSB_SIZE (0x10)
|
||||||
#define CSB_ALIGN CSB_SIZE
|
#define CSB_ALIGN CSB_SIZE
|
||||||
|
|
|
@ -2551,7 +2551,7 @@ EXC_VIRT_NONE(0x5400, 0x100)
|
||||||
INT_DEFINE_BEGIN(denorm_exception)
|
INT_DEFINE_BEGIN(denorm_exception)
|
||||||
IVEC=0x1500
|
IVEC=0x1500
|
||||||
IHSRR=1
|
IHSRR=1
|
||||||
IBRANCH_COMMON=0
|
IBRANCH_TO_COMMON=0
|
||||||
IKVM_REAL=1
|
IKVM_REAL=1
|
||||||
INT_DEFINE_END(denorm_exception)
|
INT_DEFINE_END(denorm_exception)
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ static void *__init alloc_shared_lppaca(unsigned long size, unsigned long limit,
|
||||||
* This is very early in boot, so no harm done if the kernel crashes at
|
* This is very early in boot, so no harm done if the kernel crashes at
|
||||||
* this point.
|
* this point.
|
||||||
*/
|
*/
|
||||||
BUG_ON(shared_lppaca_size >= shared_lppaca_total_size);
|
BUG_ON(shared_lppaca_size > shared_lppaca_total_size);
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,8 @@ unsigned long __kvmhv_copy_tofrom_guest_radix(int lpid, int pid,
|
||||||
/* Can't access quadrants 1 or 2 in non-HV mode, call the HV to do it */
|
/* Can't access quadrants 1 or 2 in non-HV mode, call the HV to do it */
|
||||||
if (kvmhv_on_pseries())
|
if (kvmhv_on_pseries())
|
||||||
return plpar_hcall_norets(H_COPY_TOFROM_GUEST, lpid, pid, eaddr,
|
return plpar_hcall_norets(H_COPY_TOFROM_GUEST, lpid, pid, eaddr,
|
||||||
__pa(to), __pa(from), n);
|
(to != NULL) ? __pa(to): 0,
|
||||||
|
(from != NULL) ? __pa(from): 0, n);
|
||||||
|
|
||||||
quadrant = 1;
|
quadrant = 1;
|
||||||
if (!pid)
|
if (!pid)
|
||||||
|
|
|
@ -353,16 +353,15 @@ static bool pkey_access_permitted(int pkey, bool write, bool execute)
|
||||||
int pkey_shift;
|
int pkey_shift;
|
||||||
u64 amr;
|
u64 amr;
|
||||||
|
|
||||||
if (!is_pkey_enabled(pkey))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
pkey_shift = pkeyshift(pkey);
|
pkey_shift = pkeyshift(pkey);
|
||||||
if (execute && !(read_iamr() & (IAMR_EX_BIT << pkey_shift)))
|
if (execute)
|
||||||
return true;
|
return !(read_iamr() & (IAMR_EX_BIT << pkey_shift));
|
||||||
|
|
||||||
amr = read_amr(); /* Delay reading amr until absolutely needed */
|
amr = read_amr();
|
||||||
return ((!write && !(amr & (AMR_RD_BIT << pkey_shift))) ||
|
if (write)
|
||||||
(write && !(amr & (AMR_WR_BIT << pkey_shift))));
|
return !(amr & (AMR_WR_BIT << pkey_shift));
|
||||||
|
|
||||||
|
return !(amr & (AMR_RD_BIT << pkey_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/libfdt.h>
|
#include <linux/libfdt.h>
|
||||||
#include <linux/crash_core.h>
|
#include <linux/crash_core.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
#include <asm/kdump.h>
|
#include <asm/kdump.h>
|
||||||
|
|
|
@ -79,7 +79,7 @@ static void update_csb(struct vas_window *window,
|
||||||
csb_addr = (void __user *)be64_to_cpu(crb->csb_addr);
|
csb_addr = (void __user *)be64_to_cpu(crb->csb_addr);
|
||||||
|
|
||||||
memset(&csb, 0, sizeof(csb));
|
memset(&csb, 0, sizeof(csb));
|
||||||
csb.cc = CSB_CC_TRANSLATION;
|
csb.cc = CSB_CC_FAULT_ADDRESS;
|
||||||
csb.ce = CSB_CE_TERMINATION;
|
csb.ce = CSB_CE_TERMINATION;
|
||||||
csb.cs = 0;
|
csb.cs = 0;
|
||||||
csb.count = 0;
|
csb.count = 0;
|
||||||
|
|
|
@ -698,13 +698,13 @@ restart_nx:
|
||||||
|
|
||||||
switch (cc) {
|
switch (cc) {
|
||||||
|
|
||||||
case ERR_NX_TRANSLATION:
|
case ERR_NX_AT_FAULT:
|
||||||
|
|
||||||
/* We touched the pages ahead of time. In the most common case
|
/* We touched the pages ahead of time. In the most common case
|
||||||
* we shouldn't be here. But may be some pages were paged out.
|
* we shouldn't be here. But may be some pages were paged out.
|
||||||
* Kernel should have placed the faulting address to fsaddr.
|
* Kernel should have placed the faulting address to fsaddr.
|
||||||
*/
|
*/
|
||||||
NXPRT(fprintf(stderr, "ERR_NX_TRANSLATION %p\n",
|
NXPRT(fprintf(stderr, "ERR_NX_AT_FAULT %p\n",
|
||||||
(void *)cmdp->crb.csb.fsaddr));
|
(void *)cmdp->crb.csb.fsaddr));
|
||||||
|
|
||||||
if (pgfault_retries == NX_MAX_FAULTS) {
|
if (pgfault_retries == NX_MAX_FAULTS) {
|
||||||
|
|
|
@ -306,13 +306,13 @@ int compress_file(int argc, char **argv, void *handle)
|
||||||
lzcounts, cmdp, handle);
|
lzcounts, cmdp, handle);
|
||||||
|
|
||||||
if (cc != ERR_NX_OK && cc != ERR_NX_TPBC_GT_SPBC &&
|
if (cc != ERR_NX_OK && cc != ERR_NX_TPBC_GT_SPBC &&
|
||||||
cc != ERR_NX_TRANSLATION) {
|
cc != ERR_NX_AT_FAULT) {
|
||||||
fprintf(stderr, "nx error: cc= %d\n", cc);
|
fprintf(stderr, "nx error: cc= %d\n", cc);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Page faults are handled by the user code */
|
/* Page faults are handled by the user code */
|
||||||
if (cc == ERR_NX_TRANSLATION) {
|
if (cc == ERR_NX_AT_FAULT) {
|
||||||
NXPRT(fprintf(stderr, "page fault: cc= %d, ", cc));
|
NXPRT(fprintf(stderr, "page fault: cc= %d, ", cc));
|
||||||
NXPRT(fprintf(stderr, "try= %d, fsa= %08llx\n",
|
NXPRT(fprintf(stderr, "try= %d, fsa= %08llx\n",
|
||||||
fault_tries,
|
fault_tries,
|
||||||
|
|
|
@ -7,7 +7,7 @@ noarg:
|
||||||
# The EBB handler is 64-bit code and everything links against it
|
# The EBB handler is 64-bit code and everything links against it
|
||||||
CFLAGS += -m64
|
CFLAGS += -m64
|
||||||
|
|
||||||
TMPOUT = $(OUTPUT)/
|
TMPOUT = $(OUTPUT)/TMPDIR/
|
||||||
# Toolchains may build PIE by default which breaks the assembly
|
# Toolchains may build PIE by default which breaks the assembly
|
||||||
no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
|
no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
|
||||||
$(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie)
|
$(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie)
|
||||||
|
|
Loading…
Reference in New Issue