target/mips: Simplify UHI_argnlen and UHI_argn
With semihosting_get_arg, we already have a check vs argc, so there's no point replicating it -- just check the result vs NULL. Merge copy_argn_to_target into its caller. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220628111701.677216-8-richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
938fcd741a
commit
3bb45bbc6f
@ -198,21 +198,6 @@ static void uhi_fstat_cb(CPUState *cs, uint64_t ret, int err)
|
|||||||
uhi_cb(cs, ret, err);
|
uhi_cb(cs, ret, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int copy_argn_to_target(CPUMIPSState *env, int arg_num,
|
|
||||||
target_ulong vaddr)
|
|
||||||
{
|
|
||||||
int strsize = strlen(semihosting_get_arg(arg_num)) + 1;
|
|
||||||
char *dst = lock_user(VERIFY_WRITE, vaddr, strsize, 0);
|
|
||||||
if (!dst) {
|
|
||||||
report_fault(env);
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(dst, semihosting_get_arg(arg_num));
|
|
||||||
|
|
||||||
unlock_user(dst, vaddr, strsize);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_TARGET_STRING(p, addr) \
|
#define GET_TARGET_STRING(p, addr) \
|
||||||
do { \
|
do { \
|
||||||
p = lock_user_string(addr); \
|
p = lock_user_string(addr); \
|
||||||
@ -285,18 +270,31 @@ void mips_semihosting(CPUMIPSState *env)
|
|||||||
gpr[2] = semihosting_get_argc();
|
gpr[2] = semihosting_get_argc();
|
||||||
break;
|
break;
|
||||||
case UHI_argnlen:
|
case UHI_argnlen:
|
||||||
if (gpr[4] >= semihosting_get_argc()) {
|
{
|
||||||
gpr[2] = -1;
|
const char *s = semihosting_get_arg(gpr[4]);
|
||||||
return;
|
gpr[2] = s ? strlen(s) : -1;
|
||||||
}
|
}
|
||||||
gpr[2] = strlen(semihosting_get_arg(gpr[4]));
|
|
||||||
break;
|
break;
|
||||||
case UHI_argn:
|
case UHI_argn:
|
||||||
if (gpr[4] >= semihosting_get_argc()) {
|
{
|
||||||
gpr[2] = -1;
|
const char *s = semihosting_get_arg(gpr[4]);
|
||||||
return;
|
target_ulong addr;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
gpr[2] = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = strlen(s) + 1;
|
||||||
|
addr = gpr[5];
|
||||||
|
p = lock_user(VERIFY_WRITE, addr, len, 0);
|
||||||
|
if (!p) {
|
||||||
|
report_fault(env);
|
||||||
|
}
|
||||||
|
memcpy(p, s, len);
|
||||||
|
unlock_user(p, addr, len);
|
||||||
|
gpr[2] = 0;
|
||||||
}
|
}
|
||||||
gpr[2] = copy_argn_to_target(env, gpr[4], gpr[5]);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UHI_plog:
|
case UHI_plog:
|
||||||
|
Loading…
Reference in New Issue
Block a user