This is ostensibly to avoid the weirdness of len looking like it might come from a guest and sometimes being used. While we are at it fix up the error checking for the arm-linux-user implementation of the API which got flagged up by Coverity (CID 1401700). Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * ARM Semihosting Console Support
 | 
						|
 *
 | 
						|
 * Copyright (c) 2019 Linaro Ltd
 | 
						|
 *
 | 
						|
 * Currently ARM is unique in having support for semihosting support
 | 
						|
 * in linux-user. So for now we implement the common console API but
 | 
						|
 * just for arm linux-user.
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
 */
 | 
						|
 | 
						|
#include "qemu/osdep.h"
 | 
						|
#include "cpu.h"
 | 
						|
#include "hw/semihosting/console.h"
 | 
						|
#include "qemu.h"
 | 
						|
 | 
						|
int qemu_semihosting_console_outs(CPUArchState *env, target_ulong addr)
 | 
						|
{
 | 
						|
    int len = target_strlen(addr);
 | 
						|
    void *s;
 | 
						|
    if (len < 0){
 | 
						|
       qemu_log_mask(LOG_GUEST_ERROR,
 | 
						|
                     "%s: passed inaccessible address " TARGET_FMT_lx,
 | 
						|
                     __func__, addr);
 | 
						|
       return 0;
 | 
						|
    }
 | 
						|
    s = lock_user(VERIFY_READ, addr, (long)(len + 1), 1);
 | 
						|
    g_assert(s);  /* target_strlen has already verified this will work */
 | 
						|
    len = write(STDERR_FILENO, s, len);
 | 
						|
    unlock_user(s, addr, 0);
 | 
						|
    return len;
 | 
						|
}
 | 
						|
 | 
						|
void qemu_semihosting_console_outc(CPUArchState *env, target_ulong addr)
 | 
						|
{
 | 
						|
    char c;
 | 
						|
 | 
						|
    if (get_user_u8(c, addr)) {
 | 
						|
        qemu_log_mask(LOG_GUEST_ERROR,
 | 
						|
                      "%s: passed inaccessible address " TARGET_FMT_lx,
 | 
						|
                      __func__, addr);
 | 
						|
    } else {
 | 
						|
        if (write(STDERR_FILENO, &c, 1) != 1) {
 | 
						|
            qemu_log_mask(LOG_UNIMP, "%s: unexpected write to stdout failure",
 | 
						|
                          __func__);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |