* [Qemu-devel] [PATCH] target/xtensa: fix semihosting argc/argv implementation
@ 2017-03-11 23:01 Max Filippov
0 siblings, 0 replies; only message in thread
From: Max Filippov @ 2017-03-11 23:01 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Filippov
So far xtensa provides fixed dummy argc/argv for the corresponding
semihosting calls. Now that there are semihosting_get_argc and
semihosting_get_arg, use them to pass actual command line arguments
to guest.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
target/xtensa/xtensa-semi.c | 49 +++++++++++++++++++++++++++++++++------------
1 file changed, 36 insertions(+), 13 deletions(-)
diff --git a/target/xtensa/xtensa-semi.c b/target/xtensa/xtensa-semi.c
index 370e365..a888a9d 100644
--- a/target/xtensa/xtensa-semi.c
+++ b/target/xtensa/xtensa-semi.c
@@ -28,6 +28,7 @@
#include "qemu/osdep.h"
#include "cpu.h"
#include "exec/helper-proto.h"
+#include "exec/semihost.h"
#include "qemu/log.h"
enum {
@@ -261,28 +262,50 @@ void HELPER(simcall)(CPUXtensaState *env)
break;
case TARGET_SYS_argc:
- regs[2] = 1;
+ regs[2] = semihosting_get_argc();
regs[3] = 0;
break;
case TARGET_SYS_argv_sz:
- regs[2] = 128;
- regs[3] = 0;
+ {
+ int argc = semihosting_get_argc();
+ int sz = (argc + 1) * sizeof(uint32_t);
+ int i;
+
+ for (i = 0; i < argc; ++i) {
+ sz += 1 + strlen(semihosting_get_arg(i));
+ }
+ regs[2] = sz;
+ regs[3] = 0;
+ }
break;
case TARGET_SYS_argv:
{
- struct Argv {
- uint32_t argptr[2];
- char text[120];
- } argv = {
- {0, 0},
- "test"
- };
-
- argv.argptr[0] = tswap32(regs[3] + offsetof(struct Argv, text));
+ int argc = semihosting_get_argc();
+ int str_offset = (argc + 1) * sizeof(uint32_t);
+ int i;
+ uint32_t argptr;
+
+ for (i = 0; i < argc; ++i) {
+ const char *str = semihosting_get_arg(i);
+ int str_size = strlen(str) + 1;
+
+ argptr = tswap32(regs[3] + str_offset);
+
+ cpu_memory_rw_debug(cs,
+ regs[3] + i * sizeof(uint32_t),
+ (uint8_t *)&argptr, sizeof(argptr), 1);
+ cpu_memory_rw_debug(cs,
+ regs[3] + str_offset,
+ (uint8_t *)str, str_size, 1);
+ str_offset += str_size;
+ }
+ argptr = 0;
cpu_memory_rw_debug(cs,
- regs[3], (uint8_t *)&argv, sizeof(argv), 1);
+ regs[3] + i * sizeof(uint32_t),
+ (uint8_t *)&argptr, sizeof(argptr), 1);
+ regs[3] = 0;
}
break;
--
2.1.4
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2017-03-11 23:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-11 23:01 [Qemu-devel] [PATCH] target/xtensa: fix semihosting argc/argv implementation Max Filippov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).