semihosting: Use console_out_gf for SYS_WRITEC

Reviewed-by: Luc Michel <lmichel@kalray.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
master
Richard Henderson 2022-05-01 17:55:20 -07:00
parent 1577eec0fc
commit 5d77289dac
1 changed files with 16 additions and 4 deletions

View File

@ -228,6 +228,15 @@ static void common_semi_cb(CPUState *cs, uint64_t ret, int err)
common_semi_set_ret(cs, ret); common_semi_set_ret(cs, ret);
} }
/*
* Use 0xdeadbeef as the return value when there isn't a defined
* return value for the call.
*/
static void common_semi_dead_cb(CPUState *cs, uint64_t ret, int err)
{
common_semi_set_ret(cs, 0xdeadbeef);
}
/* /*
* SYS_READ and SYS_WRITE always return the number of bytes not read/written. * SYS_READ and SYS_WRITE always return the number of bytes not read/written.
* There is no error condition, other than returning the original length. * There is no error condition, other than returning the original length.
@ -341,8 +350,7 @@ static const uint8_t featurefile_data[] = {
* The specification always says that the "return register" either * The specification always says that the "return register" either
* returns a specific value or is corrupted, so we don't need to * returns a specific value or is corrupted, so we don't need to
* report to our caller whether we are returning a value or trying to * report to our caller whether we are returning a value or trying to
* leave the register unchanged. We use 0xdeadbeef as the return value * leave the register unchanged.
* when there isn't a defined return value for the call.
*/ */
void do_common_semihosting(CPUState *cs) void do_common_semihosting(CPUState *cs)
{ {
@ -420,8 +428,12 @@ void do_common_semihosting(CPUState *cs)
break; break;
case TARGET_SYS_WRITEC: case TARGET_SYS_WRITEC:
qemu_semihosting_console_outc(env, args); /*
common_semi_set_ret(cs, 0xdeadbeef); * FIXME: the byte to be written is in a target_ulong slot,
* which means this is wrong for a big-endian guest.
*/
semihost_sys_write_gf(cs, common_semi_dead_cb,
&console_out_gf, args, 1);
break; break;
case TARGET_SYS_WRITE0: case TARGET_SYS_WRITE0: