mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
semihosting: enable chardev backed output for console
It will be useful for a number of use-cases to be able to re-direct output to a file like we do with serial output. This does the wiring to allow us to treat then semihosting console like just another character output device. Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
parent
a331c6d774
commit
4e7f9032cf
6 changed files with 51 additions and 3 deletions
|
@ -23,6 +23,7 @@
|
|||
#include "qemu/config-file.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/semihosting/semihost.h"
|
||||
#include "chardev/char.h"
|
||||
|
||||
QemuOptsList qemu_semihosting_config_opts = {
|
||||
.name = "semihosting-config",
|
||||
|
@ -35,6 +36,9 @@ QemuOptsList qemu_semihosting_config_opts = {
|
|||
}, {
|
||||
.name = "target",
|
||||
.type = QEMU_OPT_STRING,
|
||||
}, {
|
||||
.name = "chardev",
|
||||
.type = QEMU_OPT_STRING,
|
||||
}, {
|
||||
.name = "arg",
|
||||
.type = QEMU_OPT_STRING,
|
||||
|
@ -46,12 +50,14 @@ QemuOptsList qemu_semihosting_config_opts = {
|
|||
typedef struct SemihostingConfig {
|
||||
bool enabled;
|
||||
SemihostingTarget target;
|
||||
Chardev *chardev;
|
||||
const char **argv;
|
||||
int argc;
|
||||
const char *cmdline; /* concatenated argv */
|
||||
} SemihostingConfig;
|
||||
|
||||
static SemihostingConfig semihosting;
|
||||
static const char *semihost_chardev;
|
||||
|
||||
bool semihosting_enabled(void)
|
||||
{
|
||||
|
@ -115,6 +121,11 @@ 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;
|
||||
|
@ -132,6 +143,8 @@ int qemu_semihosting_config_options(const char *optarg)
|
|||
semihosting.enabled = qemu_opt_get_bool(opts, "enable",
|
||||
true);
|
||||
const char *target = qemu_opt_get(opts, "target");
|
||||
/* setup of chardev is deferred until they are initialised */
|
||||
semihost_chardev = qemu_opt_get(opts, "chardev");
|
||||
if (target != NULL) {
|
||||
if (strcmp("native", target) == 0) {
|
||||
semihosting.target = SEMIHOSTING_TARGET_NATIVE;
|
||||
|
@ -158,3 +171,16 @@ 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 */
|
||||
if (semihost_chardev) {
|
||||
Chardev *chr = qemu_chr_find(semihost_chardev);
|
||||
if (chr == NULL) {
|
||||
error_report("semihosting chardev '%s' not found",
|
||||
semihost_chardev);
|
||||
exit(1);
|
||||
}
|
||||
semihosting.chardev = chr;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue