Merge as_t structure into one and leave the differring parts in as_genarch_t.
[helenos.git] / kernel / arch / sparc64 / include / mm / tsb.h
blob3bba8fc7cbc2692868fd47b57d0dd7635e136282
1 /*
2 * Copyright (c) 2006 Jakub Jermar
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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
30 * @{
32 /** @file
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
46 * as.c as well */
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
52 #ifndef __ASM__
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 {
60 uint64_t value;
61 struct {
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
66 * this to 0.
68 unsigned : 9;
69 unsigned size : 3; /**< TSB size. Number of entries is
70 * 512 * 2^size. */
71 } __attribute__ ((packed));
72 } tsb_base_reg_t;
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. */
111 struct as;
112 struct pte;
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__ */
120 #endif
122 /** @}