* [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode @ 2023-07-18 16:28 Celeste Liu 2023-07-18 19:35 ` Björn Töpel 0 siblings, 1 reply; 6+ messages in thread From: Celeste Liu @ 2023-07-18 16:28 UTC (permalink / raw) To: Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Celeste Liu, Felix Yan, Ruizhe Pan, Shiqi Zhang When we test seccomp with 6.4 kernel, we found errno has wrong value. If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 prior syscall_enter_from_user_mode()"). After analysing code, we think that regs->a0 = -ENOSYS should be advanced before syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when seccomp rejected this syscall with specified errno, they will set a0 to return number as syscall ABI, and then return -1. This return number is finally pass as return number of syscall_enter_from_user_mode, and then is compared with NR_syscalls after converted to ulong (so it will be ULONG_MAX). The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS is always executable. It covered a0 set by seccomp, so we always get ENOSYS when match seccomp RET_ERRNO rule. Fixes: f0bddf50586d ("riscv: entry: Convert to generic entry") Reported-by: Felix Yan <felixonmars@archlinux.org> Co-developed-by: Ruizhe Pan <c141028@gmail.com> Signed-off-by: Ruizhe Pan <c141028@gmail.com> Co-developed-by: Shiqi Zhang <shiqi@isrc.iscas.ac.cn> Signed-off-by: Shiqi Zhang <shiqi@isrc.iscas.ac.cn> Signed-off-by: Celeste Liu <CoelacanthusHex@gmail.com> Tested-by: Felix Yan <felixonmars@archlinux.org> --- v1 -> v2: added explanation on why always got ENOSYS arch/riscv/kernel/traps.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index f910dfccbf5d2..ccadb5ffd063c 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -301,6 +301,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) regs->epc += 4; regs->orig_a0 = regs->a0; + regs->a0 = -ENOSYS; riscv_v_vstate_discard(regs); @@ -308,8 +309,6 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) if (syscall < NR_syscalls) syscall_handler(regs, syscall); - else - regs->a0 = -ENOSYS; syscall_exit_to_user_mode(regs); } else { -- 2.41.0 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode 2023-07-18 16:28 [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode Celeste Liu @ 2023-07-18 19:35 ` Björn Töpel 2023-07-18 20:35 ` Celeste Liu 0 siblings, 1 reply; 6+ messages in thread From: Björn Töpel @ 2023-07-18 19:35 UTC (permalink / raw) To: Celeste Liu, Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Celeste Liu, Felix Yan, Ruizhe Pan, Shiqi Zhang Celeste Liu <coelacanthushex@gmail.com> writes: > When we test seccomp with 6.4 kernel, we found errno has wrong value. > If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will > get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 > prior syscall_enter_from_user_mode()"). > > After analysing code, we think that regs->a0 = -ENOSYS should be advanced before > syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when > seccomp rejected this syscall with specified errno, they will set a0 to return > number as syscall ABI, and then return -1. This return number is finally pass > as return number of syscall_enter_from_user_mode, and then is compared > with NR_syscalls after converted to ulong (so it will be ULONG_MAX). > The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS > is always executable. It covered a0 set by seccomp, so we always get > ENOSYS when match seccomp RET_ERRNO rule. Isn't something like... diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index f910dfccbf5d..15a8b4898a6c 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) { if (user_mode(regs)) { - ulong syscall = regs->a7; + long syscall = regs->a7; regs->epc += 4; regs->orig_a0 = regs->a0; @@ -306,7 +306,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) syscall = syscall_enter_from_user_mode(regs, syscall); - if (syscall < NR_syscalls) + if (syscall > -1 && syscall < NR_syscalls) syscall_handler(regs, syscall); else regs->a0 = -ENOSYS; ...easier to read? Björn _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode 2023-07-18 19:35 ` Björn Töpel @ 2023-07-18 20:35 ` Celeste Liu 2023-07-18 20:48 ` Celeste Liu 2023-07-18 20:50 ` Björn Töpel 0 siblings, 2 replies; 6+ messages in thread From: Celeste Liu @ 2023-07-18 20:35 UTC (permalink / raw) To: Björn Töpel, Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Felix Yan, Ruizhe Pan, Shiqi Zhang On 2023/7/19 03:35, Björn Töpel wrote: > Celeste Liu <coelacanthushex@gmail.com> writes: > >> When we test seccomp with 6.4 kernel, we found errno has wrong value. >> If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will >> get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 >> prior syscall_enter_from_user_mode()"). >> >> After analysing code, we think that regs->a0 = -ENOSYS should be advanced before >> syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when >> seccomp rejected this syscall with specified errno, they will set a0 to return >> number as syscall ABI, and then return -1. This return number is finally pass >> as return number of syscall_enter_from_user_mode, and then is compared >> with NR_syscalls after converted to ulong (so it will be ULONG_MAX). >> The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS >> is always executable. It covered a0 set by seccomp, so we always get >> ENOSYS when match seccomp RET_ERRNO rule. > > Isn't something like... > > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index f910dfccbf5d..15a8b4898a6c 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) > asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > { > if (user_mode(regs)) { > - ulong syscall = regs->a7; > + long syscall = regs->a7; > > regs->epc += 4; > regs->orig_a0 = regs->a0; > @@ -306,7 +306,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > > syscall = syscall_enter_from_user_mode(regs, syscall); > > - if (syscall < NR_syscalls) > + if (syscall > -1 && syscall < NR_syscalls) > syscall_handler(regs, syscall); > else > regs->a0 = -ENOSYS; > > > ...easier to read? > > > Björn It seems that your change turn it back to the beginning. If syscall == -1, it is supposed to go neither first nor else branch. It should do NOTHING. However it was still a great idea. It may be better to use a set of if-statement to clarify the logic. diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index f910dfccbf5d2..d0bd725244594 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -306,7 +306,9 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) syscall = syscall_enter_from_user_mode(regs, syscall); - if (syscall < NR_syscalls) + if (syscall == -1) + // Do nothing + else if (syscall < NR_syscalls) syscall_handler(regs, syscall); else regs->a0 = -ENOSYS; _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode 2023-07-18 20:35 ` Celeste Liu @ 2023-07-18 20:48 ` Celeste Liu 2023-07-18 20:50 ` Björn Töpel 1 sibling, 0 replies; 6+ messages in thread From: Celeste Liu @ 2023-07-18 20:48 UTC (permalink / raw) To: Björn Töpel, Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Felix Yan, Ruizhe Pan, Shiqi Zhang On 2023/7/19 04:35, Celeste Liu wrote: > > On 2023/7/19 03:35, Björn Töpel wrote: >> Celeste Liu <coelacanthushex@gmail.com> writes: >> >>> When we test seccomp with 6.4 kernel, we found errno has wrong value. >>> If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will >>> get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 >>> prior syscall_enter_from_user_mode()"). >>> >>> After analysing code, we think that regs->a0 = -ENOSYS should be advanced before >>> syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when >>> seccomp rejected this syscall with specified errno, they will set a0 to return >>> number as syscall ABI, and then return -1. This return number is finally pass >>> as return number of syscall_enter_from_user_mode, and then is compared >>> with NR_syscalls after converted to ulong (so it will be ULONG_MAX). >>> The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS >>> is always executable. It covered a0 set by seccomp, so we always get >>> ENOSYS when match seccomp RET_ERRNO rule. >> >> Isn't something like... >> >> diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c >> index f910dfccbf5d..15a8b4898a6c 100644 >> --- a/arch/riscv/kernel/traps.c >> +++ b/arch/riscv/kernel/traps.c >> @@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) >> asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >> { >> if (user_mode(regs)) { >> - ulong syscall = regs->a7; >> + long syscall = regs->a7; >> >> regs->epc += 4; >> regs->orig_a0 = regs->a0; >> @@ -306,7 +306,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >> >> syscall = syscall_enter_from_user_mode(regs, syscall); >> >> - if (syscall < NR_syscalls) >> + if (syscall > -1 && syscall < NR_syscalls) >> syscall_handler(regs, syscall); >> else >> regs->a0 = -ENOSYS; >> >> >> ...easier to read? >> >> >> Björn > > It seems that your change turn it back to the beginning. If syscall == -1, > it is supposed to go neither first nor else branch. It should do NOTHING. > However it was still a great idea. It may be better to use a set of if-statement > to clarify the logic. > > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index f910dfccbf5d2..d0bd725244594 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -306,7 +306,9 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > > syscall = syscall_enter_from_user_mode(regs, syscall); > > - if (syscall < NR_syscalls) > + if (syscall == -1) > + // Do nothing > + else if (syscall < NR_syscalls) > syscall_handler(regs, syscall); > else > regs->a0 = -ENOSYS; > Oh, it's better to reorder to: diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index f910dfccbf5d2..932814e34ac37 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -308,7 +308,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) if (syscall < NR_syscalls) syscall_handler(regs, syscall); - else + else if (syscall != -1) regs->a0 = -ENOSYS; syscall_exit_to_user_mode(regs); I will send v3 later. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode 2023-07-18 20:35 ` Celeste Liu 2023-07-18 20:48 ` Celeste Liu @ 2023-07-18 20:50 ` Björn Töpel 2023-07-18 20:56 ` Celeste Liu 1 sibling, 1 reply; 6+ messages in thread From: Björn Töpel @ 2023-07-18 20:50 UTC (permalink / raw) To: Celeste Liu, Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Felix Yan, Ruizhe Pan, Shiqi Zhang Celeste Liu <coelacanthushex@gmail.com> writes: > On 2023/7/19 03:35, Björn Töpel wrote: >> Celeste Liu <coelacanthushex@gmail.com> writes: >> >>> When we test seccomp with 6.4 kernel, we found errno has wrong value. >>> If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will >>> get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 >>> prior syscall_enter_from_user_mode()"). >>> >>> After analysing code, we think that regs->a0 = -ENOSYS should be advanced before >>> syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when >>> seccomp rejected this syscall with specified errno, they will set a0 to return >>> number as syscall ABI, and then return -1. This return number is finally pass >>> as return number of syscall_enter_from_user_mode, and then is compared >>> with NR_syscalls after converted to ulong (so it will be ULONG_MAX). >>> The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS >>> is always executable. It covered a0 set by seccomp, so we always get >>> ENOSYS when match seccomp RET_ERRNO rule. >> >> Isn't something like... >> >> diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c >> index f910dfccbf5d..15a8b4898a6c 100644 >> --- a/arch/riscv/kernel/traps.c >> +++ b/arch/riscv/kernel/traps.c >> @@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) >> asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >> { >> if (user_mode(regs)) { >> - ulong syscall = regs->a7; >> + long syscall = regs->a7; >> >> regs->epc += 4; >> regs->orig_a0 = regs->a0; >> @@ -306,7 +306,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >> >> syscall = syscall_enter_from_user_mode(regs, syscall); >> >> - if (syscall < NR_syscalls) >> + if (syscall > -1 && syscall < NR_syscalls) >> syscall_handler(regs, syscall); >> else >> regs->a0 = -ENOSYS; >> >> >> ...easier to read? >> >> >> Björn > > It seems that your change turn it back to the beginning. If syscall == -1, > it is supposed to go neither first nor else branch. It should do NOTHING. > However it was still a great idea. It may be better to use a set of if-statement > to clarify the logic. Ah, gotcha! (Notice that arch/x86/entry/common.c has | if (!do_syscall_x64(regs, nr) && !do_syscall_x32(regs, nr) && nr != -1) { and in do_syscall_x64() | /* | * Convert negative numbers to very high and thus out of range | * numbers for comparisons. | */ | unsigned int unr = nr; > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index f910dfccbf5d2..d0bd725244594 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -306,7 +306,9 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > > syscall = syscall_enter_from_user_mode(regs, syscall); > > - if (syscall < NR_syscalls) > + if (syscall == -1) > + // Do nothing > + else if (syscall < NR_syscalls) > syscall_handler(regs, syscall); > else > regs->a0 = -ENOSYS; Maybe something a bit more explicit? diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index f910dfccbf5d..5cef72874542 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -297,6 +297,10 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) { if (user_mode(regs)) { + /* + * Convert negative numbers to very high and thus out of range + * numbers for comparisons. + */ ulong syscall = regs->a7; regs->epc += 4; @@ -308,7 +312,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) if (syscall < NR_syscalls) syscall_handler(regs, syscall); - else + else if ((long)syscall != -1L) regs->a0 = -ENOSYS; syscall_exit_to_user_mode(regs); Björn _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode 2023-07-18 20:50 ` Björn Töpel @ 2023-07-18 20:56 ` Celeste Liu 0 siblings, 0 replies; 6+ messages in thread From: Celeste Liu @ 2023-07-18 20:56 UTC (permalink / raw) To: Björn Töpel, Palmer Dabbelt, Paul Walmsley, Albert Ou, Guo Ren, Björn Töpel, Conor Dooley, linux-riscv Cc: linux-kernel, Felix Yan, Ruizhe Pan, Shiqi Zhang On 2023/7/19 04:50, Björn Töpel wrote: > Celeste Liu <coelacanthushex@gmail.com> writes: > >> On 2023/7/19 03:35, Björn Töpel wrote: >>> Celeste Liu <coelacanthushex@gmail.com> writes: >>> >>>> When we test seccomp with 6.4 kernel, we found errno has wrong value. >>>> If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf50586d, we will >>>> get ENOSYS instead. We got same result with 9c2598d43510 ("riscv: entry: Save a0 >>>> prior syscall_enter_from_user_mode()"). >>>> >>>> After analysing code, we think that regs->a0 = -ENOSYS should be advanced before >>>> syscall_enter_from_user_mode to fix this problem. In __seccomp_filter, when >>>> seccomp rejected this syscall with specified errno, they will set a0 to return >>>> number as syscall ABI, and then return -1. This return number is finally pass >>>> as return number of syscall_enter_from_user_mode, and then is compared >>>> with NR_syscalls after converted to ulong (so it will be ULONG_MAX). >>>> The condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS >>>> is always executable. It covered a0 set by seccomp, so we always get >>>> ENOSYS when match seccomp RET_ERRNO rule. >>> >>> Isn't something like... >>> >>> diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c >>> index f910dfccbf5d..15a8b4898a6c 100644 >>> --- a/arch/riscv/kernel/traps.c >>> +++ b/arch/riscv/kernel/traps.c >>> @@ -297,7 +297,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) >>> asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >>> { >>> if (user_mode(regs)) { >>> - ulong syscall = regs->a7; >>> + long syscall = regs->a7; >>> >>> regs->epc += 4; >>> regs->orig_a0 = regs->a0; >>> @@ -306,7 +306,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >>> >>> syscall = syscall_enter_from_user_mode(regs, syscall); >>> >>> - if (syscall < NR_syscalls) >>> + if (syscall > -1 && syscall < NR_syscalls) >>> syscall_handler(regs, syscall); >>> else >>> regs->a0 = -ENOSYS; >>> >>> >>> ...easier to read? >>> >>> >>> Björn >> >> It seems that your change turn it back to the beginning. If syscall == -1, >> it is supposed to go neither first nor else branch. It should do NOTHING. >> However it was still a great idea. It may be better to use a set of if-statement >> to clarify the logic. > > Ah, gotcha! (Notice that arch/x86/entry/common.c has > > | if (!do_syscall_x64(regs, nr) && !do_syscall_x32(regs, nr) && nr != -1) { > > and in do_syscall_x64() > > | /* > | * Convert negative numbers to very high and thus out of range > | * numbers for comparisons. > | */ > | unsigned int unr = nr; > > >> diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c >> index f910dfccbf5d2..d0bd725244594 100644 >> --- a/arch/riscv/kernel/traps.c >> +++ b/arch/riscv/kernel/traps.c >> @@ -306,7 +306,9 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) >> >> syscall = syscall_enter_from_user_mode(regs, syscall); >> >> - if (syscall < NR_syscalls) >> + if (syscall == -1) >> + // Do nothing >> + else if (syscall < NR_syscalls) >> syscall_handler(regs, syscall); >> else >> regs->a0 = -ENOSYS; > > Maybe something a bit more explicit? > > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index f910dfccbf5d..5cef72874542 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -297,6 +297,10 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) > asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > { > if (user_mode(regs)) { > + /* > + * Convert negative numbers to very high and thus out of range > + * numbers for comparisons. > + */ > ulong syscall = regs->a7; > > regs->epc += 4; > @@ -308,7 +312,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) > > if (syscall < NR_syscalls) > syscall_handler(regs, syscall); > - else > + else if ((long)syscall != -1L) > regs->a0 = -ENOSYS; > > syscall_exit_to_user_mode(regs); > > > Björn Ok, I will send v3. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-07-19 6:57 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-07-18 16:28 [PATCH v2] riscv: entry: set a0 prior to syscall_enter_from_user_mode Celeste Liu 2023-07-18 19:35 ` Björn Töpel 2023-07-18 20:35 ` Celeste Liu 2023-07-18 20:48 ` Celeste Liu 2023-07-18 20:50 ` Björn Töpel 2023-07-18 20:56 ` Celeste Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).