@ -145,6 +145,26 @@ static void gdb_remove(CPUState *cs, gdb_syscall_complete_cb complete,
gdb_do_syscall ( complete , " unlink,%s " , fname , len ) ;
}
static void gdb_rename ( CPUState * cs , gdb_syscall_complete_cb complete ,
target_ulong oname , target_ulong oname_len ,
target_ulong nname , target_ulong nname_len )
{
int olen , nlen ;
olen = validate_strlen ( cs , oname , oname_len ) ;
if ( olen < 0 ) {
complete ( cs , - 1 , - olen ) ;
return ;
}
nlen = validate_strlen ( cs , nname , nname_len ) ;
if ( nlen < 0 ) {
complete ( cs , - 1 , - nlen ) ;
return ;
}
gdb_do_syscall ( complete , " rename,%s,%s " , oname , olen , nname , nlen ) ;
}
/*
* Host semihosting syscall implementations .
*/
@ -307,6 +327,32 @@ static void host_remove(CPUState *cs, gdb_syscall_complete_cb complete,
unlock_user ( p , fname , 0 ) ;
}
static void host_rename ( CPUState * cs , gdb_syscall_complete_cb complete ,
target_ulong oname , target_ulong oname_len ,
target_ulong nname , target_ulong nname_len )
{
CPUArchState * env G_GNUC_UNUSED = cs - > env_ptr ;
char * ostr , * nstr ;
int ret ;
ret = validate_lock_user_string ( & ostr , cs , oname , oname_len ) ;
if ( ret < 0 ) {
complete ( cs , - 1 , - ret ) ;
return ;
}
ret = validate_lock_user_string ( & nstr , cs , nname , nname_len ) ;
if ( ret < 0 ) {
unlock_user ( ostr , oname , 0 ) ;
complete ( cs , - 1 , - ret ) ;
return ;
}
ret = rename ( ostr , nstr ) ;
complete ( cs , ret , ret ? errno : 0 ) ;
unlock_user ( ostr , oname , 0 ) ;
unlock_user ( nstr , nname , 0 ) ;
}
/*
* Static file semihosting syscall implementations .
*/
@ -562,3 +608,14 @@ void semihost_sys_remove(CPUState *cs, gdb_syscall_complete_cb complete,
host_remove ( cs , complete , fname , fname_len ) ;
}
}
void semihost_sys_rename ( CPUState * cs , gdb_syscall_complete_cb complete ,
target_ulong oname , target_ulong oname_len ,
target_ulong nname , target_ulong nname_len )
{
if ( use_gdb_syscalls ( ) ) {
gdb_rename ( cs , complete , oname , oname_len , nname , nname_len ) ;
} else {
host_rename ( cs , complete , oname , oname_len , nname , nname_len ) ;
}
}