Skip to content

Commit c905929

Browse files
committed
Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
Pull ARM fixes from Russell King: "Just two fixes: wire up the new system calls added during the last merge window, and fix another user access site" * 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm: ARM: alignment: fix alignment handling for uaccess changes ARM: wire up new syscalls
2 parents 685b5f1 + 274e91b commit c905929

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

arch/arm/include/asm/unistd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* This may need to be greater than __NR_last_syscall+1 in order to
2020
* account for the padding in the syscall table
2121
*/
22-
#define __NR_syscalls (388)
22+
#define __NR_syscalls (392)
2323

2424
/*
2525
* *NOTE*: This is a ghost syscall private to the kernel. Only the

arch/arm/include/uapi/asm/unistd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,8 @@
414414
#define __NR_memfd_create (__NR_SYSCALL_BASE+385)
415415
#define __NR_bpf (__NR_SYSCALL_BASE+386)
416416
#define __NR_execveat (__NR_SYSCALL_BASE+387)
417+
#define __NR_userfaultfd (__NR_SYSCALL_BASE+388)
418+
#define __NR_membarrier (__NR_SYSCALL_BASE+389)
417419

418420
/*
419421
* The following SWIs are ARM private.

arch/arm/kernel/calls.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,8 @@
397397
/* 385 */ CALL(sys_memfd_create)
398398
CALL(sys_bpf)
399399
CALL(sys_execveat)
400+
CALL(sys_userfaultfd)
401+
CALL(sys_membarrier)
400402
#ifndef syscalls_counted
401403
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
402404
#define syscalls_counted

arch/arm/mm/alignment.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,15 +365,21 @@ do_alignment_ldrhstrh(unsigned long addr, unsigned long instr, struct pt_regs *r
365365
user:
366366
if (LDST_L_BIT(instr)) {
367367
unsigned long val;
368+
unsigned int __ua_flags = uaccess_save_and_enable();
369+
368370
get16t_unaligned_check(val, addr);
371+
uaccess_restore(__ua_flags);
369372

370373
/* signed half-word? */
371374
if (instr & 0x40)
372375
val = (signed long)((signed short) val);
373376

374377
regs->uregs[rd] = val;
375-
} else
378+
} else {
379+
unsigned int __ua_flags = uaccess_save_and_enable();
376380
put16t_unaligned_check(regs->uregs[rd], addr);
381+
uaccess_restore(__ua_flags);
382+
}
377383

378384
return TYPE_LDST;
379385

@@ -420,14 +426,21 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
420426

421427
user:
422428
if (load) {
423-
unsigned long val;
429+
unsigned long val, val2;
430+
unsigned int __ua_flags = uaccess_save_and_enable();
431+
424432
get32t_unaligned_check(val, addr);
433+
get32t_unaligned_check(val2, addr + 4);
434+
435+
uaccess_restore(__ua_flags);
436+
425437
regs->uregs[rd] = val;
426-
get32t_unaligned_check(val, addr + 4);
427-
regs->uregs[rd2] = val;
438+
regs->uregs[rd2] = val2;
428439
} else {
440+
unsigned int __ua_flags = uaccess_save_and_enable();
429441
put32t_unaligned_check(regs->uregs[rd], addr);
430442
put32t_unaligned_check(regs->uregs[rd2], addr + 4);
443+
uaccess_restore(__ua_flags);
431444
}
432445

433446
return TYPE_LDST;
@@ -458,10 +471,15 @@ do_alignment_ldrstr(unsigned long addr, unsigned long instr, struct pt_regs *reg
458471
trans:
459472
if (LDST_L_BIT(instr)) {
460473
unsigned int val;
474+
unsigned int __ua_flags = uaccess_save_and_enable();
461475
get32t_unaligned_check(val, addr);
476+
uaccess_restore(__ua_flags);
462477
regs->uregs[rd] = val;
463-
} else
478+
} else {
479+
unsigned int __ua_flags = uaccess_save_and_enable();
464480
put32t_unaligned_check(regs->uregs[rd], addr);
481+
uaccess_restore(__ua_flags);
482+
}
465483
return TYPE_LDST;
466484

467485
fault:
@@ -531,6 +549,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
531549
#endif
532550

533551
if (user_mode(regs)) {
552+
unsigned int __ua_flags = uaccess_save_and_enable();
534553
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
535554
regbits >>= 1, rd += 1)
536555
if (regbits & 1) {
@@ -542,6 +561,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
542561
put32t_unaligned_check(regs->uregs[rd], eaddr);
543562
eaddr += 4;
544563
}
564+
uaccess_restore(__ua_flags);
545565
} else {
546566
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
547567
regbits >>= 1, rd += 1)

0 commit comments

Comments
 (0)