summaryrefslogtreecommitdiffstats
path: root/semihosting
diff options
context:
space:
mode:
authorRichard Henderson2022-05-02 01:59:06 +0200
committerRichard Henderson2022-06-28 01:05:52 +0200
commitfb08790b35174a98301ecbac4d5234d0cbfebea0 (patch)
tree7c817d8d4bd0cef02987c9d21c9e7f2a5b6cc914 /semihosting
parentsemihosting: Expand qemu_semihosting_console_inc to read (diff)
downloadqemu-fb08790b35174a98301ecbac4d5234d0cbfebea0.tar.gz
qemu-fb08790b35174a98301ecbac4d5234d0cbfebea0.tar.xz
qemu-fb08790b35174a98301ecbac4d5234d0cbfebea0.zip
semihosting: Cleanup chardev init
Rename qemu_semihosting_connect_chardevs to qemu_semihosting_chardev_init; pass the result directly to qemu_semihosting_console_init. Store the chardev in SemihostingConsole instead of SemihostingConfig, which lets us drop semihosting_get_chardev. Reviewed-by: Luc Michel <lmichel@kalray.eu> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'semihosting')
-rw-r--r--semihosting/config.c17
-rw-r--r--semihosting/console.c31
2 files changed, 22 insertions, 26 deletions
diff --git a/semihosting/config.c b/semihosting/config.c
index 3afacf54ab..e171d4d6bc 100644
--- a/semihosting/config.c
+++ b/semihosting/config.c
@@ -51,7 +51,6 @@ QemuOptsList qemu_semihosting_config_opts = {
typedef struct SemihostingConfig {
bool enabled;
SemihostingTarget target;
- Chardev *chardev;
char **argv;
int argc;
const char *cmdline; /* concatenated argv */
@@ -122,11 +121,6 @@ void semihosting_arg_fallback(const char *file, const char *cmd)
}
}
-Chardev *semihosting_get_chardev(void)
-{
- return semihosting.chardev;
-}
-
void qemu_semihosting_enable(void)
{
semihosting.enabled = true;
@@ -172,16 +166,19 @@ int qemu_semihosting_config_options(const char *optarg)
return 0;
}
-void qemu_semihosting_connect_chardevs(void)
+/* We had to defer this until chardevs were created */
+void qemu_semihosting_chardev_init(void)
{
- /* We had to defer this until chardevs were created */
+ Chardev *chr = NULL;
+
if (semihost_chardev) {
- Chardev *chr = qemu_chr_find(semihost_chardev);
+ chr = qemu_chr_find(semihost_chardev);
if (chr == NULL) {
error_report("semihosting chardev '%s' not found",
semihost_chardev);
exit(1);
}
- semihosting.chardev = chr;
}
+
+ qemu_semihosting_console_init(chr);
}
diff --git a/semihosting/console.c b/semihosting/console.c
index e5ac3f20ba..1d16a290c4 100644
--- a/semihosting/console.c
+++ b/semihosting/console.c
@@ -27,11 +27,21 @@
#include "qapi/error.h"
#include "qemu/fifo8.h"
+/* Access to this structure is protected by the BQL */
+typedef struct SemihostingConsole {
+ CharBackend backend;
+ Chardev *chr;
+ GSList *sleeping_cpus;
+ bool got;
+ Fifo8 fifo;
+} SemihostingConsole;
+
+static SemihostingConsole console;
+
int qemu_semihosting_log_out(const char *s, int len)
{
- Chardev *chardev = semihosting_get_chardev();
- if (chardev) {
- return qemu_chr_write_all(chardev, (uint8_t *) s, len);
+ if (console.chr) {
+ return qemu_chr_write_all(console.chr, (uint8_t *) s, len);
} else {
return write(STDERR_FILENO, s, len);
}
@@ -106,16 +116,6 @@ void qemu_semihosting_console_outc(CPUArchState *env, target_ulong addr)
#define FIFO_SIZE 1024
-/* Access to this structure is protected by the BQL */
-typedef struct SemihostingConsole {
- CharBackend backend;
- GSList *sleeping_cpus;
- bool got;
- Fifo8 fifo;
-} SemihostingConsole;
-
-static SemihostingConsole console;
-
static int console_can_read(void *opaque)
{
SemihostingConsole *c = opaque;
@@ -169,10 +169,9 @@ int qemu_semihosting_console_read(CPUState *cs, void *buf, int len)
return ret;
}
-void qemu_semihosting_console_init(void)
+void qemu_semihosting_console_init(Chardev *chr)
{
- Chardev *chr = semihosting_get_chardev();
-
+ console.chr = chr;
if (chr) {
fifo8_create(&console.fifo, FIFO_SIZE);
qemu_chr_fe_init(&console.backend, chr, &error_abort);