mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
arm64 fixes for -rc4
- Fix hypercall arguments when resetting EL2 vectors during hibernation
- Fix hibernation with 52-bit capable kernels on machines without
52-bit addressing, similarly to the recent kexec fix
- Fix a bunch of clumsy codegen issues with our per-cpu accessors
- Fix MTE ptrace documentation to reflect the de-facto ABI behaviour
- Fix pthread_join() usage in MTE selftest
- Fix port selection in the Arm CMN PMU driver
-----BEGIN PGP SIGNATURE-----
iQFEBAABCgAuFiEEPxTL6PPUbjXGY88ct6xw3ITBYzQFAmqtMZ4QHHdpbGxAa2Vy
bmVsLm9yZwAKCRC3rHDchMFjNNujB/4pa4pdivXRMOH39HSDu+8i3KlREGpTA9dq
LJvwUjlgoIw0d8/b5sMSAxJi8RA29IENJPqrU97eBBLKgC2gq1oMwjOaHNTV8XUj
gal9hwuZcfO5NIJi61TkyLxn++ysVYXD3J0tbhSXbqz2oeg/jxwj9SsFfQux34GY
GeGb2cWvEXznLgN0h+vZiNh6+FsQRN+dizpiHKLh+wpbZ/vIzuVTQEo6w/+BEUWg
R4YQlvpj/2yAC0BBdPb9gALUWFbjea6zpX5gM5/PgLoqW0CIJvGXahZ7T5kDoXBT
Xp5zsKvcC8dxM5nCJIJ7xRPg75v97toYrrl2AoNQN9bgOynQAI5k
=j0NQ
-----END PGP SIGNATURE-----
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Will Deacon:
"In this batch we've got a couple of hibernation fixes, a couple of
minor MTE fixes, some per-cpu codegen fixes (which were found as part
of Mark's series adding preemptible this_cpu_*() operations) and a fix
for the Arm CMN PMU driver.
Summary:
- Fix hypercall arguments when resetting EL2 vectors during
hibernation
- Fix hibernation with 52-bit capable kernels on machines without
52-bit addressing, similarly to the recent kexec fix
- Fix a bunch of clumsy codegen issues with our per-cpu accessors
- Fix MTE ptrace documentation to reflect the de-facto ABI behaviour
- Fix pthread_join() usage in MTE selftest
- Fix port selection in the Arm CMN PMU driver"
* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
arm64: mte: Fix PTRACE_{PEEK,POKE}MTETAGS error documentation
kselftest/arm64: Fix size of thread_data values for pthread_join()
arm64: percpu: Fix LSE operations on {8,16}-bit types
arm64: percpu: Fix this_cpu_and() mask generation
arm64: percpu: Fix this_cpu_write() casting
arm64: hibernate: clone only the linear map that exists at runtime
perf/arm-cmn: Fix wp_dev_sel2 setting for multi-DTM configurations
arm64: hibernate: pass HVC_SET_VECTORS args to the resume hvc
This commit is contained in:
commit
a077be4fde
|
|
@ -208,11 +208,10 @@ will use the corresponding aligned address.
|
|||
tracer's space cannot be accessed or does not have valid tags.
|
||||
- ``-EPERM`` - the specified process cannot be traced.
|
||||
- ``-EIO`` - the tracee's address range cannot be accessed (e.g. invalid
|
||||
address) and no tags copied. ``iov_len`` not updated.
|
||||
address) or does not have valid tags (not mapped with the ``PROT_MTE``
|
||||
flag) and no tags copied. ``iov_len`` not updated.
|
||||
- ``-EFAULT`` - fault on accessing the tracer's memory (``struct iovec``
|
||||
or ``iov_base`` buffer) and no tags copied. ``iov_len`` not updated.
|
||||
- ``-EOPNOTSUPP`` - the tracee's address does not have valid tags (never
|
||||
mapped with the ``PROT_MTE`` flag). ``iov_len`` not updated.
|
||||
|
||||
**Note**: There are no transient errors for the requests above, so user
|
||||
programs should not retry in case of a non-zero system call return.
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ __percpu_##name##_case_##sz(void *ptr, unsigned long val) \
|
|||
" stxr" #sfx "\t%w[loop], %" #w "[tmp], %[ptr]\n" \
|
||||
" cbnz %w[loop], 1b", \
|
||||
/* LSE atomics */ \
|
||||
#op_lse "\t%" #w "[val], %" #w "[tmp], %[ptr]\n" \
|
||||
#op_lse #sfx "\t%" #w "[val], %" #w "[tmp], %[ptr]\n" \
|
||||
__nops(3)) \
|
||||
: [loop] "=&r" (loop), [tmp] "=&r" (tmp), \
|
||||
[ptr] "+Q"(*(u##sz *)ptr) \
|
||||
|
|
@ -98,7 +98,7 @@ __percpu_##name##_return_case_##sz(void *ptr, unsigned long val) \
|
|||
" stxr" #sfx "\t%w[loop], %" #w "[ret], %[ptr]\n" \
|
||||
" cbnz %w[loop], 1b", \
|
||||
/* LSE atomics */ \
|
||||
#op_lse "\t%" #w "[val], %" #w "[ret], %[ptr]\n" \
|
||||
#op_lse #sfx "\t%" #w "[val], %" #w "[ret], %[ptr]\n" \
|
||||
#op_llsc "\t%" #w "[ret], %" #w "[ret], %" #w "[val]\n" \
|
||||
__nops(2)) \
|
||||
: [loop] "=&r" (loop), [ret] "=&r" (ret), \
|
||||
|
|
@ -179,13 +179,13 @@ PERCPU_RET_OP(add, add, ldadd)
|
|||
_pcp_protect_return(__percpu_read_64, pcp)
|
||||
|
||||
#define this_cpu_write_1(pcp, val) \
|
||||
_pcp_protect(__percpu_write_8, pcp, (unsigned long)val)
|
||||
_pcp_protect(__percpu_write_8, pcp, (unsigned long)(val))
|
||||
#define this_cpu_write_2(pcp, val) \
|
||||
_pcp_protect(__percpu_write_16, pcp, (unsigned long)val)
|
||||
_pcp_protect(__percpu_write_16, pcp, (unsigned long)(val))
|
||||
#define this_cpu_write_4(pcp, val) \
|
||||
_pcp_protect(__percpu_write_32, pcp, (unsigned long)val)
|
||||
_pcp_protect(__percpu_write_32, pcp, (unsigned long)(val))
|
||||
#define this_cpu_write_8(pcp, val) \
|
||||
_pcp_protect(__percpu_write_64, pcp, (unsigned long)val)
|
||||
_pcp_protect(__percpu_write_64, pcp, (unsigned long)(val))
|
||||
|
||||
#define this_cpu_add_1(pcp, val) \
|
||||
_pcp_protect(__percpu_add_case_8, pcp, val)
|
||||
|
|
@ -206,13 +206,13 @@ PERCPU_RET_OP(add, add, ldadd)
|
|||
_pcp_protect_return(__percpu_add_return_case_64, pcp, val)
|
||||
|
||||
#define this_cpu_and_1(pcp, val) \
|
||||
_pcp_protect(__percpu_andnot_case_8, pcp, ~val)
|
||||
_pcp_protect(__percpu_andnot_case_8, pcp, ~(u8)(val))
|
||||
#define this_cpu_and_2(pcp, val) \
|
||||
_pcp_protect(__percpu_andnot_case_16, pcp, ~val)
|
||||
_pcp_protect(__percpu_andnot_case_16, pcp, ~(u16)(val))
|
||||
#define this_cpu_and_4(pcp, val) \
|
||||
_pcp_protect(__percpu_andnot_case_32, pcp, ~val)
|
||||
_pcp_protect(__percpu_andnot_case_32, pcp, ~(u32)(val))
|
||||
#define this_cpu_and_8(pcp, val) \
|
||||
_pcp_protect(__percpu_andnot_case_64, pcp, ~val)
|
||||
_pcp_protect(__percpu_andnot_case_64, pcp, ~(u64)(val))
|
||||
|
||||
#define this_cpu_or_1(pcp, val) \
|
||||
_pcp_protect(__percpu_or_case_8, pcp, val)
|
||||
|
|
|
|||
|
|
@ -89,6 +89,8 @@ alternative_insn "dc cvau, x4", "dc civac, x4", ARM64_WORKAROUND_CLEAN_CACHE
|
|||
isb
|
||||
|
||||
cbz x24, 3f /* Do we need to re-initialise EL2? */
|
||||
mov x1, x24
|
||||
mov x0, #HVC_SET_VECTORS
|
||||
hvc #0
|
||||
3: ret
|
||||
SYM_CODE_END(swsusp_arch_suspend_exit)
|
||||
|
|
|
|||
|
|
@ -423,8 +423,8 @@ int __nocfi swsusp_arch_resume(void)
|
|||
* Create a second copy of just the linear map, and use this when
|
||||
* restoring.
|
||||
*/
|
||||
rc = trans_pgd_create_copy(&trans_info, &tmp_pg_dir, PAGE_OFFSET,
|
||||
PAGE_END);
|
||||
rc = trans_pgd_create_copy(&trans_info, &tmp_pg_dir,
|
||||
_PAGE_OFFSET(vabits_actual), PAGE_END);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
|
|
|||
|
|
@ -476,7 +476,7 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
|
|||
* was never mapped with PROT_MTE.
|
||||
*/
|
||||
if (!(vma->vm_flags & VM_MTE)) {
|
||||
err = -EOPNOTSUPP;
|
||||
err = -EIO;
|
||||
put_page(page);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1582,13 +1582,14 @@ static void arm_cmn_claim_wp_idx(struct arm_cmn_dtm *dtm,
|
|||
|
||||
static u32 arm_cmn_wp_config(struct perf_event *event, int wp_idx)
|
||||
{
|
||||
struct arm_cmn *cmn = to_cmn(event->pmu);
|
||||
u32 config;
|
||||
u32 dev = CMN_EVENT_WP_DEV_SEL(event);
|
||||
u32 chn = CMN_EVENT_WP_CHN_SEL(event);
|
||||
u32 grp = CMN_EVENT_WP_GRP(event);
|
||||
u32 exc = CMN_EVENT_WP_EXCLUSIVE(event);
|
||||
u32 combine = CMN_EVENT_WP_COMBINE(event);
|
||||
bool is_cmn600 = to_cmn(event->pmu)->part == PART_CMN600;
|
||||
bool is_cmn600 = cmn->part == PART_CMN600;
|
||||
|
||||
/* CMN-600 supports only primary and secondary matching groups */
|
||||
if (is_cmn600)
|
||||
|
|
@ -1596,8 +1597,11 @@ static u32 arm_cmn_wp_config(struct perf_event *event, int wp_idx)
|
|||
|
||||
config = FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_DEV_SEL, dev) |
|
||||
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_CHN_SEL, chn) |
|
||||
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_GRP, grp) |
|
||||
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_DEV_SEL2, dev >> 1);
|
||||
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_GRP, grp);
|
||||
|
||||
if (!cmn->multi_dtm)
|
||||
config |= FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_DEV_SEL2, dev >> 1);
|
||||
|
||||
if (exc)
|
||||
config |= is_cmn600 ? CMN600_WPn_CONFIG_WP_EXCLUSIVE :
|
||||
CMN_DTM_WPn_CONFIG_WP_EXCLUSIVE;
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ void *execute_thread(void *x)
|
|||
int execute_test(pid_t pid)
|
||||
{
|
||||
pthread_t thread_id[MAX_THREADS];
|
||||
int thread_data[MAX_THREADS];
|
||||
intptr_t thread_data[MAX_THREADS];
|
||||
|
||||
for (int i = 0; i < MAX_THREADS; i++)
|
||||
pthread_create(&thread_id[i], NULL,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user