kpme
kaddr = (caddr_t)hat_kpm_mapin(pp, (struct kpme *)NULL);
hat_kpm_mapout(pp, (struct kpme *)NULL, kaddr);
caddr_t hat_kpm_mapin(struct page *, struct kpme *);
void hat_kpm_mapout(struct page *, struct kpme *, caddr_t);
struct kpme;
struct kpme *kpe_next;
struct kpme *kpe_prev;
struct kpme *p_kpmelist; /* kpm specific mapping info */
segkpm_mapout_validkpme(struct kpme *kpme)
if ((pp = kpme->kpe_page) == NULL) {
if (kpme->kpe_page == NULL) {
hat_kpm_mapout(pp, kpme, vaddr);
void segkpm_mapout_validkpme(struct kpme *kpme) {}
extern void segkpm_mapout_validkpme(struct kpme *);
struct kpme *kpme;
kpme = GET_KPME(smp);
pp = kpme->kpe_page;
if (kpme->kpe_page == NULL) {
struct kpme *kpme;
kpme = GET_KPME(smp);
if (kpme->kpe_page == pp) {
} else if (kpme->kpe_page == NULL) {
baseaddr = hat_kpm_mapin(pp, kpme);
"kpme page, kpme %p", (void *)kpme);
kpme = GET_KPME(smp);
if (kpme->kpe_page == pp) {
} else if (kpme->kpe_page == NULL) {
baseaddr = hat_kpm_mapin(pp, kpme);
"VOP_GETPAGE, kpme %p", (void *)kpme);
struct kpme *kpme;
kpme = GET_KPME(smp);
if (!newpage && kpme->kpe_page == pp)
base = hat_kpm_mapin(pp, kpme);
struct kpme sm_kpme; /* segkpm */
#define GET_KPME(smp) ((struct kpme *)NULL)
hat_kpm_mapin(struct page *pp, struct kpme *kpme)
hat_kpm_mapout(struct page *pp, struct kpme *kpme, caddr_t vaddr)
if (kpme != NULL) {
if ((sfmmu_kpme_lookup(kpme, pp)) == 0)
sfmmu_kpme_add(kpme, pp);
hat_kpm_mapout(struct page *pp, struct kpme *kpme, caddr_t vaddr)
if (kpme != NULL) {
ASSERT(pp == kpme->kpe_page);
pp = kpme->kpe_page;
if (sfmmu_kpme_lookup(kpme, pp) == 0)
sfmmu_kpme_sub(kpme, pp);
struct kpme *kpme, *nkpme;
for (kpme = pp->p_kpmelist; kpme; kpme = nkpme) {
ASSERT(kpme->kpe_page == pp);
"kpme=%p", (void *)pp, (void *)kpme);
nkpme = kpme->kpe_next;
sfmmu_kpme_sub(kpme, pp);
static int sfmmu_kpme_lookup(struct kpme *, page_t *);
static void sfmmu_kpme_add(struct kpme *, page_t *);
static void sfmmu_kpme_sub(struct kpme *, page_t *);
sfmmu_kpme_lookup(struct kpme *kpme, page_t *pp)
struct kpme *p;
if (p == kpme)
sfmmu_kpme_add(struct kpme *kpme, page_t *pp)
kpme->kpe_prev = NULL;
kpme->kpe_next = pp->p_kpmelist;
pp->p_kpmelist->kpe_prev = kpme;
pp->p_kpmelist = kpme;
kpme->kpe_page = pp;
sfmmu_kpme_sub(struct kpme *kpme, page_t *pp)
if (kpme->kpe_prev) {
ASSERT(pp->p_kpmelist != kpme);
ASSERT(kpme->kpe_prev->kpe_page == pp);
kpme->kpe_prev->kpe_next = kpme->kpe_next;
ASSERT(pp->p_kpmelist == kpme);
pp->p_kpmelist = kpme->kpe_next;
if (kpme->kpe_next) {
ASSERT(kpme->kpe_next->kpe_page == pp);
kpme->kpe_next->kpe_prev = kpme->kpe_prev;
kpme->kpe_next = kpme->kpe_prev = NULL;
kpme->kpe_page = NULL;
hat_kpm_mapin(struct page *pp, struct kpme *kpme)
hat_kpm_mapout(struct page *pp, struct kpme *kpme, caddr_t vaddr)
hat_kpm_mapin(struct page *pp, struct kpme *kpme)