summaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-09-16 15:15:40 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-10-15 18:09:03 +0100
commit45e88ffc7633d0e8fefaf72e5ceab37a4e35a2d8 (patch)
treed860ff578dce0518960fd19746ad1e63c3ff6578 /target
parent0213fa452f5076c256fa2b23eefcd79caea347f1 (diff)
downloadqemu-45e88ffc7633d0e8fefaf72e5ceab37a4e35a2d8.zip
target/arm/arm-semi: Factor out implementation of SYS_SEEK
Factor out the implementation of SYS_SEEK via the new function tables. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20190916141544.17540-12-peter.maydell@linaro.org
Diffstat (limited to 'target')
-rw-r--r--target/arm/arm-semi.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
index ecd51338fd..b5e1d73eb8 100644
--- a/target/arm/arm-semi.c
+++ b/target/arm/arm-semi.c
@@ -389,6 +389,8 @@ typedef uint32_t sys_writefn(ARMCPU *cpu, GuestFD *gf,
typedef uint32_t sys_readfn(ARMCPU *cpu, GuestFD *gf,
target_ulong buf, uint32_t len);
typedef uint32_t sys_isattyfn(ARMCPU *cpu, GuestFD *gf);
+typedef uint32_t sys_seekfn(ARMCPU *cpu, GuestFD *gf,
+ target_ulong offset);
static uint32_t host_closefn(ARMCPU *cpu, GuestFD *gf)
{
@@ -442,6 +444,16 @@ static uint32_t host_isattyfn(ARMCPU *cpu, GuestFD *gf)
return isatty(gf->hostfd);
}
+static uint32_t host_seekfn(ARMCPU *cpu, GuestFD *gf, target_ulong offset)
+{
+ CPUARMState *env = &cpu->env;
+ uint32_t ret = set_swi_errno(env, lseek(gf->hostfd, offset, SEEK_SET));
+ if (ret == (uint32_t)-1) {
+ return -1;
+ }
+ return 0;
+}
+
static uint32_t gdb_closefn(ARMCPU *cpu, GuestFD *gf)
{
return arm_gdb_syscall(cpu, arm_semi_cb, "close,%x", gf->hostfd);
@@ -468,11 +480,18 @@ static uint32_t gdb_isattyfn(ARMCPU *cpu, GuestFD *gf)
return arm_gdb_syscall(cpu, arm_semi_cb, "isatty,%x", gf->hostfd);
}
+static uint32_t gdb_seekfn(ARMCPU *cpu, GuestFD *gf, target_ulong offset)
+{
+ return arm_gdb_syscall(cpu, arm_semi_cb, "lseek,%x,%x,0",
+ gf->hostfd, offset);
+}
+
typedef struct GuestFDFunctions {
sys_closefn *closefn;
sys_writefn *writefn;
sys_readfn *readfn;
sys_isattyfn *isattyfn;
+ sys_seekfn *seekfn;
} GuestFDFunctions;
static const GuestFDFunctions guestfd_fns[] = {
@@ -481,12 +500,14 @@ static const GuestFDFunctions guestfd_fns[] = {
.writefn = host_writefn,
.readfn = host_readfn,
.isattyfn = host_isattyfn,
+ .seekfn = host_seekfn,
},
[GuestFDGDB] = {
.closefn = gdb_closefn,
.writefn = gdb_writefn,
.readfn = gdb_readfn,
.isattyfn = gdb_isattyfn,
+ .seekfn = gdb_seekfn,
},
};
@@ -656,15 +677,7 @@ target_ulong do_arm_semihosting(CPUARMState *env)
return set_swi_errno(env, -1);
}
- if (use_gdb_syscalls()) {
- return arm_gdb_syscall(cpu, arm_semi_cb, "lseek,%x,%x,0",
- gf->hostfd, arg1);
- } else {
- ret = set_swi_errno(env, lseek(gf->hostfd, arg1, SEEK_SET));
- if (ret == (uint32_t)-1)
- return -1;
- return 0;
- }
+ return guestfd_fns[gf->type].seekfn(cpu, gf, arg1);
case TARGET_SYS_FLEN:
GET_ARG(0);