Add --enable-sim-stdio to make console I/O use stdio, not printf_filtered and polling input

This commit is contained in:
Michael Meissner 1996-03-29 17:33:56 +00:00
parent 0e88ffa284
commit d6103e8eb6
5 changed files with 806 additions and 437 deletions

View File

@ -1,3 +1,38 @@
Fri Mar 29 12:17:58 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* Makefile.in (STDIO_CFLAGS): Pass on result of @sim_stdio@
configuration variable.
(CONFIG_CFLAGS): Include STDIO_CFLAGS.
* std-config.h (DO{,NT}_USE_STDIO): New flags for whether we
should use stdio for console input.
(WITH_STDIO): If not defined, define as DONT_USE_STDIO.
* configure.in (--enable-sim-stdio): Add new switch to control
whether stdio is used for console I/O.
* configure: Regenerate.
* device_table.c (console_use_stdio): New static variable set from
WITH_STDIO.
(scan_console): If console_use_stdio, use getchar to read byte
instead of doing polling I/O.
(write_console): If console_use_stdio, write byte with putchar.
(console_io_write_buffer_callback): If console_use_stdio, fflush
stdout.
(console_instance_write_callback): Ditto.
(console_instance_read_callback): If console_use_stdio, use fgets
to read line.
Fri Mar 29 12:17:58 1996 Andrew Cagney <cagney@kremvax.highland.com.au>
* emul_bugapi.c (_os_emul_data): Add fields for output, input.
(emul_bugapi_create): Create input, output from /chosen/stdin and
/chosen/stdout.
(emul_bugapi_do_{read,write}): Switch to use device_instance
interface.
(emul_bugapi_instruction_call): Change calls to
emul_bugapi_do_{read,write} to pass device instance argument.
Tue Mar 26 14:57:58 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* igen.c (idecode_switch_end): Fix 2/26 change so that an extra

View File

@ -1,7 +1,7 @@
#
# This file is part of the program psim.
#
# Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
# Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -84,6 +84,7 @@ ASSERT_CFLAGS = @sim_assert@
RESERVED_CFLAGS = @sim_reserved@
MONITOR_CFLAGS = @sim_monitor@
MODEL_CFLAGS = @sim_model@ @sim_default_model@ @sim_model_issue@
STDIO_CFLAGS = @sim_stdio@
WARNING_CFLAGS = @sim_warnings@
CONFIG_CFLAGS = $(BSWAP_CFLAGS) \
$(ENDIAN_CFLAGS) \
@ -100,7 +101,8 @@ CONFIG_CFLAGS = $(BSWAP_CFLAGS) \
$(ASSERT_CFLAGS) \
$(RESERVED_CFLAGS) \
$(MONITOR_CFLAGS) \
$(MODEL_CFLAGS)
$(MODEL_CFLAGS) \
$(STDIO_CFLAGS)
STD_CFLAGS = $(CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(WARNING_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES)
NOWARN_CFLAGS = $(CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES)
@ -297,7 +299,7 @@ os_emul.o: os_emul.c emul_netbsd.h emul_chirp.h emul_bugapi.h $(EMUL_GENERIC_H)
emul_generic.o: emul_generic.c $(EMUL_GENERIC_H)
emul_netbsd.o: emul_netbsd.c emul_netbsd.h $(EMUL_GENERIC_H)
emul_chirp.o: emul_chirp.c emul_chirp.h cap.h $(EMUL_GENERIC_H)
emul_chirp.o: emul_chirp.c emul_chirp.h $(EMUL_GENERIC_H)
emul_bugapi.o: emul_bugapi.c emul_bugapi.h $(EMUL_GENERIC_H)
registers.o: registers.c $(REGISTERS_H) $(BASICS_H)
@ -326,7 +328,7 @@ spreg.o: spreg.h spreg.c $(BASICS_H)
main.o: main.c $(PSIM_H) itable.h options.h
device.o: device.c $(DEVICE_TABLE_H)
device.o: device.c $(DEVICE_TABLE_H) cap.h
device_table.o: device_table.c $(DEVICE_TABLE_H) events.h

View File

@ -364,6 +364,17 @@ if test x"$silent" != x"yes"; then
echo "Setting model-issue flags = $sim_model_issue" 6>&1
fi],[sim_model_issue=""])dnl
AC_ARG_ENABLE(sim-stdio,
[ --enable-sim-stdio Specify whether to use stdio for console input/output.],
[case "${enableval}" in
yes) sim_stdio="-DWITH_STDIO=DO_USE_STDIO";;
no) sim_stdio="-DWITH_STDIO=DONT_USE_STDIO";;
*) AC_MSG_ERROR("Unknown value $enableval passed to --enable-sim-stdio"); sim_stdio="";;
esac
if test x"$silent" != x"yes" && test x"$sim_stdio" != x""; then
echo "Setting stdio flags = $sim_stdio" 6>&1
fi],[sim_stdio=""])dnl
AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
AC_CANONICAL_SYSTEM
AC_ARG_PROGRAM
@ -405,6 +416,7 @@ AC_SUBST(sim_monitor)
AC_SUBST(sim_model)
AC_SUBST(sim_default_model)
AC_SUBST(sim_model_issue)
AC_SUBST(sim_stdio)
AC_CHECK_FUNCS(getrusage)

