-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag '2023q3-bsd-user-pull-request' of https://gitlab.com/bsdimp…
…/qemu into staging Pull request for bsd-user 2023 Q3 (first batch) First batch of commits submitted by my GSoC student Karim Taha These implement the stat, statfs, statfh and dirents system calls. In addition, fix a missing break statment, and submit Richard Henderson's elf stat mmap cleansup. # -----BEGIN PGP SIGNATURE----- # Comment: GPGTools - https://gpgtools.org # # iQIzBAABCgAdFiEEIDX4lLAKo898zeG3bBzRKH2wEQAFAmTtL6EACgkQbBzRKH2w # EQALHQ//WOoHYxpNS1hy+oYIAvjW0JOqz9gCSFR0d56mDBShm7WO/9FZA6eGAzYQ # i5kBSVFwEBlM76K5vLTbRvCbCbAwlpAdMgI7HXValjspNhvu/66DNWmdil6GnXKu # 4QRaM/QGrobmYrNmf4SdgyjlMVH7wGyTrCTpXfvPfktZLAbQq7dCyNPTsOYXJP2V # LASk8j2gyW6fDi3z1AxTNVfS7BJX6DWMhPhlvC/aUOLVVGgj9Hw9uxPaKXC1t47D # bpZ+wJb4GMkcsmuiGJ40CXowjQ+M1lBrA4rN+lTMJNttZJ+TUYmizTFkYhX+B28h # Q2JZy5eLXlsxxRByOkOwFczfDT6jlG4BlK4jmDOvKlrTPLaWIHjezztTavWIZDlU # ce1oXQo3KEdWoa/QEsuxLeBbE+uZpu5+NqLeCk1cU4GPks8nbAcD7BGl6dDHKXM4 # 8vCcOMZLwO+xi5Etgcf/MtTPMpSO0rD9fTq2VSdYX0H197mkOdyCDAXjfKPsBUIE # VLAnCFfajMNRc5ITobEbz4GiMD/xy5s8eDZNeefG8lgySpl9XB2Lvw7SWDz1imsL # nBgQH6RHznU65wEvVGtnCGMj5kIMbohY2AGR75iGkRdgR+t2zMjUIiaU/qivD+6z # IEJ2jqDWqtQb81jFNrFzJlsim+GYRl0HcaEmyye2bgf5LHRSSNM= # =ORJ7 # -----END PGP SIGNATURE----- # gpg: Signature made Mon 28 Aug 2023 19:37:05 EDT # gpg: using RSA key 2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 # gpg: Good signature from "Warner Losh <[email protected]>" [unknown] # gpg: aka "Warner Losh <[email protected]>" [unknown] # gpg: aka "Warner Losh <[email protected]>" [unknown] # gpg: aka "Warner Losh <[email protected]>" [unknown] # gpg: aka "Warner Losh <[email protected]>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 2035 F894 B00A A3CF 7CCD E1B7 6C1C D128 7DB0 1100 * tag '2023q3-bsd-user-pull-request' of https://gitlab.com/bsdimp/qemu: (36 commits) bsd-user: Add missing break after do_bsd_preadv bsd-user: Add getdents and fcntl related system calls bsd-user: Add glue for statfs related system calls bsd-user: Add glue for getfh and related syscalls bsd-user: Add glue for the freebsd11_stat syscalls bsd-user: Add os-stat.c to the build bsd-user: Implement do_freebsd_realpathat syscall bsd-user: Implement freebsd11 netbsd stat related syscalls bsd-user: Implement freebsd11 getdirents related syscalls bsd-user: Implement freebsd11 statfs related syscalls bsd-user: Implement freebsd11 fstat and fhstat related syscalls bsd-user: Implement freebsd11 stat related syscalls bsd-user: Implement stat related syscalls bsd-user: Implement getdents related syscalls bsd-user: Implement statfs related syscalls bsd-user: Implement statfh related syscalls bsd-user: Implement stat related syscalls bsd-uesr: Implement h2t_freebsd_stat and h2t_freebsd_statfs functions bsd-user: Implement target_to_host_fcntl_cmd bsd-user: Implement h2t_freebds11_statfs ... Signed-off-by: Stefan Hajnoczi <[email protected]>
- Loading branch information
Showing
15 changed files
with
1,384 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
bsd_user_ss.add(files( | ||
'os-stat.c', | ||
'os-sys.c', | ||
'os-syscall.c', | ||
)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,262 @@ | ||
/* | ||
* FreeBSD stat related conversion routines | ||
* | ||
* Copyright (c) 2013 Stacey D. Son | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
#include "qemu/osdep.h" | ||
|
||
#include "qemu.h" | ||
|
||
/* | ||
* stat conversion | ||
*/ | ||
abi_long h2t_freebsd11_stat(abi_ulong target_addr, | ||
struct freebsd11_stat *host_st) | ||
{ | ||
struct target_freebsd11_stat *target_st; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
memset(target_st, 0, sizeof(*target_st)); | ||
__put_user(host_st->st_dev, &target_st->st_dev); | ||
__put_user(host_st->st_ino, &target_st->st_ino); | ||
__put_user(host_st->st_mode, &target_st->st_mode); | ||
__put_user(host_st->st_nlink, &target_st->st_nlink); | ||
__put_user(host_st->st_uid, &target_st->st_uid); | ||
__put_user(host_st->st_gid, &target_st->st_gid); | ||
__put_user(host_st->st_rdev, &target_st->st_rdev); | ||
__put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); | ||
__put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); | ||
__put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); | ||
__put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); | ||
__put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); | ||
__put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); | ||
__put_user(host_st->st_size, &target_st->st_size); | ||
__put_user(host_st->st_blocks, &target_st->st_blocks); | ||
__put_user(host_st->st_blksize, &target_st->st_blksize); | ||
__put_user(host_st->st_flags, &target_st->st_flags); | ||
__put_user(host_st->st_gen, &target_st->st_gen); | ||
/* st_lspare not used */ | ||
__put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); | ||
__put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); | ||
unlock_user_struct(target_st, target_addr, 1); | ||
|
||
return 0; | ||
} | ||
|
||
abi_long h2t_freebsd_stat(abi_ulong target_addr, | ||
struct stat *host_st) | ||
{ | ||
struct target_stat *target_st; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
memset(target_st, 0, sizeof(*target_st)); | ||
__put_user(host_st->st_dev, &target_st->st_dev); | ||
__put_user(host_st->st_ino, &target_st->st_ino); | ||
__put_user(host_st->st_nlink, &target_st->st_nlink); | ||
__put_user(host_st->st_mode, &target_st->st_mode); | ||
__put_user(host_st->st_uid, &target_st->st_uid); | ||
__put_user(host_st->st_gid, &target_st->st_gid); | ||
__put_user(host_st->st_rdev, &target_st->st_rdev); | ||
__put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); | ||
__put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); | ||
#ifdef TARGET_HAS_STAT_TIME_T_EXT | ||
/* __put_user(host_st->st_mtim_ext, &target_st->st_mtim_ext); XXX */ | ||
#endif | ||
__put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); | ||
__put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); | ||
#ifdef TARGET_HAS_STAT_TIME_T_EXT | ||
/* __put_user(host_st->st_ctim_ext, &target_st->st_ctim_ext); XXX */ | ||
#endif | ||
__put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); | ||
__put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); | ||
#ifdef TARGET_HAS_STAT_TIME_T_EXT | ||
/* __put_user(host_st->st_birthtim_ext, &target_st->st_birthtim_ext); XXX */ | ||
#endif | ||
__put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); | ||
__put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); | ||
|
||
__put_user(host_st->st_size, &target_st->st_size); | ||
__put_user(host_st->st_blocks, &target_st->st_blocks); | ||
__put_user(host_st->st_blksize, &target_st->st_blksize); | ||
__put_user(host_st->st_flags, &target_st->st_flags); | ||
__put_user(host_st->st_gen, &target_st->st_gen); | ||
unlock_user_struct(target_st, target_addr, 1); | ||
|
||
return 0; | ||
} | ||
|
||
abi_long h2t_freebsd11_nstat(abi_ulong target_addr, | ||
struct freebsd11_stat *host_st) | ||
{ | ||
struct target_freebsd11_nstat *target_st; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
memset(target_st, 0, sizeof(*target_st)); | ||
__put_user(host_st->st_dev, &target_st->st_dev); | ||
__put_user(host_st->st_ino, &target_st->st_ino); | ||
__put_user(host_st->st_mode, &target_st->st_mode); | ||
__put_user(host_st->st_nlink, &target_st->st_nlink); | ||
__put_user(host_st->st_uid, &target_st->st_uid); | ||
__put_user(host_st->st_gid, &target_st->st_gid); | ||
__put_user(host_st->st_rdev, &target_st->st_rdev); | ||
__put_user(host_st->st_atim.tv_sec, &target_st->st_atim.tv_sec); | ||
__put_user(host_st->st_atim.tv_nsec, &target_st->st_atim.tv_nsec); | ||
__put_user(host_st->st_mtim.tv_sec, &target_st->st_mtim.tv_sec); | ||
__put_user(host_st->st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); | ||
__put_user(host_st->st_ctim.tv_sec, &target_st->st_ctim.tv_sec); | ||
__put_user(host_st->st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); | ||
__put_user(host_st->st_size, &target_st->st_size); | ||
__put_user(host_st->st_blocks, &target_st->st_blocks); | ||
__put_user(host_st->st_blksize, &target_st->st_blksize); | ||
__put_user(host_st->st_flags, &target_st->st_flags); | ||
__put_user(host_st->st_gen, &target_st->st_gen); | ||
__put_user(host_st->st_birthtim.tv_sec, &target_st->st_birthtim.tv_sec); | ||
__put_user(host_st->st_birthtim.tv_nsec, &target_st->st_birthtim.tv_nsec); | ||
unlock_user_struct(target_st, target_addr, 1); | ||
|
||
return 0; | ||
} | ||
|
||
/* | ||
* file handle conversion | ||
*/ | ||
abi_long t2h_freebsd_fhandle(fhandle_t *host_fh, abi_ulong target_addr) | ||
{ | ||
target_freebsd_fhandle_t *target_fh; | ||
|
||
if (!lock_user_struct(VERIFY_READ, target_fh, target_addr, 1)) { | ||
return -TARGET_EFAULT; | ||
} | ||
__get_user(host_fh->fh_fsid.val[0], &target_fh->fh_fsid.val[0]); | ||
__get_user(host_fh->fh_fsid.val[1], &target_fh->fh_fsid.val[0]); | ||
__get_user(host_fh->fh_fid.fid_len, &target_fh->fh_fid.fid_len); | ||
/* u_short fid_data0; */ | ||
memcpy(host_fh->fh_fid.fid_data, target_fh->fh_fid.fid_data, | ||
TARGET_MAXFIDSZ); | ||
unlock_user_struct(target_fh, target_addr, 0); | ||
return 0; | ||
} | ||
|
||
abi_long h2t_freebsd_fhandle(abi_ulong target_addr, fhandle_t *host_fh) | ||
{ | ||
target_freebsd_fhandle_t *target_fh; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_fh, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
__put_user(host_fh->fh_fsid.val[0], &target_fh->fh_fsid.val[0]); | ||
__put_user(host_fh->fh_fsid.val[1], &target_fh->fh_fsid.val[0]); | ||
__put_user(host_fh->fh_fid.fid_len, &target_fh->fh_fid.fid_len); | ||
/* u_short fid_data0; */ | ||
memcpy(target_fh->fh_fid.fid_data, host_fh->fh_fid.fid_data, | ||
TARGET_MAXFIDSZ); | ||
unlock_user_struct(target_fh, target_addr, 1); | ||
return 0; | ||
} | ||
|
||
/* | ||
* file system stat | ||
*/ | ||
abi_long h2t_freebsd11_statfs(abi_ulong target_addr, | ||
struct freebsd11_statfs *host_statfs) | ||
{ | ||
struct target_freebsd11_statfs *target_statfs; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_statfs, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
__put_user(host_statfs->f_version, &target_statfs->f_version); | ||
__put_user(host_statfs->f_type, &target_statfs->f_type); | ||
__put_user(host_statfs->f_flags, &target_statfs->f_flags); | ||
__put_user(host_statfs->f_bsize, &target_statfs->f_bsize); | ||
__put_user(host_statfs->f_iosize, &target_statfs->f_iosize); | ||
__put_user(host_statfs->f_blocks, &target_statfs->f_blocks); | ||
__put_user(host_statfs->f_bfree, &target_statfs->f_bfree); | ||
__put_user(host_statfs->f_bavail, &target_statfs->f_bavail); | ||
__put_user(host_statfs->f_files, &target_statfs->f_files); | ||
__put_user(host_statfs->f_ffree, &target_statfs->f_ffree); | ||
__put_user(host_statfs->f_syncwrites, &target_statfs->f_syncwrites); | ||
__put_user(host_statfs->f_asyncwrites, &target_statfs->f_asyncwrites); | ||
__put_user(host_statfs->f_syncreads, &target_statfs->f_syncreads); | ||
__put_user(host_statfs->f_asyncreads, &target_statfs->f_asyncreads); | ||
/* uint64_t f_spare[10]; */ | ||
__put_user(host_statfs->f_namemax, &target_statfs->f_namemax); | ||
__put_user(host_statfs->f_owner, &target_statfs->f_owner); | ||
__put_user(host_statfs->f_fsid.val[0], &target_statfs->f_fsid.val[0]); | ||
__put_user(host_statfs->f_fsid.val[1], &target_statfs->f_fsid.val[1]); | ||
/* char f_charspace[80]; */ | ||
strncpy(target_statfs->f_fstypename, host_statfs->f_fstypename, | ||
sizeof(target_statfs->f_fstypename)); | ||
strncpy(target_statfs->f_mntfromname, host_statfs->f_mntfromname, | ||
sizeof(target_statfs->f_mntfromname)); | ||
strncpy(target_statfs->f_mntonname, host_statfs->f_mntonname, | ||
sizeof(target_statfs->f_mntonname)); | ||
unlock_user_struct(target_statfs, target_addr, 1); | ||
return 0; | ||
} | ||
|
||
abi_long h2t_freebsd_statfs(abi_ulong target_addr, | ||
struct statfs *host_statfs) | ||
{ | ||
struct target_statfs *target_statfs; | ||
|
||
if (!lock_user_struct(VERIFY_WRITE, target_statfs, target_addr, 0)) { | ||
return -TARGET_EFAULT; | ||
} | ||
__put_user(host_statfs->f_version, &target_statfs->f_version); | ||
__put_user(host_statfs->f_type, &target_statfs->f_type); | ||
__put_user(host_statfs->f_flags, &target_statfs->f_flags); | ||
__put_user(host_statfs->f_bsize, &target_statfs->f_bsize); | ||
__put_user(host_statfs->f_iosize, &target_statfs->f_iosize); | ||
__put_user(host_statfs->f_blocks, &target_statfs->f_blocks); | ||
__put_user(host_statfs->f_bfree, &target_statfs->f_bfree); | ||
__put_user(host_statfs->f_bavail, &target_statfs->f_bavail); | ||
__put_user(host_statfs->f_files, &target_statfs->f_files); | ||
__put_user(host_statfs->f_ffree, &target_statfs->f_ffree); | ||
__put_user(host_statfs->f_syncwrites, &target_statfs->f_syncwrites); | ||
__put_user(host_statfs->f_asyncwrites, &target_statfs->f_asyncwrites); | ||
__put_user(host_statfs->f_syncreads, &target_statfs->f_syncreads); | ||
__put_user(host_statfs->f_asyncreads, &target_statfs->f_asyncreads); | ||
/* uint64_t f_spare[10]; */ | ||
__put_user(host_statfs->f_namemax, &target_statfs->f_namemax); | ||
__put_user(host_statfs->f_owner, &target_statfs->f_owner); | ||
__put_user(host_statfs->f_fsid.val[0], &target_statfs->f_fsid.val[0]); | ||
__put_user(host_statfs->f_fsid.val[1], &target_statfs->f_fsid.val[1]); | ||
/* char f_charspace[80]; */ | ||
strncpy(target_statfs->f_fstypename, host_statfs->f_fstypename, | ||
sizeof(target_statfs->f_fstypename)); | ||
strncpy(target_statfs->f_mntfromname, host_statfs->f_mntfromname, | ||
sizeof(target_statfs->f_mntfromname)); | ||
strncpy(target_statfs->f_mntonname, host_statfs->f_mntonname, | ||
sizeof(target_statfs->f_mntonname)); | ||
unlock_user_struct(target_statfs, target_addr, 1); | ||
return 0; | ||
} | ||
|
||
/* | ||
* fcntl cmd conversion | ||
*/ | ||
abi_long target_to_host_fcntl_cmd(int cmd) | ||
{ | ||
return cmd; | ||
} | ||
|
Oops, something went wrong.