@@ -7219,11 +7219,46 @@ static inline int target_to_host_mlockall_arg(int arg)
7219
7219
}
7220
7220
#endif
7221
7221
7222
+ static const bitmask_transtbl st_mode_tlb [] = {
7223
+ { TARGET_S_IFMT , TARGET_S_IFIFO , S_IFMT , S_IFIFO },
7224
+ { TARGET_S_IFMT , TARGET_S_IFCHR , S_IFMT , S_IFCHR },
7225
+ { TARGET_S_IFMT , TARGET_S_IFDIR , S_IFMT , S_IFDIR },
7226
+ { TARGET_S_IFMT , TARGET_S_IFBLK , S_IFMT , S_IFBLK },
7227
+ { TARGET_S_IFMT , TARGET_S_IFREG , S_IFMT , S_IFREG },
7228
+ { TARGET_S_IFMT , TARGET_S_IFLNK , S_IFMT , S_IFLNK },
7229
+ { TARGET_S_IFMT , TARGET_S_IFSOCK , S_IFMT , S_IFSOCK },
7230
+ #ifdef S_IFNAM
7231
+ { TARGET_S_IFMT , TARGET_S_IFNAM , S_IFMT , S_IFNAM },
7232
+ #endif
7233
+ { TARGET_S_ISUID , TARGET_S_ISUID , S_ISUID , S_ISUID },
7234
+ { TARGET_S_ISGID , TARGET_S_ISGID , S_ISGID , S_ISGID },
7235
+ { TARGET_S_ISVTX , TARGET_S_ISVTX , S_ISVTX , S_ISVTX },
7236
+
7237
+ { TARGET_S_IREAD , TARGET_S_IREAD , S_IREAD , S_IREAD },
7238
+ { TARGET_S_IWRITE , TARGET_S_IWRITE , S_IWRITE , S_IWRITE },
7239
+ { TARGET_S_IEXEC , TARGET_S_IEXEC , S_IEXEC , S_IEXEC },
7240
+ { TARGET_S_ENFMT , TARGET_S_ENFMT , S_ISGID , S_ISGID },
7241
+ { TARGET_S_IRWXU , TARGET_S_IRWXU , S_IRWXU , S_IRWXU },
7242
+ { TARGET_S_IRWXU , TARGET_S_IRUSR , S_IRWXU , S_IRUSR },
7243
+ { TARGET_S_IRWXU , TARGET_S_IWUSR , S_IRWXU , S_IWUSR },
7244
+ { TARGET_S_IRWXU , TARGET_S_IXUSR , S_IRWXU , S_IXUSR },
7245
+ { TARGET_S_IRWXG , TARGET_S_IRWXG , S_IRWXG , S_IRWXG },
7246
+ { TARGET_S_IRWXG , TARGET_S_IRGRP , S_IRWXG , S_IRGRP },
7247
+ { TARGET_S_IRWXG , TARGET_S_IWGRP , S_IRWXG , S_IWGRP },
7248
+ { TARGET_S_IRWXG , TARGET_S_IXGRP , S_IRWXG , S_IXGRP },
7249
+ { TARGET_S_IRWXO , TARGET_S_IRWXO , S_IRWXO , S_IRWXO },
7250
+ { TARGET_S_IRWXO , TARGET_S_IROTH , S_IRWXO , S_IROTH },
7251
+ { TARGET_S_IRWXO , TARGET_S_IWOTH , S_IRWXO , S_IWOTH },
7252
+ { TARGET_S_IRWXO , TARGET_S_IXOTH , S_IRWXO , S_IXOTH },
7253
+ { 0 , 0 , 0 , 0 },
7254
+ };
7255
+
7222
7256
static inline abi_long host_to_target_stat (void * cpu_env ,
7223
7257
abi_ulong target_addr ,
7224
7258
struct stat * host_st )
7225
7259
{
7226
7260
struct target_stat * target_st ;
7261
+ int cnvt_st_mode = host_to_target_bitmask (host_st -> st_mode , st_mode_tlb );
7227
7262
7228
7263
if (!lock_user_struct (VERIFY_WRITE , target_st , target_addr , 0 ))
7229
7264
return - TARGET_EFAULT ;
@@ -7235,7 +7270,7 @@ static inline abi_long host_to_target_stat(void *cpu_env,
7235
7270
#endif
7236
7271
__put_user (host_st -> st_dev , & target_st -> st_dev );
7237
7272
__put_user (host_st -> st_ino , & target_st -> st_ino );
7238
- __put_user (host_st -> st_mode , & target_st -> st_mode );
7273
+ __put_user (cnvt_st_mode , & target_st -> st_mode );
7239
7274
__put_user (host_st -> st_uid , & target_st -> st_uid );
7240
7275
__put_user (host_st -> st_gid , & target_st -> st_gid );
7241
7276
__put_user (host_st -> st_nlink , & target_st -> st_nlink );
0 commit comments