linux-user: use target_ulong
Linux syscalls pass pointers or data length or other information of that sort to the kernel. This is all stuff you don't want to have sign extended. Otherwise a host 64bit variable parameter with a size parameter will extend it to a negative number, breaking lseek for example. Pass syscall arguments as ulong always. Signed-off-by: Alexander Graf <agraf@suse.de> [JRZ: changes from linux-user/qemu.h wass moved to linux-user/user-internals.h] Signed-off-by: Jose R Ziviani <jziviani@suse.de>
This commit is contained in:
		@@ -8346,10 +8346,10 @@ _syscall2(int, pivot_root, const char *, new_root, const char *, put_old)
 | 
			
		||||
 * of syscall results, can be performed.
 | 
			
		||||
 * All errnos that do_syscall() returns must be -TARGET_<errcode>.
 | 
			
		||||
 */
 | 
			
		||||
static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
                            abi_long arg2, abi_long arg3, abi_long arg4,
 | 
			
		||||
                            abi_long arg5, abi_long arg6, abi_long arg7,
 | 
			
		||||
                            abi_long arg8)
 | 
			
		||||
static abi_long do_syscall1(void *cpu_env, int num, abi_ulong arg1,
 | 
			
		||||
                            abi_ulong arg2, abi_ulong arg3, abi_ulong arg4,
 | 
			
		||||
                            abi_ulong arg5, abi_ulong arg6, abi_ulong arg7,
 | 
			
		||||
                            abi_ulong arg8)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *cpu = env_cpu(cpu_env);
 | 
			
		||||
    abi_long ret;
 | 
			
		||||
@@ -10807,7 +10807,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
             */
 | 
			
		||||
            ret = -TARGET_EINVAL;
 | 
			
		||||
            if (cpu_isar_feature(aa64_sve, env_archcpu(cpu_env))
 | 
			
		||||
                && arg2 >= 0 && arg2 <= 512 * 16 && !(arg2 & 15)) {
 | 
			
		||||
                && arg2 <= 512 * 16 && !(arg2 & 15)) {
 | 
			
		||||
                CPUARMState *env = cpu_env;
 | 
			
		||||
                ARMCPU *cpu = env_archcpu(env);
 | 
			
		||||
                uint32_t vq, old_vq;
 | 
			
		||||
@@ -13176,10 +13176,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
                    abi_long arg2, abi_long arg3, abi_long arg4,
 | 
			
		||||
                    abi_long arg5, abi_long arg6, abi_long arg7,
 | 
			
		||||
                    abi_long arg8)
 | 
			
		||||
abi_long do_syscall(void *cpu_env, int num, abi_ulong arg1,
 | 
			
		||||
                    abi_ulong arg2, abi_ulong arg3, abi_ulong arg4,
 | 
			
		||||
                    abi_ulong arg5, abi_ulong arg6, abi_ulong arg7,
 | 
			
		||||
                    abi_ulong arg8)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *cpu = env_cpu(cpu_env);
 | 
			
		||||
    abi_long ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -60,10 +60,10 @@ int info_is_fdpic(struct image_info *info);
 | 
			
		||||
 | 
			
		||||
void target_set_brk(abi_ulong new_brk);
 | 
			
		||||
void syscall_init(void);
 | 
			
		||||
abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
                    abi_long arg2, abi_long arg3, abi_long arg4,
 | 
			
		||||
                    abi_long arg5, abi_long arg6, abi_long arg7,
 | 
			
		||||
                    abi_long arg8);
 | 
			
		||||
abi_long do_syscall(void *cpu_env, int num, abi_ulong arg1,
 | 
			
		||||
                    abi_ulong arg2, abi_ulong arg3, abi_ulong arg4,
 | 
			
		||||
                    abi_ulong arg5, abi_ulong arg6, abi_ulong arg7,
 | 
			
		||||
                    abi_ulong arg8);
 | 
			
		||||
extern __thread CPUState *thread_cpu;
 | 
			
		||||
void cpu_loop(CPUArchState *env);
 | 
			
		||||
const char *target_strerror(int err);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user