File diff suppressed because it is too large Load Diff

View File

@ -166,6 +166,9 @@ struct _os_emul_data {
unsigned_word stall_cpu_loop_address;
int little_endian;
int floating_point_available;
/* I/O devices */
device_instance *output;
device_instance *input;
};
@ -214,6 +217,10 @@ emul_bugapi_create(device *root,
= device_find_boolean_property(root, "/options/little-endian?");
bugapi->floating_point_available
= device_find_boolean_property(root, "/openprom/options/floating-point?");
bugapi->input
= device_find_ihandle_property(root, "/chosen/stdin");
bugapi->output
= device_find_ihandle_property(root, "/chosen/stdout");
/* initialization */
device_tree_add_parsed(root, "/openprom/init/register/0.pc 0x%lx",
@ -239,15 +246,15 @@ emul_bugapi_create(device *root,
/* patch the system call instruction to call this emulation and then
do an rfi */
node = device_tree_add_parsed(root, "/openprom/init/data@0x%lx",
(long)bugapi->system_call_address);
(unsigned long)bugapi->system_call_address);
device_tree_add_parsed(node, "./real-address 0x%lx",
(long)bugapi->system_call_address);
(unsigned long)bugapi->system_call_address);
device_tree_add_parsed(node, "./data 0x%x",
emul_call_instruction);
node = device_tree_add_parsed(root, "/openprom/init/data@0x%lx",
(long)(bugapi->system_call_address + 4));
(unsigned long)bugapi->system_call_address + 4);
device_tree_add_parsed(node, "./real-address 0x%lx",
(long)(bugapi->system_call_address + 4));
(unsigned long)bugapi->system_call_address + 4);
device_tree_add_parsed(node, "./data 0x%x",
emul_rfi_instruction);
@ -293,7 +300,8 @@ emul_bugapi_instruction_name(int call_id)
}
static int
emul_bugapi_do_read(cpu *processor,
emul_bugapi_do_read(os_emul_data *bugapi,
cpu *processor,
unsigned_word cia,
unsigned_word buf,
int nbytes)
@ -308,9 +316,11 @@ emul_bugapi_do_read(cpu *processor,
emul_read_buffer((void *)scratch_buffer, buf, nbytes, processor, cia);
/* read */
status = read (0, (void *)scratch_buffer, nbytes);
status = device_instance_read(bugapi->input,
(void *)scratch_buffer, nbytes);
if (status == -1) {
/* -1 = error, -2 = nothing available - see "serial" [IEEE1275] */
if (status < 0) {
status = 0;
}
@ -327,14 +337,14 @@ emul_bugapi_do_read(cpu *processor,
}
static void
emul_bugapi_do_write(cpu *processor,
emul_bugapi_do_write(os_emul_data *bugapi,
cpu *processor,
unsigned_word cia,
unsigned_word buf,
int nbytes,
const char *suffix)
{
void *scratch_buffer = NULL;
char *p;
int nr_moved;
/* get a tempoary bufer */
@ -354,14 +364,13 @@ emul_bugapi_do_write(cpu *processor,
}
/* write */
for (p = (char *)scratch_buffer; nbytes-- > 0; p++)
printf_filtered("%c", *p);
device_instance_write(bugapi->output, scratch_buffer, nbytes);
zfree(scratch_buffer);
}
if (suffix)
printf_filtered("%s", suffix);
device_instance_write(bugapi->output, suffix, strlen(suffix));
flush_stdoutput ();
}
@ -370,10 +379,10 @@ static int
emul_bugapi_instruction_call(cpu *processor,
unsigned_word cia,
unsigned_word ra,
os_emul_data *emul_data)
os_emul_data *bugapi)
{
const int call_id = cpu_registers(processor)->gpr[10];
const char *my_prefix = "bugapi";
const char *my_prefix UNUSED = "bugapi";
unsigned char uc;
ITRACE (trace_os_emul,(" 0x%x %s, r3 = 0x%lx, r4 = 0x%lx\n",
@ -382,7 +391,7 @@ emul_bugapi_instruction_call(cpu *processor,
(long)cpu_registers(processor)->gpr[4]));;
/* check that this isn't an invalid instruction */
if (cia != emul_data->system_call_address)
if (cia != bugapi->system_call_address)
return 0;
switch (call_id) {
default:
@ -392,23 +401,28 @@ emul_bugapi_instruction_call(cpu *processor,
/* read a single character, output r3 = byte */
/* FIXME: Add support to unbuffer input */
case _INCHR:
if (read (0, &uc, 1) < 0)
if (device_instance_read(bugapi->input, (void *)&uc, 1) <= 0)
uc = 0;
cpu_registers(processor)->gpr[3] = uc;
break;
/* read a line of at most 256 bytes, r3 = ptr to 1st byte, output r3 = ptr to last byte+1 */
case _INLN:
cpu_registers(processor)->gpr[3] += emul_bugapi_do_read(processor, cia,
cpu_registers(processor)->gpr[3] += emul_bugapi_do_read(bugapi,
processor, cia,
cpu_registers(processor)->gpr[3],
256);
break;
/* output a character, r3 = character */
case _OUTCHR:
printf_filtered("%c", (char)cpu_registers(processor)->gpr[3]);
{
char out = (char)cpu_registers(processor)->gpr[3];
device_instance_write(bugapi->output, &out, 1);
}
break;
/* output a string, r3 = ptr to 1st byte, r4 = ptr to last byte+1 */
case _OUTSTR:
emul_bugapi_do_write(processor, cia,
emul_bugapi_do_write(bugapi,
processor, cia,
cpu_registers(processor)->gpr[3],
cpu_registers(processor)->gpr[4] - cpu_registers(processor)->gpr[3],
(const char *)0);
@ -416,14 +430,15 @@ emul_bugapi_instruction_call(cpu *processor,
/* output a string followed by \r\n, r3 = ptr to 1st byte, r4 = ptr to last byte+1 */
case _OUTLN:
emul_bugapi_do_write(processor, cia,
emul_bugapi_do_write(bugapi,
processor, cia,
cpu_registers(processor)->gpr[3],
cpu_registers(processor)->gpr[4] - cpu_registers(processor)->gpr[3],
"\n");
break;
/* output a \r\n */
case _PCRLF:
printf_filtered("\n");
device_instance_write(bugapi->output, "\n", 1);
break;
/* return to ppcbug monitor */
case _RETURN: