2 * Copyright (c) 2006 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup sparc64mm
35 #ifndef KERN_sparc64_TSB_H_
36 #define KERN_sparc64_TSB_H_
39 * ITSB abd DTSB will claim 64K of memory, which
40 * is a nice number considered that it is one of
41 * the page sizes supported by hardware, which,
42 * again, is nice because TSBs need to be locked
43 * in TLBs - only one TLB entry will do.
45 #define TSB_SIZE 2 /* when changing this, change
47 #define ITSB_ENTRY_COUNT (512 * (1 << TSB_SIZE))
48 #define DTSB_ENTRY_COUNT (512 * (1 << TSB_SIZE))
50 #define TSB_TAG_TARGET_CONTEXT_SHIFT 48
54 #include <arch/mm/tte.h>
55 #include <arch/mm/mmu.h>
56 #include <arch/types.h>
58 /** TSB Base register. */
59 typedef union tsb_base_reg
{
62 uint64_t base
: 51; /**< TSB base address, bits 63:13. */
63 unsigned split
: 1; /**< Split vs. common TSB for 8K and 64K
64 * pages. HelenOS uses only 8K pages
65 * for user mappings, so we always set
69 unsigned size
: 3; /**< TSB size. Number of entries is
71 } __attribute__ ((packed
));
74 /** Read ITSB Base register.
76 * @return Content of the ITSB Base register.
78 static inline uint64_t itsb_base_read(void)
80 return asi_u64_read(ASI_IMMU
, VA_IMMU_TSB_BASE
);
83 /** Read DTSB Base register.
85 * @return Content of the DTSB Base register.
87 static inline uint64_t dtsb_base_read(void)
89 return asi_u64_read(ASI_DMMU
, VA_DMMU_TSB_BASE
);
92 /** Write ITSB Base register.
94 * @param v New content of the ITSB Base register.
96 static inline void itsb_base_write(uint64_t v
)
98 asi_u64_write(ASI_IMMU
, VA_IMMU_TSB_BASE
, v
);
101 /** Write DTSB Base register.
103 * @param v New content of the DTSB Base register.
105 static inline void dtsb_base_write(uint64_t v
)
107 asi_u64_write(ASI_DMMU
, VA_DMMU_TSB_BASE
, v
);
110 /* Forward declarations. */
114 extern void tsb_invalidate(struct as
*as
, uintptr_t page
, count_t pages
);
115 extern void itsb_pte_copy(struct pte
*t
);
116 extern void dtsb_pte_copy(struct pte
*t
, bool ro
);
118 #endif /* !def __ASM__ */