bsd-user: Implement getrlimit(2) and setrlimit(2)

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
Message-Id: <20230925182425.3163-15-kariem.taha2.7@gmail.com>
This commit is contained in:
Stacey Son 2023-09-25 21:24:11 +03:00 committed by Warner Losh
parent 59e801efdf
commit faba8e123f
2 changed files with 67 additions and 0 deletions

View File

@ -137,4 +137,63 @@ static inline abi_long do_bsd_getrusage(abi_long who, abi_ulong target_addr)
return ret;
}
/* getrlimit(2) */
static inline abi_long do_bsd_getrlimit(abi_long arg1, abi_ulong arg2)
{
abi_long ret;
int resource = target_to_host_resource(arg1);
struct target_rlimit *target_rlim;
struct rlimit rlim;
switch (resource) {
case RLIMIT_STACK:
rlim.rlim_cur = target_dflssiz;
rlim.rlim_max = target_maxssiz;
ret = 0;
break;
case RLIMIT_DATA:
rlim.rlim_cur = target_dfldsiz;
rlim.rlim_max = target_maxdsiz;
ret = 0;
break;
default:
ret = get_errno(getrlimit(resource, &rlim));
break;
}
if (!is_error(ret)) {
if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) {
return -TARGET_EFAULT;
}
target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
unlock_user_struct(target_rlim, arg2, 1);
}
return ret;
}
/* setrlimit(2) */
static inline abi_long do_bsd_setrlimit(abi_long arg1, abi_ulong arg2)
{
abi_long ret;
int resource = target_to_host_resource(arg1);
struct target_rlimit *target_rlim;
struct rlimit rlim;
if (RLIMIT_STACK == resource) {
/* XXX We should, maybe, allow the stack size to shrink */
ret = -TARGET_EPERM;
} else {
if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) {
return -TARGET_EFAULT;
}
rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur);
rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max);
unlock_user_struct(target_rlim, arg2, 0);
ret = get_errno(setrlimit(resource, &rlim));
}
return ret;
}
#endif /* !BSD_PROC_H_ */

View File

@ -247,6 +247,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
ret = do_bsd_getrusage(arg1, arg2);
break;
case TARGET_FREEBSD_NR_getrlimit: /* getrlimit(2) */
ret = do_bsd_getrlimit(arg1, arg2);
break;
case TARGET_FREEBSD_NR_setrlimit: /* setrlimit(2) */
ret = do_bsd_setrlimit(arg1, arg2);
break;
/*
* File system calls.