[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 08/74] semihosting: Generalize GuestFDFeatureFile
From: |
Richard Henderson |
Subject: |
[PATCH v2 08/74] semihosting: Generalize GuestFDFeatureFile |
Date: |
Tue, 3 May 2022 12:47:37 -0700 |
Rather than hard-coding the buffer from which we deliver data,
pass it in on initialization. This decouples the feature from
ARM semihosting.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/semihosting/guestfd.h | 10 ++++++---
semihosting/arm-compat-semi.c | 39 ++++++++++++++++++-----------------
semihosting/guestfd.c | 8 ++++---
3 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/include/semihosting/guestfd.h b/include/semihosting/guestfd.h
index 5d6e744305..5aa2722cb2 100644
--- a/include/semihosting/guestfd.h
+++ b/include/semihosting/guestfd.h
@@ -15,7 +15,7 @@ typedef enum GuestFDType {
GuestFDUnused = 0,
GuestFDHost = 1,
GuestFDGDB = 2,
- GuestFDFeatureFile = 3,
+ GuestFDStatic = 3,
} GuestFDType;
/*
@@ -26,7 +26,11 @@ typedef struct GuestFD {
GuestFDType type;
union {
int hostfd;
- unsigned featurefile_offset;
+ struct {
+ const uint8_t *data;
+ size_t len;
+ size_t off;
+ } staticfile;
};
} GuestFD;
@@ -35,6 +39,6 @@ void dealloc_guestfd(int guestfd);
GuestFD *get_guestfd(int guestfd);
void associate_guestfd(int guestfd, int hostfd);
-void init_featurefile_guestfd(int guestfd);
+void staticfile_guestfd(int guestfd, const uint8_t *data, size_t len);
#endif /* SEMIHOSTING_GUESTFD_H */
diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
index c092138031..c6bfd4d1ba 100644
--- a/semihosting/arm-compat-semi.c
+++ b/semihosting/arm-compat-semi.c
@@ -553,13 +553,13 @@ static const uint8_t featurefile_data[] = {
SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
};
-static uint32_t featurefile_closefn(CPUState *cs, GuestFD *gf)
+static uint32_t staticfile_closefn(CPUState *cs, GuestFD *gf)
{
/* Nothing to do */
return 0;
}
-static uint32_t featurefile_writefn(CPUState *cs, GuestFD *gf,
+static uint32_t staticfile_writefn(CPUState *cs, GuestFD *gf,
target_ulong buf, uint32_t len)
{
/* This fd can never be open for writing */
@@ -568,7 +568,7 @@ static uint32_t featurefile_writefn(CPUState *cs, GuestFD
*gf,
return set_swi_errno(cs, -1);
}
-static uint32_t featurefile_readfn(CPUState *cs, GuestFD *gf,
+static uint32_t staticfile_readfn(CPUState *cs, GuestFD *gf,
target_ulong buf, uint32_t len)
{
CPUArchState *env = cs->env_ptr;
@@ -582,11 +582,11 @@ static uint32_t featurefile_readfn(CPUState *cs, GuestFD
*gf,
}
for (i = 0; i < len; i++) {
- if (gf->featurefile_offset >= sizeof(featurefile_data)) {
+ if (gf->staticfile.off >= gf->staticfile.len) {
break;
}
- s[i] = featurefile_data[gf->featurefile_offset];
- gf->featurefile_offset++;
+ s[i] = gf->staticfile.data[gf->staticfile.off];
+ gf->staticfile.off++;
}
unlock_user(s, buf, len);
@@ -595,21 +595,21 @@ static uint32_t featurefile_readfn(CPUState *cs, GuestFD
*gf,
return len - i;
}
-static uint32_t featurefile_isattyfn(CPUState *cs, GuestFD *gf)
+static uint32_t staticfile_isattyfn(CPUState *cs, GuestFD *gf)
{
return 0;
}
-static uint32_t featurefile_seekfn(CPUState *cs, GuestFD *gf,
+static uint32_t staticfile_seekfn(CPUState *cs, GuestFD *gf,
target_ulong offset)
{
- gf->featurefile_offset = offset;
+ gf->staticfile.off = offset;
return 0;
}
-static uint32_t featurefile_flenfn(CPUState *cs, GuestFD *gf)
+static uint32_t staticfile_flenfn(CPUState *cs, GuestFD *gf)
{
- return sizeof(featurefile_data);
+ return gf->staticfile.len;
}
typedef struct GuestFDFunctions {
@@ -638,13 +638,13 @@ static const GuestFDFunctions guestfd_fns[] = {
.seekfn = gdb_seekfn,
.flenfn = gdb_flenfn,
},
- [GuestFDFeatureFile] = {
- .closefn = featurefile_closefn,
- .writefn = featurefile_writefn,
- .readfn = featurefile_readfn,
- .isattyfn = featurefile_isattyfn,
- .seekfn = featurefile_seekfn,
- .flenfn = featurefile_flenfn,
+ [GuestFDStatic] = {
+ .closefn = staticfile_closefn,
+ .writefn = staticfile_writefn,
+ .readfn = staticfile_readfn,
+ .isattyfn = staticfile_isattyfn,
+ .seekfn = staticfile_seekfn,
+ .flenfn = staticfile_flenfn,
},
};
@@ -765,7 +765,8 @@ target_ulong do_common_semihosting(CPUState *cs)
errno = EACCES;
return set_swi_errno(cs, -1);
}
- init_featurefile_guestfd(guestfd);
+ staticfile_guestfd(guestfd, featurefile_data,
+ sizeof(featurefile_data));
return guestfd;
}
diff --git a/semihosting/guestfd.c b/semihosting/guestfd.c
index e77265db0f..b6405f5663 100644
--- a/semihosting/guestfd.c
+++ b/semihosting/guestfd.c
@@ -94,13 +94,15 @@ void associate_guestfd(int guestfd, int hostfd)
gf->hostfd = hostfd;
}
-void init_featurefile_guestfd(int guestfd)
+void staticfile_guestfd(int guestfd, const uint8_t *data, size_t len)
{
GuestFD *gf = do_get_guestfd(guestfd);
assert(gf);
- gf->type = GuestFDFeatureFile;
- gf->featurefile_offset = 0;
+ gf->type = GuestFDStatic;
+ gf->staticfile.data = data;
+ gf->staticfile.len = len;
+ gf->staticfile.off = 0;
}
/*
--
2.34.1
- [PATCH v2 03/74] semihosting: Improve condition for config.c and console.c, (continued)
- [PATCH v2 03/74] semihosting: Improve condition for config.c and console.c, Richard Henderson, 2022/05/03
- [PATCH v2 05/74] semihosting: Add target_strlen for softmmu-uaccess.h, Richard Henderson, 2022/05/03
- [PATCH v2 06/74] semihosting: Simplify softmmu_lock_user_string, Richard Henderson, 2022/05/03
- [PATCH v2 07/74] semihosting: Split out guestfd.c, Richard Henderson, 2022/05/03
- [PATCH v2 08/74] semihosting: Generalize GuestFDFeatureFile,
Richard Henderson <=
- [PATCH v2 09/74] semihosting: Return void from do_common_semihosting, Richard Henderson, 2022/05/03
- [PATCH v2 13/74] include/exec: Move gdb_stat and gdb_timeval to gdbstub.h, Richard Henderson, 2022/05/03
- [PATCH v2 10/74] semihosting: Adjust error checking in common_semi_cb, Richard Henderson, 2022/05/03
- [PATCH v2 12/74] include/exec: Move gdb open flags to gdbstub.h, Richard Henderson, 2022/05/03
- [PATCH v2 14/74] include/exec: Define errno values in gdbstub.h, Richard Henderson, 2022/05/03
- [PATCH v2 15/74] semihosting: Use struct gdb_stat in common_semi_flen_cb, Richard Henderson, 2022/05/03
- [PATCH v2 17/74] semihosting: Split common_semi_flen_buf per target, Richard Henderson, 2022/05/03