10caa3768SStacey Son /* 20caa3768SStacey Son * BSD process related system call helpers 30caa3768SStacey Son * 40caa3768SStacey Son * Copyright (c) 2013-14 Stacey D. Son 50caa3768SStacey Son * 60caa3768SStacey Son * This program is free software; you can redistribute it and/or modify 70caa3768SStacey Son * it under the terms of the GNU General Public License as published by 80caa3768SStacey Son * the Free Software Foundation; either version 2 of the License, or 90caa3768SStacey Son * (at your option) any later version. 100caa3768SStacey Son * 110caa3768SStacey Son * This program is distributed in the hope that it will be useful, 120caa3768SStacey Son * but WITHOUT ANY WARRANTY; without even the implied warranty of 130caa3768SStacey Son * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 140caa3768SStacey Son * GNU General Public License for more details. 150caa3768SStacey Son * 160caa3768SStacey Son * You should have received a copy of the GNU General Public License 170caa3768SStacey Son * along with this program; if not, see <http://www.gnu.org/licenses/>. 180caa3768SStacey Son */ 190caa3768SStacey Son #include "qemu/osdep.h" 200caa3768SStacey Son 210caa3768SStacey Son #include <sys/param.h> 220caa3768SStacey Son #include <sys/types.h> 230caa3768SStacey Son #include <sys/cpuset.h> 240caa3768SStacey Son #include <sys/resource.h> 250caa3768SStacey Son #include <sys/wait.h> 260caa3768SStacey Son 270caa3768SStacey Son #include "qemu.h" 280caa3768SStacey Son #include "qemu-bsd.h" 290caa3768SStacey Son #include "signal-common.h" 300caa3768SStacey Son 310caa3768SStacey Son #include "bsd-proc.h" 320caa3768SStacey Son 330caa3768SStacey Son /* 340caa3768SStacey Son * resource/rusage conversion 350caa3768SStacey Son */ 360caa3768SStacey Son int target_to_host_resource(int code) 370caa3768SStacey Son { 380caa3768SStacey Son return code; 390caa3768SStacey Son } 400caa3768SStacey Son 41550fc701SStacey Son rlim_t target_to_host_rlim(abi_llong target_rlim) 42550fc701SStacey Son { 43550fc701SStacey Son return tswap64(target_rlim); 44550fc701SStacey Son } 45550fc701SStacey Son 46550fc701SStacey Son abi_llong host_to_target_rlim(rlim_t rlim) 47550fc701SStacey Son { 48550fc701SStacey Son return tswap64(rlim); 49550fc701SStacey Son } 50550fc701SStacey Son 51*66c51d63SStacey Son void h2g_rusage(const struct rusage *rusage, 52*66c51d63SStacey Son struct target_freebsd_rusage *target_rusage) 53*66c51d63SStacey Son { 54*66c51d63SStacey Son __put_user(rusage->ru_utime.tv_sec, &target_rusage->ru_utime.tv_sec); 55*66c51d63SStacey Son __put_user(rusage->ru_utime.tv_usec, &target_rusage->ru_utime.tv_usec); 56*66c51d63SStacey Son 57*66c51d63SStacey Son __put_user(rusage->ru_stime.tv_sec, &target_rusage->ru_stime.tv_sec); 58*66c51d63SStacey Son __put_user(rusage->ru_stime.tv_usec, &target_rusage->ru_stime.tv_usec); 59*66c51d63SStacey Son 60*66c51d63SStacey Son __put_user(rusage->ru_maxrss, &target_rusage->ru_maxrss); 61*66c51d63SStacey Son __put_user(rusage->ru_idrss, &target_rusage->ru_idrss); 62*66c51d63SStacey Son __put_user(rusage->ru_idrss, &target_rusage->ru_idrss); 63*66c51d63SStacey Son __put_user(rusage->ru_isrss, &target_rusage->ru_isrss); 64*66c51d63SStacey Son __put_user(rusage->ru_minflt, &target_rusage->ru_minflt); 65*66c51d63SStacey Son __put_user(rusage->ru_majflt, &target_rusage->ru_majflt); 66*66c51d63SStacey Son __put_user(rusage->ru_nswap, &target_rusage->ru_nswap); 67*66c51d63SStacey Son __put_user(rusage->ru_inblock, &target_rusage->ru_inblock); 68*66c51d63SStacey Son __put_user(rusage->ru_oublock, &target_rusage->ru_oublock); 69*66c51d63SStacey Son __put_user(rusage->ru_msgsnd, &target_rusage->ru_msgsnd); 70*66c51d63SStacey Son __put_user(rusage->ru_msgrcv, &target_rusage->ru_msgrcv); 71*66c51d63SStacey Son __put_user(rusage->ru_nsignals, &target_rusage->ru_nsignals); 72*66c51d63SStacey Son __put_user(rusage->ru_nvcsw, &target_rusage->ru_nvcsw); 73*66c51d63SStacey Son __put_user(rusage->ru_nivcsw, &target_rusage->ru_nivcsw); 74*66c51d63SStacey Son } 75*66c51d63SStacey Son 76*66c51d63SStacey Son abi_long host_to_target_rusage(abi_ulong target_addr, 77*66c51d63SStacey Son const struct rusage *rusage) 78*66c51d63SStacey Son { 79*66c51d63SStacey Son struct target_freebsd_rusage *target_rusage; 80*66c51d63SStacey Son 81*66c51d63SStacey Son if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0)) { 82*66c51d63SStacey Son return -TARGET_EFAULT; 83*66c51d63SStacey Son } 84*66c51d63SStacey Son h2g_rusage(rusage, target_rusage); 85*66c51d63SStacey Son unlock_user_struct(target_rusage, target_addr, 1); 86*66c51d63SStacey Son 87*66c51d63SStacey Son return 0; 88*66c51d63SStacey Son } 89*66c51d63SStacey Son 90*66c51d63SStacey Son abi_long host_to_target_wrusage(abi_ulong target_addr, 91*66c51d63SStacey Son const struct __wrusage *wrusage) 92*66c51d63SStacey Son { 93*66c51d63SStacey Son struct target_freebsd__wrusage *target_wrusage; 94*66c51d63SStacey Son 95*66c51d63SStacey Son if (!lock_user_struct(VERIFY_WRITE, target_wrusage, target_addr, 0)) { 96*66c51d63SStacey Son return -TARGET_EFAULT; 97*66c51d63SStacey Son } 98*66c51d63SStacey Son h2g_rusage(&wrusage->wru_self, &target_wrusage->wru_self); 99*66c51d63SStacey Son h2g_rusage(&wrusage->wru_children, &target_wrusage->wru_children); 100*66c51d63SStacey Son unlock_user_struct(target_wrusage, target_addr, 1); 101*66c51d63SStacey Son 102*66c51d63SStacey Son return 0; 103*66c51d63SStacey Son } 104*66c51d63SStacey Son 105