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