Message ID | 20190910144428.32597-11-peter.maydell@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/arm: Implement semihosting v2.0 | expand |
Peter Maydell <peter.maydell@linaro.org> writes: > Factor out the implementation of SYS_FLEN via the new > function tables. > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > --- > target/arm/arm-semi.c | 31 +++++++++++++++++++++---------- > 1 file changed, 21 insertions(+), 10 deletions(-) > > diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c > index c548ce849e7..f9019b00b8d 100644 > --- a/target/arm/arm-semi.c > +++ b/target/arm/arm-semi.c > @@ -352,6 +352,7 @@ typedef uint32_t sys_readfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, > typedef uint32_t sys_isattyfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf); > typedef uint32_t sys_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, > target_ulong offset); > +typedef uint32_t sys_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf); > > static uint32_t host_closefn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) > { > @@ -417,6 +418,16 @@ static uint32_t host_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, > return 0; > } > > +static uint32_t host_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) > +{ > + struct stat buf; > + uint32_t ret = set_swi_errno(ts, fstat(gf->hostfd, &buf)); > + if (ret == (uint32_t)-1) { > + return -1; > + } > + return buf.st_size; > +} > + > static uint32_t gdb_closefn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) > { > return arm_gdb_syscall(cpu, arm_semi_cb, "close,%x", gf->hostfd); > @@ -450,12 +461,19 @@ static uint32_t gdb_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, > gf->hostfd, offset); > } > > +static uint32_t gdb_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) > +{ > + return arm_gdb_syscall(cpu, arm_semi_flen_cb, "fstat,%x,%x", > + gf->hostfd, arm_flen_buf(cpu)); > +} > + > typedef struct GuestFDFunctions { > sys_closefn *closefn; > sys_writefn *writefn; > sys_readfn *readfn; > sys_isattyfn *isattyfn; > sys_seekfn *seekfn; > + sys_flenfn *flenfn; > } GuestFDFunctions; > > static const GuestFDFunctions guestfd_fns[] = { > @@ -465,6 +483,7 @@ static const GuestFDFunctions guestfd_fns[] = { > .readfn = host_readfn, > .isattyfn = host_isattyfn, > .seekfn = host_seekfn, > + .flenfn = host_flenfn, > }, > [GuestFDGDB] = { > .closefn = gdb_closefn, > @@ -472,6 +491,7 @@ static const GuestFDFunctions guestfd_fns[] = { > .readfn = gdb_readfn, > .isattyfn = gdb_isattyfn, > .seekfn = gdb_seekfn, > + .flenfn = gdb_flenfn, > }, > }; > > @@ -657,16 +677,7 @@ target_ulong do_arm_semihosting(CPUARMState *env) > return set_swi_errno(ts, -1); > } > > - if (use_gdb_syscalls()) { > - return arm_gdb_syscall(cpu, arm_semi_flen_cb, "fstat,%x,%x", > - gf->hostfd, arm_flen_buf(cpu)); > - } else { > - struct stat buf; > - ret = set_swi_errno(ts, fstat(gf->hostfd, &buf)); > - if (ret == (uint32_t)-1) > - return -1; > - return buf.st_size; > - } > + return guestfd_fns[gf->type].flenfn(ts, cpu, gf); > case TARGET_SYS_TMPNAM: > qemu_log_mask(LOG_UNIMP, "%s: SYS_TMPNAM not implemented", __func__); > return -1; -- Alex Bennée
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c index c548ce849e7..f9019b00b8d 100644 --- a/target/arm/arm-semi.c +++ b/target/arm/arm-semi.c @@ -352,6 +352,7 @@ typedef uint32_t sys_readfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, typedef uint32_t sys_isattyfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf); typedef uint32_t sys_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, target_ulong offset); +typedef uint32_t sys_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf); static uint32_t host_closefn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) { @@ -417,6 +418,16 @@ static uint32_t host_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, return 0; } +static uint32_t host_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) +{ + struct stat buf; + uint32_t ret = set_swi_errno(ts, fstat(gf->hostfd, &buf)); + if (ret == (uint32_t)-1) { + return -1; + } + return buf.st_size; +} + static uint32_t gdb_closefn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) { return arm_gdb_syscall(cpu, arm_semi_cb, "close,%x", gf->hostfd); @@ -450,12 +461,19 @@ static uint32_t gdb_seekfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf, gf->hostfd, offset); } +static uint32_t gdb_flenfn(TaskState *ts, ARMCPU *cpu, GuestFD *gf) +{ + return arm_gdb_syscall(cpu, arm_semi_flen_cb, "fstat,%x,%x", + gf->hostfd, arm_flen_buf(cpu)); +} + typedef struct GuestFDFunctions { sys_closefn *closefn; sys_writefn *writefn; sys_readfn *readfn; sys_isattyfn *isattyfn; sys_seekfn *seekfn; + sys_flenfn *flenfn; } GuestFDFunctions; static const GuestFDFunctions guestfd_fns[] = { @@ -465,6 +483,7 @@ static const GuestFDFunctions guestfd_fns[] = { .readfn = host_readfn, .isattyfn = host_isattyfn, .seekfn = host_seekfn, + .flenfn = host_flenfn, }, [GuestFDGDB] = { .closefn = gdb_closefn, @@ -472,6 +491,7 @@ static const GuestFDFunctions guestfd_fns[] = { .readfn = gdb_readfn, .isattyfn = gdb_isattyfn, .seekfn = gdb_seekfn, + .flenfn = gdb_flenfn, }, }; @@ -657,16 +677,7 @@ target_ulong do_arm_semihosting(CPUARMState *env) return set_swi_errno(ts, -1); } - if (use_gdb_syscalls()) { - return arm_gdb_syscall(cpu, arm_semi_flen_cb, "fstat,%x,%x", - gf->hostfd, arm_flen_buf(cpu)); - } else { - struct stat buf; - ret = set_swi_errno(ts, fstat(gf->hostfd, &buf)); - if (ret == (uint32_t)-1) - return -1; - return buf.st_size; - } + return guestfd_fns[gf->type].flenfn(ts, cpu, gf); case TARGET_SYS_TMPNAM: qemu_log_mask(LOG_UNIMP, "%s: SYS_TMPNAM not implemented", __func__); return -1;
Factor out the implementation of SYS_FLEN via the new function tables. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- target/arm/arm-semi.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) -- 2.20.1