Skip to content

Commit

Permalink
Merge tag '2023q3-bsd-user-pull-request' of https://gitlab.com/bsdimp…
Browse files Browse the repository at this point in the history
…/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 <wlosh@netflix.com>" [unknown]
# gpg:                 aka "Warner Losh <imp@bsdimp.com>" [unknown]
# gpg:                 aka "Warner Losh <imp@freebsd.org>" [unknown]
# gpg:                 aka "Warner Losh <imp@village.org>" [unknown]
# gpg:                 aka "Warner Losh <wlosh@bsdimp.com>" [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 <stefanha@redhat.com>
  • Loading branch information
stefanhaRH committed Aug 29, 2023
2 parents f5fe7c1 + f51e7c4 commit 813bac3
Show file tree
Hide file tree
Showing 15 changed files with 1,384 additions and 77 deletions.
1 change: 0 additions & 1 deletion bsd-user/arm/target_arch_elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#ifndef TARGET_ARCH_ELF_H
#define TARGET_ARCH_ELF_H

#define ELF_START_MMAP 0x80000000
#define ELF_ET_DYN_LOAD_ADDR 0x500000

#define elf_check_arch(x) ((x) == EM_ARM)
Expand Down
4 changes: 1 addition & 3 deletions bsd-user/elfload.c
Original file line number Diff line number Diff line change
Expand Up @@ -738,8 +738,6 @@ int load_elf_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs,
/* OK, This is the point of no return */
info->end_data = 0;
info->end_code = 0;
info->start_mmap = (abi_ulong)ELF_START_MMAP;
info->mmap = 0;
elf_entry = (abi_ulong) elf_ex.e_entry;

/* XXX Join this with PT_INTERP search? */
Expand Down Expand Up @@ -813,7 +811,7 @@ int load_elf_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs,
bprm->stringp, &elf_ex, load_addr,
et_dyn_addr, interp_load_addr, info);
info->load_addr = reloc_func_desc;
info->start_brk = info->brk = elf_brk;
info->brk = elf_brk;
info->start_stack = bprm->p;
info->load_bias = 0;

Expand Down
1 change: 1 addition & 0 deletions bsd-user/freebsd/meson.build
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',
))
262 changes: 262 additions & 0 deletions bsd-user/freebsd/os-stat.c
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;
}

Loading

0 comments on commit 813bac3

Please sign in to comment.