[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 07/11] target/mips: Avoid qemu_semihosting_log_out for UHI_plo
From: |
Richard Henderson |
Subject: |
[PATCH v4 07/11] target/mips: Avoid qemu_semihosting_log_out for UHI_plog |
Date: |
Tue, 7 Jun 2022 22:19:41 -0700 |
Use semihost_sys_write and/or qemu_semihosting_console_write
for implementing plog. When using gdbstub, copy the temp
string below the stack so that gdb has a guest address from
which to perform the log.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/mips/tcg/sysemu/mips-semi.c | 52 +++++++++++++++++++++++-------
1 file changed, 41 insertions(+), 11 deletions(-)
diff --git a/target/mips/tcg/sysemu/mips-semi.c
b/target/mips/tcg/sysemu/mips-semi.c
index 5b78cf21a7..ad11a46820 100644
--- a/target/mips/tcg/sysemu/mips-semi.c
+++ b/target/mips/tcg/sysemu/mips-semi.c
@@ -310,20 +310,50 @@ void mips_semihosting(CPUMIPSState *env)
}
gpr[2] = copy_argn_to_target(env, gpr[4], gpr[5]);
break;
+
case UHI_plog:
- GET_TARGET_STRING(p, gpr[4]);
- p2 = strstr(p, "%d");
- if (p2) {
- int char_num = p2 - p;
- GString *s = g_string_new_len(p, char_num);
- g_string_append_printf(s, "%d%s", (int)gpr[5], p2 + 2);
- gpr[2] = qemu_semihosting_log_out(s->str, s->len);
- g_string_free(s, true);
- } else {
- gpr[2] = qemu_semihosting_log_out(p, strlen(p));
+ {
+ target_ulong addr = gpr[4];
+ ssize_t len = target_strlen(addr);
+ GString *str;
+ char *pct_d;
+
+ if (len < 0) {
+ report_fault(env);
+ }
+ p = lock_user(VERIFY_READ, addr, len, 1);
+ if (!p) {
+ report_fault(env);
+ }
+
+ pct_d = strstr(p, "%d");
+ if (!pct_d) {
+ FREE_TARGET_STRING(p, addr);
+ semihost_sys_write(cs, uhi_cb, 2, addr, len);
+ break;
+ }
+
+ str = g_string_new_len(p, pct_d - p);
+ g_string_append_printf(str, "%d%s", (int)gpr[5], pct_d + 2);
+ FREE_TARGET_STRING(p, addr);
+
+ /*
+ * When we're using gdb, we need a guest address, so
+ * drop the string onto the stack below the stack pointer.
+ */
+ if (use_gdb_syscalls()) {
+ addr = gpr[29] - str->len;
+ p = lock_user(VERIFY_WRITE, addr, str->len, 0);
+ memcpy(p, str->str, str->len);
+ unlock_user(p, addr, str->len);
+ semihost_sys_write(cs, uhi_cb, 2, addr, str->len);
+ } else {
+ gpr[2] = qemu_semihosting_console_write(str->str, str->len);
+ }
+ g_string_free(str, true);
}
- FREE_TARGET_STRING(p, gpr[4]);
break;
+
case UHI_assert:
GET_TARGET_STRINGS_2(p, gpr[4], p2, gpr[5]);
printf("assertion '");
--
2.34.1
- Re: [PATCH v4 02/11] target/mips: Add UHI errno values, (continued)
- [PATCH v4 01/11] target/mips: Use an exception for semihosting, Richard Henderson, 2022/06/08
- [PATCH v4 03/11] target/mips: Create report_fault for semihosting, Richard Henderson, 2022/06/08
- [PATCH v4 06/11] target/mips: Use semihosting/syscalls.h, Richard Henderson, 2022/06/08
- [PATCH v4 04/11] target/mips: Drop link syscall from semihosting, Richard Henderson, 2022/06/08
- [PATCH v4 09/11] semihosting: Remove qemu_semihosting_log_out, Richard Henderson, 2022/06/08
- [PATCH v4 07/11] target/mips: Avoid qemu_semihosting_log_out for UHI_plog,
Richard Henderson <=
- [PATCH v4 05/11] target/mips: Drop pread and pwrite syscalls from semihosting, Richard Henderson, 2022/06/08
- [PATCH v4 08/11] target/mips: Use error_report for UHI_assert, Richard Henderson, 2022/06/08
- [PATCH v4 10/11] target/mips: Simplify UHI_argnlen and UHI_argn, Richard Henderson, 2022/06/08
- [PATCH v4 11/11] target/mips: Remove GET_TARGET_STRING and FREE_TARGET_STRING, Richard Henderson, 2022/06/08