On Wed, Oct 23, 2024 at 12:53:47PM +1100, Michael Ellerman wrote: > "虞陆铭" <luming...@shingroup.cn> writes: > >>Le 12/10/2024 à 05:56, Luming Yu a écrit : > >>> convert powerpc entry code in syscall and fault to use syscall_work > >>> and irqentry_state as well as common calls implemented in generic > >>> entry infrastructure. > >>> > >>> Signed-off-by: Luming Yu <luming...@shingroup.cn> > >>> --- > >>> arch/powerpc/Kconfig | 1 + > >>> arch/powerpc/include/asm/hw_irq.h | 5 +++++ > >>> arch/powerpc/include/asm/processor.h | 6 ++++++ > >>> arch/powerpc/include/asm/syscall.h | 5 +++++ > >>> arch/powerpc/include/asm/thread_info.h | 1 + > >>> arch/powerpc/kernel/syscall.c | 5 ++++- > >>> arch/powerpc/mm/fault.c | 3 +++ > >>> 7 files changed, 25 insertions(+), 1 deletion(-) > >>> > >> > >>... > >> > >>> diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c > >>> index 77fedb190c93..e0338bd8d383 100644 > >>> --- a/arch/powerpc/kernel/syscall.c > >>> +++ b/arch/powerpc/kernel/syscall.c > >>> @@ -3,6 +3,7 @@ > >>> #include <linux/compat.h> > >>> #include <linux/context_tracking.h> > >>> #include <linux/randomize_kstack.h> > >>> +#include <linux/entry-common.h> > >>> > >>> #include <asm/interrupt.h> > >>> #include <asm/kup.h> > >>> @@ -131,7 +132,7 @@ notrace long system_call_exception(struct pt_regs > >>> *regs, unsigned long r0) > >>> * and the test against NR_syscalls will fail and the > >>> return > >>> * value to be used is in regs->gpr[3]. > >>> */ > >>> - r0 = do_syscall_trace_enter(regs); > >>> + r0 = syscall_enter_from_user_mode(regs, r0); > >> > >>Can you provide details on how this works ? > > I assume the common entry would take over th details. > > So I just made the switch from the high level call. > > > As you said as the subtle ABI requirement about regs->r3 needs to > > be restored, I'm wondering which test can capture the lost > > ABI feature. As simple Boot test is insufficient, what is the test set > > that can capture it? > > The seccomp selftest did exercise it back when I originally wrote that > code. I don't know for sure that it still does, but that would be a good > start. > > It's in tools/testing/selftests/seccomp/ Thanks for the hint. It seems to be running into some not ok cases the way hits the bpf test that doesn't return. I will re-run with the same kernel w/o the patch-set to sort out the cases that could be caused by the patch Then I will try to debug out the root cause. [root@10 seccomp]# make -C tools/testing/selftests TARGETS=seccomp run_tests make: Entering directory '/root/linux-ci/tools/testing/selftests/seccomp' make: *** tools/testing/selftests: No such file or directory. Stop. make: Leaving directory '/root/linux-ci/tools/testing/selftests/seccomp' [root@10 seccomp]# pwd /root/linux-ci/tools/testing/selftests/seccomp [root@10 seccomp]# cd /root/linux-ci/ [root@10 linux-ci]# make -C tools/testing/selftests TARGETS=seccomp run_tests make: Entering directory '/root/linux-ci/tools/testing/selftests' make[1]: Nothing to be done for 'all'. TAP version 13 1..2 # timeout set to 180 # selftests: seccomp: seccomp_bpf # TAP version 13 # 1..98 # # Starting 98 tests from 8 test cases. # # RUN global.kcmp ... # # OK global.kcmp # ok 1 global.kcmp # # RUN global.mode_strict_support ... # # OK global.mode_strict_support # ok 2 global.mode_strict_support # # RUN global.mode_strict_cannot_call_prctl ... # # seccomp_bpf.c:359:mode_strict_cannot_call_prctl:Expected 0 (0) == true (1) # # seccomp_bpf.c:360:mode_strict_cannot_call_prctl:Unreachable! # # mode_strict_cannot_call_prctl: Test exited normally instead of by signal (code: 1) # # FAIL global.mode_strict_cannot_call_prctl # not ok 3 global.mode_strict_cannot_call_prctl # # RUN global.no_new_privs_support ... # # OK global.no_new_privs_support # ok 4 global.no_new_privs_support # # RUN global.mode_filter_support ... # # OK global.mode_filter_support # ok 5 global.mode_filter_support # # RUN global.mode_filter_without_nnp ... # # OK global.mode_filter_without_nnp # ok 6 global.mode_filter_without_nnp # # RUN global.filter_size_limits ... # # OK global.filter_size_limits # ok 7 global.filter_size_limits # # RUN global.filter_chain_limits ... # # OK global.filter_chain_limits # ok 8 global.filter_chain_limits # # RUN global.mode_filter_cannot_move_to_strict ... # # OK global.mode_filter_cannot_move_to_strict # ok 9 global.mode_filter_cannot_move_to_strict # # RUN global.mode_filter_get_seccomp ... # # OK global.mode_filter_get_seccomp # ok 10 global.mode_filter_get_seccomp # # RUN global.ALLOW_all ... # # OK global.ALLOW_all # ok 11 global.ALLOW_all # # RUN global.empty_prog ... # # OK global.empty_prog # ok 12 global.empty_prog # # RUN global.log_all ... # # OK global.log_all # ok 13 global.log_all # # RUN global.unknown_ret_is_kill_inside ... # # seccomp_bpf.c:621:unknown_ret_is_kill_inside:Expected 0 (0) == syscall(__NR_getpid) (1406) # # seccomp_bpf.c:622:unknown_ret_is_kill_inside:getpid() shouldn't ever return # # unknown_ret_is_kill_inside: Test exited normally instead of by signal (code: 1) # # FAIL global.unknown_ret_is_kill_inside # not ok 14 global.unknown_ret_is_kill_inside # # RUN global.unknown_ret_is_kill_above_allow ... # # seccomp_bpf.c:643:unknown_ret_is_kill_above_allow:Expected 0 (0) == syscall(__NR_getpid) (1407) # # seccomp_bpf.c:644:unknown_ret_is_kill_above_allow:getpid() shouldn't ever return # # unknown_ret_is_kill_above_allow: Test exited normally instead of by signal (code: 1) # # FAIL global.unknown_ret_is_kill_above_allow # not ok 15 global.unknown_ret_is_kill_above_allow # # RUN global.KILL_all ... # # KILL_all: Test exited normally instead of by signal (code: 0) # # FAIL global.KILL_all # not ok 16 global.KILL_all # # RUN global.KILL_one ... # # seccomp_bpf.c:690:KILL_one:Expected 0 (0) == syscall(__NR_getpid) (1409) # # KILL_one: Test exited normally instead of by signal (code: 1) # # FAIL global.KILL_one # not ok 17 global.KILL_one # # RUN global.KILL_one_arg_one ... # # seccomp_bpf.c:726:KILL_one_arg_one:Expected 0 (0) == syscall(__NR_times, &fatal_address) (4295224651) # # KILL_one_arg_one: Test exited normally instead of by signal (code: 1) # # FAIL global.KILL_one_arg_one # not ok 18 global.KILL_one_arg_one # # RUN global.KILL_one_arg_six ... # # KILL_one_arg_six: Test exited normally instead of by signal (code: 0) # # FAIL global.KILL_one_arg_six # not ok 19 global.KILL_one_arg_six # # RUN global.KILL_thread ... # # seccomp_bpf.c:856:KILL_thread:Expected SIBLING_EXIT_FAILURE (195951310) != (unsigned long)status (195951310) # # seccomp_bpf.c:881:KILL_thread:Expected 0 (0) != WIFEXITED(status) (0) # # KILL_thread: Test terminated by assertion # # FAIL global.KILL_thread # not ok 20 global.KILL_thread # # RUN global.KILL_process ... # # seccomp_bpf.c:856:KILL_process:Expected SIBLING_EXIT_FAILURE (195951310) != (unsigned long)status (195951310) # # seccomp_bpf.c:901:KILL_process:Expected SIGSYS (31) == WTERMSIG(status) (6) # # KILL_process: Test terminated by assertion # # FAIL global.KILL_process # not ok 21 global.KILL_process # # RUN global.KILL_unknown ... # # seccomp_bpf.c:856:KILL_unknown:Expected SIBLING_EXIT_FAILURE (195951310) != (unsigned long)status (195951310) # # seccomp_bpf.c:922:KILL_unknown:Expected SIGSYS (31) == WTERMSIG(status) (6) # # KILL_unknown: Test terminated by assertion # # FAIL global.KILL_unknown # not ok 22 global.KILL_unknown # # RUN global.arg_out_of_range ... # # OK global.arg_out_of_range # ok 23 global.arg_out_of_range # # RUN global.ERRNO_valid ... # # seccomp_bpf.c:974:ERRNO_valid:Expected E2BIG (7) == errno (9) # # ERRNO_valid: Test failed # # FAIL global.ERRNO_valid # not ok 24 global.ERRNO_valid # # RUN global.ERRNO_zero ... # # seccomp_bpf.c:992:ERRNO_zero:Expected 0 (0) == read(-1, NULL, 0) (-1) # # ERRNO_zero: Test failed # # FAIL global.ERRNO_zero # not ok 25 global.ERRNO_zero # # RUN global.ERRNO_capped ... # # seccomp_bpf.c:1014:ERRNO_capped:Expected 4095 (4095) == errno (9) # # ERRNO_capped: Test failed # # FAIL global.ERRNO_capped # not ok 26 global.ERRNO_capped # # RUN global.ERRNO_order ... # # seccomp_bpf.c:1045:ERRNO_order:Expected 12 (12) == errno (9) # # ERRNO_order: Test failed # # FAIL global.ERRNO_order # not ok 27 global.ERRNO_order # # RUN global.negative_ENOSYS ... # # OK global.negative_ENOSYS # ok 28 global.negative_ENOSYS # # RUN global.seccomp_syscall ... # # OK global.seccomp_syscall # ok 29 global.seccomp_syscall # # RUN global.seccomp_syscall_mode_lock ... # # OK global.seccomp_syscall_mode_lock # ok 30 global.seccomp_syscall_mode_lock # # RUN global.detect_seccomp_filter_flags ... # # OK global.detect_seccomp_filter_flags # ok 31 global.detect_seccomp_filter_flags # # RUN global.TSYNC_first ... # # OK global.TSYNC_first # ok 32 global.TSYNC_first # # RUN global.syscall_restart ... # # syscall_restart: Test terminated by timeout # # FAIL global.syscall_restart # not ok 33 global.syscall_restart # # RUN global.filter_flag_log ... # # seccomp_bpf.c:3239:filter_flag_log:Expected 0 (0) == syscall(__NR_getpid) (1482) # # filter_flag_log: Test exited normally instead of by signal (code: 1) # # FAIL global.filter_flag_log # not ok 34 global.filter_flag_log # # RUN global.get_action_avail ... # # OK global.get_action_avail # ok 35 global.get_action_avail # # RUN global.get_metadata ... # # OK global.get_metadata # ok 36 global.get_metadata # # RUN global.user_notification_basic ... # # seccomp_bpf.c:3397:user_notification_basic:Expected 0 (0) == WEXITSTATUS(status) (1) # # user_notification_basic: Test terminated by timeout # # FAIL global.user_notification_basic # not ok 37 global.user_notification_basic # # RUN global.user_notification_with_tsync ... # # OK global.user_notification_with_tsync # ok 38 global.user_notification_with_tsync # # RUN global.user_notification_kill_in_middle ... # # user_notification_kill_in_middle: Test terminated by timeout # # FAIL global.user_notification_kill_in_middle # not ok 39 global.user_notification_kill_in_middle # # RUN global.user_notification_signal ... # # user_notification_signal: Test terminated by timeout # # FAIL global.user_notification_signal # not ok 40 global.user_notification_signal # # RUN global.user_notification_closed_listener ... # # seccomp_bpf.c:3647:user_notification_closed_listener:Expected 0 (0) == WEXITSTATUS(status) (1) # # user_notification_closed_listener: Test failed # # FAIL global.user_notification_closed_listener # not ok 41 global.user_notification_closed_listener # # RUN global.user_notification_child_pid_ns ... # # user_notification_child_pid_ns: Test terminated by timeout # # FAIL global.user_notification_child_pid_ns # not ok 42 global.user_notification_child_pid_ns # # RUN global.user_notification_sibling_pid_ns ... # # seccomp_bpf.c:3728:user_notification_sibling_pid_ns:Expected 0 (0) == WEXITSTATUS(status) (1) # # seccomp_bpf.c:3764:user_notification_sibling_pid_ns:Expected 0 (0) == WEXITSTATUS(status) (1)
> > cheers >