Esempio n. 1
0
/*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);
}
Esempio n. 2
0
/*
 * 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);
}