Message ID | 20220607204557.658541-36-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | semihosting cleanup | expand |
On 13:45 Tue 07 Jun , Richard Henderson wrote: > Split out the non-ARM specific portions of SYS_REMOVE to a > reusable function. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Luc Michel <lmichel@kalray.eu> > --- > include/semihosting/syscalls.h | 3 +++ > semihosting/arm-compat-semi.c | 13 +---------- > semihosting/syscalls.c | 40 ++++++++++++++++++++++++++++++++++ > 3 files changed, 44 insertions(+), 12 deletions(-) > > diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h > index 1ae5ba6716..748a4b5e47 100644 > --- a/include/semihosting/syscalls.h > +++ b/include/semihosting/syscalls.h > @@ -49,4 +49,7 @@ void semihost_sys_flen(CPUState *cs, gdb_syscall_complete_cb fstat_cb, > gdb_syscall_complete_cb flen_cb, > int fd, target_ulong fstat_addr); > > +void semihost_sys_remove(CPUState *cs, gdb_syscall_complete_cb complete, > + target_ulong fname, target_ulong fname_len); > + > #endif /* SEMIHOSTING_SYSCALLS_H */ > diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c > index 81dd22e1c5..6c9d50176a 100644 > --- a/semihosting/arm-compat-semi.c > +++ b/semihosting/arm-compat-semi.c > @@ -483,18 +483,7 @@ void do_common_semihosting(CPUState *cs) > case TARGET_SYS_REMOVE: > GET_ARG(0); > GET_ARG(1); > - if (use_gdb_syscalls()) { > - gdb_do_syscall(common_semi_cb, "unlink,%s", > - arg0, (int)arg1 + 1); > - break; > - } > - s = lock_user_string(arg0); > - if (!s) { > - goto do_fault; > - } > - ret = remove(s); > - unlock_user(s, arg0, 0); > - common_semi_cb(cs, ret, ret ? errno : 0); > + semihost_sys_remove(cs, common_semi_cb, arg0, arg1 + 1); > break; > > case TARGET_SYS_RENAME: > diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c > index fff9550c89..5ec4e8f827 100644 > --- a/semihosting/syscalls.c > +++ b/semihosting/syscalls.c > @@ -133,6 +133,18 @@ static void gdb_fstat(CPUState *cs, gdb_syscall_complete_cb complete, > gdb_do_syscall(complete, "fstat,%x,%x", (target_ulong)gf->hostfd, addr); > } > > +static void gdb_remove(CPUState *cs, gdb_syscall_complete_cb complete, > + target_ulong fname, target_ulong fname_len) > +{ > + int len = validate_strlen(cs, fname, fname_len); > + if (len < 0) { > + complete(cs, -1, -len); > + return; > + } > + > + gdb_do_syscall(complete, "unlink,%s", fname, len); > +} > + > /* > * Host semihosting syscall implementations. > */ > @@ -277,6 +289,24 @@ static void host_flen(CPUState *cs, gdb_syscall_complete_cb complete, > } > } > > +static void host_remove(CPUState *cs, gdb_syscall_complete_cb complete, > + target_ulong fname, target_ulong fname_len) > +{ > + CPUArchState *env G_GNUC_UNUSED = cs->env_ptr; > + char *p; > + int ret; > + > + ret = validate_lock_user_string(&p, cs, fname, fname_len); > + if (ret < 0) { > + complete(cs, -1, -ret); > + return; > + } > + > + ret = remove(p); > + complete(cs, ret, ret ? errno : 0); > + unlock_user(p, fname, 0); > +} > + > /* > * Static file semihosting syscall implementations. > */ > @@ -522,3 +552,13 @@ void semihost_sys_flen(CPUState *cs, gdb_syscall_complete_cb fstat_cb, > g_assert_not_reached(); > } > } > + > +void semihost_sys_remove(CPUState *cs, gdb_syscall_complete_cb complete, > + target_ulong fname, target_ulong fname_len) > +{ > + if (use_gdb_syscalls()) { > + gdb_remove(cs, complete, fname, fname_len); > + } else { > + host_remove(cs, complete, fname, fname_len); > + } > +} > -- > 2.34.1 > > > > > To declare a filtering error, please use the following link : https://www.security-mail.net/reporter.php?mid=56f7.629fcfdf.1710e.0&r=lmichel%40kalrayinc.com&s=qemu-devel-bounces%2Blmichel%3Dkalrayinc.com%40nongnu.org&o=%5BPATCH+v4+35%2F53%5D+semihosting%3A+Split+out+semihost_sys_remove&verdict=C&c=39cfc6ff2d269a1766ae8f34c5c705eca3f8a07e > --
diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h index 1ae5ba6716..748a4b5e47 100644 --- a/include/semihosting/syscalls.h +++ b/include/semihosting/syscalls.h @@ -49,4 +49,7 @@ void semihost_sys_flen(CPUState *cs, gdb_syscall_complete_cb fstat_cb, gdb_syscall_complete_cb flen_cb, int fd, target_ulong fstat_addr); +void semihost_sys_remove(CPUState *cs, gdb_syscall_complete_cb complete, + target_ulong fname, target_ulong fname_len); + #endif /* SEMIHOSTING_SYSCALLS_H */ diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c index 81dd22e1c5..6c9d50176a 100644 --- a/semihosting/arm-compat-semi.c +++ b/semihosting/arm-compat-semi.c @@ -483,18 +483,7 @@ void do_common_semihosting(CPUState *cs) case TARGET_SYS_REMOVE: GET_ARG(0); GET_ARG(1); - if (use_gdb_syscalls()) { - gdb_do_syscall(common_semi_cb, "unlink,%s", - arg0, (int)arg1 + 1); - break; - } - s = lock_user_string(arg0); - if (!s) { - goto do_fault; - } - ret = remove(s); - unlock_user(s, arg0, 0); - common_semi_cb(cs, ret, ret ? errno : 0); + semihost_sys_remove(cs, common_semi_cb, arg0, arg1 + 1); break; case TARGET_SYS_RENAME: diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c index fff9550c89..5ec4e8f827 100644 --- a/semihosting/syscalls.c +++ b/semihosting/syscalls.c @@ -133,6 +133,18 @@ static void gdb_fstat(CPUState *cs, gdb_syscall_complete_cb complete, gdb_do_syscall(complete, "fstat,%x,%x", (target_ulong)gf->hostfd, addr); } +static void gdb_remove(CPUState *cs, gdb_syscall_complete_cb complete, + target_ulong fname, target_ulong fname_len) +{ + int len = validate_strlen(cs, fname, fname_len); + if (len < 0) { + complete(cs, -1, -len); + return; + } + + gdb_do_syscall(complete, "unlink,%s", fname, len); +} + /* * Host semihosting syscall implementations. */ @@ -277,6 +289,24 @@ static void host_flen(CPUState *cs, gdb_syscall_complete_cb complete, } } +static void host_remove(CPUState *cs, gdb_syscall_complete_cb complete, + target_ulong fname, target_ulong fname_len) +{ + CPUArchState *env G_GNUC_UNUSED = cs->env_ptr; + char *p; + int ret; + + ret = validate_lock_user_string(&p, cs, fname, fname_len); + if (ret < 0) { + complete(cs, -1, -ret); + return; + } + + ret = remove(p); + complete(cs, ret, ret ? errno : 0); + unlock_user(p, fname, 0); +} + /* * Static file semihosting syscall implementations. */ @@ -522,3 +552,13 @@ void semihost_sys_flen(CPUState *cs, gdb_syscall_complete_cb fstat_cb, g_assert_not_reached(); } } + +void semihost_sys_remove(CPUState *cs, gdb_syscall_complete_cb complete, + target_ulong fname, target_ulong fname_len) +{ + if (use_gdb_syscalls()) { + gdb_remove(cs, complete, fname, fname_len); + } else { + host_remove(cs, complete, fname, fname_len); + } +}
Split out the non-ARM specific portions of SYS_REMOVE to a reusable function. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/semihosting/syscalls.h | 3 +++ semihosting/arm-compat-semi.c | 13 +---------- semihosting/syscalls.c | 40 ++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 12 deletions(-)