This patch follows on from the previous patchsets and provides a basic PReP serial console when launched under QEMU with -nographic. This is done by including the PC serial driver as part of the PPC binary build and setting up a prep_console_ops structure for use when PReP architecture is detected.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk CC: Andreas Färber afaerber@suse.de CC: Hervé Poussineau hpoussin@reactos.org --- openbios-devel/arch/ppc/qemu/console.c | 32 +++++++++++++++++++++++++ openbios-devel/arch/ppc/qemu/init.c | 28 ++++++++++++++++------ openbios-devel/arch/ppc/qemu/main.c | 5 +++- openbios-devel/config/examples/ppc_config.xml | 1 + 4 files changed, 58 insertions(+), 8 deletions(-)
diff --git a/openbios-devel/arch/ppc/qemu/console.c b/openbios-devel/arch/ppc/qemu/console.c index 25b21c0..53a3215 100644 --- a/openbios-devel/arch/ppc/qemu/console.c +++ b/openbios-devel/arch/ppc/qemu/console.c @@ -53,4 +53,36 @@ struct _console_ops mac_console_ops = { .getchar = mac_getchar };
+static int prep_putchar(int c) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + uart_putchar(c & 0xff); +#endif + return c; +} + +static int prep_availchar(void) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + if (uart_charav(CONFIG_SERIAL_PORT)) + return 1; +#endif + return 0; +} + +static int prep_getchar(void) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + if (uart_charav(CONFIG_SERIAL_PORT)) + return (uart_getchar(CONFIG_SERIAL_PORT)); +#endif + return 0; +} + +struct _console_ops prep_console_ops = { + .putchar = prep_putchar, + .availchar = prep_availchar, + .getchar = prep_getchar +}; + #endif // CONFIG_DEBUG_CONSOLE diff --git a/openbios-devel/arch/ppc/qemu/init.c b/openbios-devel/arch/ppc/qemu/init.c index 48d39b6..4eb0f0e 100644 --- a/openbios-devel/arch/ppc/qemu/init.c +++ b/openbios-devel/arch/ppc/qemu/init.c @@ -163,7 +163,7 @@ static const pci_arch_t known_arch[] = { }; unsigned long isa_io_base;
-extern struct _console_ops mac_console_ops; +extern struct _console_ops mac_console_ops, prep_console_ops;
void entry(void) @@ -188,7 +188,11 @@ entry(void) isa_io_base = arch->io_base;
#ifdef CONFIG_DEBUG_CONSOLE - init_console(mac_console_ops); + if (is_apple()) { + init_console(mac_console_ops); + } else { + init_console(prep_console_ops); + } #endif
if (temp != 1) { @@ -658,6 +662,11 @@ arch_of_init(void)
ofmem_t *ofmem = ofmem_arch_get_private();
+ if (!is_apple()) { + /* Initialise PReP serial port */ + ob_pc_serial_init("", "serial", arch->io_base, 0x3f8ULL, 0); + } + openbios_init(); modules_init(); setup_timers(); @@ -823,12 +832,17 @@ arch_of_init(void) #endif
if (fw_cfg_read_i16(FW_CFG_NOGRAPHIC)) { - if (CONFIG_SERIAL_PORT) { - stdin_path = "scca"; - stdout_path = "scca"; + if (is_apple()) { + if (CONFIG_SERIAL_PORT) { + stdin_path = "scca"; + stdout_path = "scca"; + } else { + stdin_path = "sccb"; + stdout_path = "sccb"; + } } else { - stdin_path = "sccb"; - stdout_path = "sccb"; + stdin_path = "/serial"; + stdout_path = "/serial"; }
/* Some bootloaders force the output to the screen device, so diff --git a/openbios-devel/arch/ppc/qemu/main.c b/openbios-devel/arch/ppc/qemu/main.c index 30a4375..44b1666 100644 --- a/openbios-devel/arch/ppc/qemu/main.c +++ b/openbios-devel/arch/ppc/qemu/main.c @@ -22,6 +22,7 @@ #include "libc/diskio.h" #include "libc/vsprintf.h" #include "kernel.h" +#include "drivers/drivers.h" #include "libopenbios/ofmem.h" #define NO_QEMU_PROTOS #include "arch/common/fw_cfg.h" @@ -78,5 +79,7 @@ boot( void ) check_preloaded_kernel(); }
- update_nvram(); + if (is_apple()) { + update_nvram(); + } } diff --git a/openbios-devel/config/examples/ppc_config.xml b/openbios-devel/config/examples/ppc_config.xml index 5bb789f..200775d 100644 --- a/openbios-devel/config/examples/ppc_config.xml +++ b/openbios-devel/config/examples/ppc_config.xml @@ -8,6 +8,7 @@ <option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/> <option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/> <option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/> + <option name="CONFIG_DRIVER_PC_SERIAL" type="boolean" value="true"/> <option name="CONFIG_SERIAL_PORT" type="integer" value="0"/> <option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/> <option name="CONFIG_DEBUG_CONSOLE_VGA" type="boolean" value="true"/>