/*ARGSUSED*/ static int fm_ioctl_page_retire(int cmd, nvlist_t *invl, nvlist_t **onvlp) { uint64_t pa; nvlist_t *fmri; int err; if (is_i86xpv) return (ENOTSUP); if ((err = nvlist_lookup_nvlist(invl, FM_PAGE_RETIRE_FMRI, &fmri)) != 0) return (err); if ((err = fm_get_paddr(fmri, &pa)) != 0) return (err); switch (cmd) { case FM_IOC_PAGE_STATUS: return (page_retire_check(pa, NULL)); case FM_IOC_PAGE_RETIRE: return (page_retire(pa, PR_FMA)); case FM_IOC_PAGE_UNRETIRE: return (page_unretire(pa)); } return (ENOTTY); }
/* * Given a PA, execute the given page retire command on it. */ static int mmioctl_page_retire(int cmd, intptr_t data) { extern int page_retire_test(void); uint64_t pa; if (copyin((void *)data, &pa, sizeof (uint64_t))) { return (EFAULT); } switch (cmd) { case MEM_PAGE_ISRETIRED: return (page_retire_check(pa, NULL)); case MEM_PAGE_UNRETIRE: return (page_unretire(pa)); case MEM_PAGE_RETIRE: return (page_retire(pa, PR_FMA)); case MEM_PAGE_RETIRE_MCE: return (page_retire(pa, PR_MCE)); case MEM_PAGE_RETIRE_UE: return (page_retire(pa, PR_UE)); case MEM_PAGE_GETERRORS: { uint64_t page_errors; int rc = page_retire_check(pa, &page_errors); if (copyout(&page_errors, (void *)data, sizeof (uint64_t))) { return (EFAULT); } return (rc); } case MEM_PAGE_RETIRE_TEST: return (page_retire_test()); } return (EINVAL); }