mach_kpm.h revision fedab560fb18c85777c255ea9f445ffaf6830d30
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MACH_KPM_H
#define _MACH_KPM_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
/* kpm prototypes : routines defined in uts/sfmmu/vm/hat_sfmmu.c file */
extern kmutex_t *sfmmu_page_enter(page_t *);
extern void sfmmu_page_exit(kmutex_t *);
extern void sfmmu_cache_flush(pfn_t, int);
extern void sfmmu_page_cache_array(page_t *, int, int, pgcnt_t);
extern cpuset_t sfmmu_pageunload(page_t *, struct sf_hment *, int);
extern int tst_tnc(page_t *pp, pgcnt_t);
extern void conv_tnc(page_t *pp, int);
extern int fnd_mapping_sz(page_t *);
extern int sfmmu_page_spl_held(struct page *);
/* kpm prototypes : routines defined in uts/sun4[uv]/vm/mach_kpm.c file */
extern void sfmmu_kpm_pageunload(page_t *);
extern void sfmmu_kpm_vac_unload(page_t *, caddr_t);
extern void sfmmu_kpm_hme_unload(page_t *);
extern kpm_hlk_t *sfmmu_kpm_kpmp_enter(page_t *, pgcnt_t);
extern void sfmmu_kpm_kpmp_exit(kpm_hlk_t *kpmp);
extern void sfmmu_kpm_page_cache(page_t *, int, int);
/* flags for hat_pagecachectl */
#define HAT_CACHE 0x1
#define HAT_UNCACHE 0x2
#define HAT_TMPNC 0x4
/*
* kstat data
*/
struct sfmmu_global_stat sfmmu_global_stat;
/* kpm globals */
#ifdef DEBUG
/*
* Flush the TLB on kpm mapout. Note: Xcalls are used (again) for the
* required TLB shootdowns in this case, so handle w/ care. Off by default.
*/
int kpm_tlb_flush;
#endif /* DEBUG */
/*
* kpm_page lock hash.
* All slots should be used equally and 2 adjacent kpm_page_t's
* shouldn't have their mutexes in the same cache line.
*/
#ifdef DEBUG
int kpmp_hash_debug;
#define KPMP_HASH(kpp) (kpmp_hash_debug ? &kpmp_table[0] : &kpmp_table[ \
((uintptr_t)(kpp) + ((uintptr_t)(kpp) >> kpmp_shift)) \
& (kpmp_table_sz - 1)])
#else /* !DEBUG */
#define KPMP_HASH(kpp) &kpmp_table[ \
((uintptr_t)(kpp) + ((uintptr_t)(kpp) >> kpmp_shift)) \
& (kpmp_table_sz - 1)]
#endif /* DEBUG */
#ifdef DEBUG
#define KPMP_SHASH(kpp) (kpmp_hash_debug ? &kpmp_stable[0] : &kpmp_stable[ \
(((uintptr_t)(kpp) << kpmp_shift) + (uintptr_t)(kpp)) \
& (kpmp_stable_sz - 1)])
#else /* !DEBUG */
#define KPMP_SHASH(kpp) &kpmp_stable[ \
(((uintptr_t)(kpp) << kpmp_shift) + (uintptr_t)(kpp)) \
& (kpmp_stable_sz - 1)]
#endif /* DEBUG */
/*
* kpm virtual address to physical address
*/
#ifdef VAC
#define SFMMU_KPM_VTOP(vaddr, paddr) { \
uintptr_t r, v; \
\
r = ((vaddr) - kpm_vbase) >> (uintptr_t)kpm_size_shift; \
(paddr) = (vaddr) - kpm_vbase; \
if (r != 0) { \
v = ((uintptr_t)(vaddr) >> MMU_PAGESHIFT) & \
vac_colors_mask; \
(paddr) -= r << kpm_size_shift; \
if (r > v) \
(paddr) += (r - v) << MMU_PAGESHIFT; \
else \
(paddr) -= r << MMU_PAGESHIFT; \
} \
}
#else /* VAC */
#define SFMMU_KPM_VTOP(vaddr, paddr) { \
(paddr) = (vaddr) - kpm_vbase; \
}
#endif /* VAC */
#ifdef __cplusplus
}
#endif
#endif /* _MACH_KPM_H */