1/*- 2 * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: releng/11.0/lib/libkvm/kvm_sparc64.h 291406 2015-11-27 18:58:26Z jhb $ 27 */ 28 29#ifndef __KVM_SPARC64_H__ 30#define __KVM_SPARC64_H__ 31 32#ifdef __sparc64__ 33#include <sys/queue.h> 34#include <machine/tlb.h> 35#include <machine/tte.h> 36#include <vm/vm.h> 37#include <vm/vm_param.h> 38#endif 39 40#define SPARC64_PAGE_SHIFT 13 41#define SPARC64_PAGE_SIZE (1 << SPARC64_PAGE_SHIFT) 42#define SPARC64_PAGE_MASK (SPARC64_PAGE_SIZE - 1) 43 44#define SPARC64_MIN_DIRECT_ADDRESS (0xfffff80000000000) 45 46#define SPARC64_DIRECT_ADDRESS_BITS (43) 47#define SPARC64_DIRECT_ADDRESS_MASK \ 48 (((uint64_t)1 << SPARC64_DIRECT_ADDRESS_BITS) - 1) 49 50#define SPARC64_DIRECT_TO_PHYS(va) ((va) & SPARC64_DIRECT_ADDRESS_MASK) 51 52#define SPARC64_TTE_SHIFT (5) 53 54#define SPARC64_TD_SIZE_SHIFT (61) 55#define SPARC64_TD_PA_SHIFT (13) 56 57#define SPARC64_TD_SIZE_BITS (2) 58#define SPARC64_TD_PA_CH_BITS (30) /* US-III{,i,+}, US-IV{,+}, SPARC64 V */ 59#define SPARC64_TD_PA_BITS SPARC64_TD_PA_CH_BITS 60 61#define SPARC64_TD_SIZE_MASK (((uint64_t)1 << SPARC64_TD_SIZE_BITS) - 1) 62#define SPARC64_TD_PA_MASK (((uint64_t)1 << SPARC64_TD_PA_BITS) - 1) 63 64#define SPARC64_TD_V ((uint64_t)1 << 63) 65 66#define SPARC64_TV_SIZE_BITS (SPARC64_TD_SIZE_BITS) 67#define SPARC64_TV_VPN(va, sz) \ 68 ((((va) >> SPARC64_TTE_PAGE_SHIFT(sz)) << SPARC64_TV_SIZE_BITS) | sz) 69 70#define SPARC64_TTE_SIZE_SPREAD (3) 71#define SPARC64_TTE_PAGE_SHIFT(sz) \ 72 (SPARC64_PAGE_SHIFT + ((sz) * SPARC64_TTE_SIZE_SPREAD)) 73 74#define SPARC64_TTE_GET_SIZE(tp) \ 75 (((tp)->tte_data >> SPARC64_TD_SIZE_SHIFT) & SPARC64_TD_SIZE_MASK) 76 77#define SPARC64_TTE_GET_PA(tp) \ 78 ((tp)->tte_data & (SPARC64_TD_PA_MASK << SPARC64_TD_PA_SHIFT)) 79 80struct sparc64_tte { 81 uint64_t tte_vpn; 82 uint64_t tte_data; 83}; 84 85static __inline int 86sparc64_tte_match(struct sparc64_tte *tp, kvaddr_t va) 87{ 88 89 return (((tp->tte_data & SPARC64_TD_V) != 0) && 90 (tp->tte_vpn == SPARC64_TV_VPN(va, SPARC64_TTE_GET_SIZE(tp)))); 91} 92 93#ifdef __sparc64__ 94_Static_assert(PAGE_SHIFT == SPARC64_PAGE_SHIFT, "PAGE_SHIFT mismatch"); 95_Static_assert(PAGE_SIZE == SPARC64_PAGE_SIZE, "PAGE_SIZE mismatch"); 96_Static_assert(PAGE_MASK == SPARC64_PAGE_MASK, "PAGE_MASK mismatch"); 97_Static_assert(VM_MIN_DIRECT_ADDRESS == SPARC64_MIN_DIRECT_ADDRESS, 98 "VM_MIN_DIRECT_ADDRESS mismatch"); 99_Static_assert(TLB_DIRECT_ADDRESS_BITS == SPARC64_DIRECT_ADDRESS_BITS, 100 "TLB_DIRECT_ADDRESS_BITS mismatch"); 101_Static_assert(TLB_DIRECT_ADDRESS_MASK == SPARC64_DIRECT_ADDRESS_MASK, 102 "TLB_DIRECT_ADDRESS_MASK mismatch"); 103_Static_assert(TTE_SHIFT == SPARC64_TTE_SHIFT, "TTE_SHIFT mismatch"); 104_Static_assert(TD_SIZE_SHIFT == SPARC64_TD_SIZE_SHIFT, 105 "TD_SIZE_SHIFT mismatch"); 106_Static_assert(TD_PA_SHIFT == SPARC64_TD_PA_SHIFT, 107 "TD_PA_SHIFT mismatch"); 108_Static_assert(TD_SIZE_BITS == SPARC64_TD_SIZE_BITS, "TD_SIZE_BITS mismatch"); 109_Static_assert(TD_PA_BITS == SPARC64_TD_PA_BITS, "TD_PA_BITS mismatch"); 110_Static_assert(TD_SIZE_MASK == SPARC64_TD_SIZE_MASK, "TD_SIZE_MASK mismatch"); 111_Static_assert(TD_PA_MASK == SPARC64_TD_PA_MASK, "TD_PA_MASK mismatch"); 112_Static_assert(TD_V == SPARC64_TD_V, "TD_V mismatch"); 113_Static_assert(TV_SIZE_BITS == SPARC64_TV_SIZE_BITS, "TV_SIZE_BITS mismatch"); 114_Static_assert(TTE_SIZE_SPREAD == SPARC64_TTE_SIZE_SPREAD, 115 "TTE_SIZE_SPREAD mismatch"); 116#endif 117 118#endif /* !__KVM_SPARC64_H__ */ 119