source: mainline/kernel/arch/sparc64/src/mm/sun4u/as.c@ a35b458

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a35b458 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 5.7 KB
RevLine 
[ef67bab]1/*
[df4ed85]2 * Copyright (c) 2006 Jakub Jermar
[ef67bab]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 *
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.
16 *
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.
27 */
28
[ed166f7]29/** @addtogroup sparc64mm
[b45c443]30 * @{
31 */
32/** @file
33 */
34
[ef67bab]35#include <arch/mm/as.h>
[ed166f7]36#include <arch/mm/tlb.h>
[63e27ef]37#include <assert.h>
38#include <config.h>
[b3f8fb7]39#include <genarch/mm/page_ht.h>
[d0a0f12]40#include <genarch/mm/asid_fifo.h>
[57da95c]41
42#ifdef CONFIG_TSB
[da1bafb]43
[57da95c]44#include <arch/mm/tsb.h>
[29b2bbf]45#include <arch/asm.h>
46#include <mm/frame.h>
47#include <bitops.h>
48#include <macros.h>
[44a7ee5]49#include <mem.h>
[da1bafb]50
[92778f2]51#endif /* CONFIG_TSB */
52
[ef67bab]53/** Architecture dependent address space init. */
54void as_arch_init(void)
55{
[a9ac978]56 if (config.cpu_active == 1) {
57 as_operations = &as_ht_operations;
58 asid_fifo_init();
59 }
[ef67bab]60}
[b45c443]61
[b7fd2a0]62errno_t as_constructor_arch(as_t *as, unsigned int flags)
[29b2bbf]63{
64#ifdef CONFIG_TSB
[e08162b]65 uintptr_t tsb_base = frame_alloc(TSB_FRAMES, flags, TSB_SIZE - 1);
66 if (!tsb_base)
[ee6f434]67 return ENOMEM;
[e08162b]68
69 tsb_entry_t *tsb = (tsb_entry_t *) PA2KA(tsb_base);
70 memsetb(tsb, TSB_SIZE, 0);
[a35b458]71
[cd3b380]72 as->arch.itsb = tsb;
73 as->arch.dtsb = tsb + ITSB_ENTRY_COUNT;
[29b2bbf]74#endif
[a35b458]75
[ee6f434]76 return EOK;
[29b2bbf]77}
78
79int as_destructor_arch(as_t *as)
80{
81#ifdef CONFIG_TSB
[e08162b]82 frame_free(KA2PA((uintptr_t) as->arch.itsb), TSB_FRAMES);
[a35b458]83
[e08162b]84 return TSB_FRAMES;
[29b2bbf]85#else
86 return 0;
87#endif
88}
89
[b7fd2a0]90errno_t as_create_arch(as_t *as, unsigned int flags)
[29b2bbf]91{
92#ifdef CONFIG_TSB
[98000fb]93 tsb_invalidate(as, 0, (size_t) -1);
[29b2bbf]94#endif
[a35b458]95
[29b2bbf]96 return 0;
97}
98
[771cd22]99/** Perform sparc64-specific tasks when an address space becomes active on the
100 * processor.
[57da95c]101 *
102 * Install ASID and map TSBs.
103 *
104 * @param as Address space.
105 */
[ed166f7]106void as_install_arch(as_t *as)
107{
108 tlb_context_reg_t ctx;
[a35b458]109
[57da95c]110 /*
[879585a3]111 * Note that we don't and may not lock the address space. That's ok
112 * since we only read members that are currently read-only.
113 *
114 * Moreover, the as->asid is protected by asidlock, which is being held.
[da1bafb]115 *
[57da95c]116 */
[a35b458]117
[ed166f7]118 /*
[879585a3]119 * Write ASID to secondary context register. The primary context
120 * register has to be set from TL>0 so it will be filled from the
121 * secondary context register from the TL=1 code just before switch to
122 * userspace.
[da1bafb]123 *
[ed166f7]124 */
125 ctx.v = 0;
126 ctx.context = as->asid;
127 mmu_secondary_context_write(ctx.v);
[a35b458]128
[da1bafb]129#ifdef CONFIG_TSB
[29b2bbf]130 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);
[a35b458]131
[63e27ef]132 assert(as->arch.itsb);
133 assert(as->arch.dtsb);
[a35b458]134
[29b2bbf]135 uintptr_t tsb = (uintptr_t) as->arch.itsb;
[a35b458]136
[e08162b]137 if (!overlaps(tsb, TSB_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {
[57da95c]138 /*
[29b2bbf]139 * TSBs were allocated from memory not covered
140 * by the locked 4M kernel DTLB entry. We need
141 * to map both TSBs explicitly.
[da1bafb]142 *
[57da95c]143 */
[29b2bbf]144 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb);
145 dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true);
[57da95c]146 }
[a35b458]147
[29b2bbf]148 /*
149 * Setup TSB Base registers.
[da1bafb]150 *
[29b2bbf]151 */
[e08162b]152 tsb_base_reg_t tsb_base_reg;
[a35b458]153
[e08162b]154 tsb_base_reg.value = 0;
155 tsb_base_reg.size = TSB_BASE_REG_SIZE;
156 tsb_base_reg.split = 0;
[a35b458]157
[e08162b]158 tsb_base_reg.base = ((uintptr_t) as->arch.itsb) >> MMU_PAGE_WIDTH;
159 itsb_base_write(tsb_base_reg.value);
160 tsb_base_reg.base = ((uintptr_t) as->arch.dtsb) >> MMU_PAGE_WIDTH;
161 dtsb_base_write(tsb_base_reg.value);
[a35b458]162
[965dc18]163#if defined (US3)
164 /*
165 * Clear the extension registers.
166 * In HelenOS, primary and secondary context registers contain
167 * equal values and kernel misses (context 0, ie. the nucleus context)
168 * are excluded from the TSB miss handler, so it makes no sense
169 * to have separate TSBs for primary, secondary and nucleus contexts.
170 * Clearing the extension registers will ensure that the value of the
171 * TSB Base register will be used as an address of TSB, making the code
[da1bafb]172 * compatible with the US port.
173 *
[965dc18]174 */
175 itsb_primary_extension_write(0);
176 itsb_nucleus_extension_write(0);
177 dtsb_primary_extension_write(0);
178 dtsb_secondary_extension_write(0);
179 dtsb_nucleus_extension_write(0);
180#endif
[57da95c]181#endif
182}
183
[771cd22]184/** Perform sparc64-specific tasks when an address space is removed from the
185 * processor.
[57da95c]186 *
187 * Demap TSBs.
188 *
189 * @param as Address space.
190 */
191void as_deinstall_arch(as_t *as)
192{
193 /*
[879585a3]194 * Note that we don't and may not lock the address space. That's ok
195 * since we only read members that are currently read-only.
196 *
197 * Moreover, the as->asid is protected by asidlock, which is being held.
[da1bafb]198 *
[57da95c]199 */
[a35b458]200
[57da95c]201#ifdef CONFIG_TSB
[29b2bbf]202 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH);
[a35b458]203
[63e27ef]204 assert(as->arch.itsb);
205 assert(as->arch.dtsb);
[a35b458]206
[29b2bbf]207 uintptr_t tsb = (uintptr_t) as->arch.itsb;
[a35b458]208
[e08162b]209 if (!overlaps(tsb, TSB_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {
[29b2bbf]210 /*
211 * TSBs were allocated from memory not covered
212 * by the locked 4M kernel DTLB entry. We need
213 * to demap the entry installed by as_install_arch().
214 */
215 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb);
[57da95c]216 }
217#endif
[ed166f7]218}
219
220/** @}
[b45c443]221 */
Note: See TracBrowser for help on using the repository browser.