Message ID | 20220521000400.454525-11-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | semihosting cleanup | expand |
Richard Henderson <richard.henderson@linaro.org> writes: > Do not read from the gdb struct stat buffer if the callback is > reporting an error. Use common_semi_cb to finish returning results. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > semihosting/arm-compat-semi.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c > index 88e1c286ba..8792180974 100644 > --- a/semihosting/arm-compat-semi.c > +++ b/semihosting/arm-compat-semi.c > @@ -346,15 +346,17 @@ static target_ulong common_semi_flen_buf(CPUState *cs) > static void > common_semi_flen_cb(CPUState *cs, target_ulong ret, target_ulong err) > { > - /* The size is always stored in big-endian order, extract > - the value. We assume the size always fit in 32 bits. */ > - uint32_t size; > - cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, > - (uint8_t *)&size, 4, 0); > - size = be32_to_cpu(size); > - common_semi_set_ret(cs, size); > - errno = err; > - set_swi_errno(cs, -1); > + if (!err) { > + /* > + * The size is always stored in big-endian order, extract > + * the value. We assume the size always fit in 32 bits. > + */ > + uint32_t size; > + cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, > + (uint8_t *)&size, 4, 0); I did a double take but compared to the actual code it calls I guess its fine. Technically I think: cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, (void *) &size, sizeof(size), 0); might be slightly cleaner but whatever: Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > + ret = be32_to_cpu(size); > + } > + common_semi_cb(cs, ret, err); > } > > static int common_semi_open_guestfd;
diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c index 88e1c286ba..8792180974 100644 --- a/semihosting/arm-compat-semi.c +++ b/semihosting/arm-compat-semi.c @@ -346,15 +346,17 @@ static target_ulong common_semi_flen_buf(CPUState *cs) static void common_semi_flen_cb(CPUState *cs, target_ulong ret, target_ulong err) { - /* The size is always stored in big-endian order, extract - the value. We assume the size always fit in 32 bits. */ - uint32_t size; - cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, - (uint8_t *)&size, 4, 0); - size = be32_to_cpu(size); - common_semi_set_ret(cs, size); - errno = err; - set_swi_errno(cs, -1); + if (!err) { + /* + * The size is always stored in big-endian order, extract + * the value. We assume the size always fit in 32 bits. + */ + uint32_t size; + cpu_memory_rw_debug(cs, common_semi_flen_buf(cs) + 32, + (uint8_t *)&size, 4, 0); + ret = be32_to_cpu(size); + } + common_semi_cb(cs, ret, err); } static int common_semi_open_guestfd;
Do not read from the gdb struct stat buffer if the callback is reporting an error. Use common_semi_cb to finish returning results. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- semihosting/arm-compat-semi.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)