int amd64_get_mtrr(struct proc *p, void *args, register_t *retval) { struct amd64_get_mtrr_args ua; int error, n; if (mtrr_funcs == NULL) return ENOSYS; error = copyin(args, &ua, sizeof ua); if (error != 0) return error; error = copyin(ua.n, &n, sizeof n); if (error != 0) return error; error = mtrr_get(ua.mtrrp, &n, p, MTRR_GETSET_USER); copyout(&n, ua.n, sizeof (int)); return error; }
static int x86_64_get_mtrr32(struct lwp *l, void *args, register_t *retval) { struct x86_64_get_mtrr_args32 args32; int error, i; int32_t n; struct mtrr32 *m32p, m32; struct mtrr *m64p, *mp; size_t size; m64p = NULL; if (mtrr_funcs == NULL) return ENOSYS; error = kauth_authorize_machdep(l->l_cred, KAUTH_MACHDEP_MTRR_GET, NULL, NULL, NULL, NULL); if (error) return (error); error = copyin(args, &args32, sizeof args32); if (error != 0) return error; if (args32.mtrrp == 0) { n = (MTRR_I686_NFIXED_SOFT + MTRR_I686_NVAR_MAX); return copyout(&n, (void *)(uintptr_t)args32.n, sizeof n); } error = copyin((void *)(uintptr_t)args32.n, &n, sizeof n); if (error != 0) return error; if (n <= 0 || n > (MTRR_I686_NFIXED_SOFT + MTRR_I686_NVAR_MAX)) return EINVAL; size = n * sizeof(struct mtrr); m64p = kmem_zalloc(size, KM_SLEEP); if (m64p == NULL) { error = ENOMEM; goto fail; } error = mtrr_get(m64p, &n, l->l_proc, 0); if (error != 0) goto fail; m32p = (struct mtrr32 *)(uintptr_t)args32.mtrrp; mp = m64p; for (i = 0; i < n; i++) { m32.base = mp->base; m32.len = mp->len; m32.type = mp->type; m32.flags = mp->flags; m32.owner = mp->owner; error = copyout(&m32, m32p, sizeof m32); if (error != 0) break; mp++; m32p++; } fail: if (m64p != NULL) kmem_free(m64p, size); if (error != 0) n = 0; copyout(&n, (void *)(uintptr_t)args32.n, sizeof n); return error; }