1291406Sjhb/*- 2291406Sjhb * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org> 3291406Sjhb * All rights reserved. 4291406Sjhb * 5291406Sjhb * Redistribution and use in source and binary forms, with or without 6291406Sjhb * modification, are permitted provided that the following conditions 7291406Sjhb * are met: 8291406Sjhb * 1. Redistributions of source code must retain the above copyright 9291406Sjhb * notice, this list of conditions and the following disclaimer. 10291406Sjhb * 2. Redistributions in binary form must reproduce the above copyright 11291406Sjhb * notice, this list of conditions and the following disclaimer in the 12291406Sjhb * documentation and/or other materials provided with the distribution. 13291406Sjhb * 14291406Sjhb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15291406Sjhb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16291406Sjhb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17291406Sjhb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18291406Sjhb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19291406Sjhb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20291406Sjhb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21291406Sjhb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22291406Sjhb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23291406Sjhb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24291406Sjhb * SUCH DAMAGE. 25291406Sjhb * 26291406Sjhb * $FreeBSD: releng/11.0/lib/libkvm/kvm_sparc64.h 291406 2015-11-27 18:58:26Z jhb $ 27291406Sjhb */ 28291406Sjhb 29291406Sjhb#ifndef __KVM_SPARC64_H__ 30291406Sjhb#define __KVM_SPARC64_H__ 31291406Sjhb 32291406Sjhb#ifdef __sparc64__ 33291406Sjhb#include <sys/queue.h> 34291406Sjhb#include <machine/tlb.h> 35291406Sjhb#include <machine/tte.h> 36291406Sjhb#include <vm/vm.h> 37291406Sjhb#include <vm/vm_param.h> 38291406Sjhb#endif 39291406Sjhb 40291406Sjhb#define SPARC64_PAGE_SHIFT 13 41291406Sjhb#define SPARC64_PAGE_SIZE (1 << SPARC64_PAGE_SHIFT) 42291406Sjhb#define SPARC64_PAGE_MASK (SPARC64_PAGE_SIZE - 1) 43291406Sjhb 44291406Sjhb#define SPARC64_MIN_DIRECT_ADDRESS (0xfffff80000000000) 45291406Sjhb 46291406Sjhb#define SPARC64_DIRECT_ADDRESS_BITS (43) 47291406Sjhb#define SPARC64_DIRECT_ADDRESS_MASK \ 48291406Sjhb (((uint64_t)1 << SPARC64_DIRECT_ADDRESS_BITS) - 1) 49291406Sjhb 50291406Sjhb#define SPARC64_DIRECT_TO_PHYS(va) ((va) & SPARC64_DIRECT_ADDRESS_MASK) 51291406Sjhb 52291406Sjhb#define SPARC64_TTE_SHIFT (5) 53291406Sjhb 54291406Sjhb#define SPARC64_TD_SIZE_SHIFT (61) 55291406Sjhb#define SPARC64_TD_PA_SHIFT (13) 56291406Sjhb 57291406Sjhb#define SPARC64_TD_SIZE_BITS (2) 58291406Sjhb#define SPARC64_TD_PA_CH_BITS (30) /* US-III{,i,+}, US-IV{,+}, SPARC64 V */ 59291406Sjhb#define SPARC64_TD_PA_BITS SPARC64_TD_PA_CH_BITS 60291406Sjhb 61291406Sjhb#define SPARC64_TD_SIZE_MASK (((uint64_t)1 << SPARC64_TD_SIZE_BITS) - 1) 62291406Sjhb#define SPARC64_TD_PA_MASK (((uint64_t)1 << SPARC64_TD_PA_BITS) - 1) 63291406Sjhb 64291406Sjhb#define SPARC64_TD_V ((uint64_t)1 << 63) 65291406Sjhb 66291406Sjhb#define SPARC64_TV_SIZE_BITS (SPARC64_TD_SIZE_BITS) 67291406Sjhb#define SPARC64_TV_VPN(va, sz) \ 68291406Sjhb ((((va) >> SPARC64_TTE_PAGE_SHIFT(sz)) << SPARC64_TV_SIZE_BITS) | sz) 69291406Sjhb 70291406Sjhb#define SPARC64_TTE_SIZE_SPREAD (3) 71291406Sjhb#define SPARC64_TTE_PAGE_SHIFT(sz) \ 72291406Sjhb (SPARC64_PAGE_SHIFT + ((sz) * SPARC64_TTE_SIZE_SPREAD)) 73291406Sjhb 74291406Sjhb#define SPARC64_TTE_GET_SIZE(tp) \ 75291406Sjhb (((tp)->tte_data >> SPARC64_TD_SIZE_SHIFT) & SPARC64_TD_SIZE_MASK) 76291406Sjhb 77291406Sjhb#define SPARC64_TTE_GET_PA(tp) \ 78291406Sjhb ((tp)->tte_data & (SPARC64_TD_PA_MASK << SPARC64_TD_PA_SHIFT)) 79291406Sjhb 80291406Sjhbstruct sparc64_tte { 81291406Sjhb uint64_t tte_vpn; 82291406Sjhb uint64_t tte_data; 83291406Sjhb}; 84291406Sjhb 85291406Sjhbstatic __inline int 86291406Sjhbsparc64_tte_match(struct sparc64_tte *tp, kvaddr_t va) 87291406Sjhb{ 88291406Sjhb 89291406Sjhb return (((tp->tte_data & SPARC64_TD_V) != 0) && 90291406Sjhb (tp->tte_vpn == SPARC64_TV_VPN(va, SPARC64_TTE_GET_SIZE(tp)))); 91291406Sjhb} 92291406Sjhb 93291406Sjhb#ifdef __sparc64__ 94291406Sjhb_Static_assert(PAGE_SHIFT == SPARC64_PAGE_SHIFT, "PAGE_SHIFT mismatch"); 95291406Sjhb_Static_assert(PAGE_SIZE == SPARC64_PAGE_SIZE, "PAGE_SIZE mismatch"); 96291406Sjhb_Static_assert(PAGE_MASK == SPARC64_PAGE_MASK, "PAGE_MASK mismatch"); 97291406Sjhb_Static_assert(VM_MIN_DIRECT_ADDRESS == SPARC64_MIN_DIRECT_ADDRESS, 98291406Sjhb "VM_MIN_DIRECT_ADDRESS mismatch"); 99291406Sjhb_Static_assert(TLB_DIRECT_ADDRESS_BITS == SPARC64_DIRECT_ADDRESS_BITS, 100291406Sjhb "TLB_DIRECT_ADDRESS_BITS mismatch"); 101291406Sjhb_Static_assert(TLB_DIRECT_ADDRESS_MASK == SPARC64_DIRECT_ADDRESS_MASK, 102291406Sjhb "TLB_DIRECT_ADDRESS_MASK mismatch"); 103291406Sjhb_Static_assert(TTE_SHIFT == SPARC64_TTE_SHIFT, "TTE_SHIFT mismatch"); 104291406Sjhb_Static_assert(TD_SIZE_SHIFT == SPARC64_TD_SIZE_SHIFT, 105291406Sjhb "TD_SIZE_SHIFT mismatch"); 106291406Sjhb_Static_assert(TD_PA_SHIFT == SPARC64_TD_PA_SHIFT, 107291406Sjhb "TD_PA_SHIFT mismatch"); 108291406Sjhb_Static_assert(TD_SIZE_BITS == SPARC64_TD_SIZE_BITS, "TD_SIZE_BITS mismatch"); 109291406Sjhb_Static_assert(TD_PA_BITS == SPARC64_TD_PA_BITS, "TD_PA_BITS mismatch"); 110291406Sjhb_Static_assert(TD_SIZE_MASK == SPARC64_TD_SIZE_MASK, "TD_SIZE_MASK mismatch"); 111291406Sjhb_Static_assert(TD_PA_MASK == SPARC64_TD_PA_MASK, "TD_PA_MASK mismatch"); 112291406Sjhb_Static_assert(TD_V == SPARC64_TD_V, "TD_V mismatch"); 113291406Sjhb_Static_assert(TV_SIZE_BITS == SPARC64_TV_SIZE_BITS, "TV_SIZE_BITS mismatch"); 114291406Sjhb_Static_assert(TTE_SIZE_SPREAD == SPARC64_TTE_SIZE_SPREAD, 115291406Sjhb "TTE_SIZE_SPREAD mismatch"); 116291406Sjhb#endif 117291406Sjhb 118291406Sjhb#endif /* !__KVM_SPARC64_H__ */ 119