source: mainline/kernel/arch/sparc64/src/mm/cache_asm.S@ cf5ddf6

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since cf5ddf6 was 9f63a83, checked in by Jakub Jermar <jakub@…>, 19 years ago

Beat the implicit illegal virtual alias created by reusing userspace frames.
In the anonymous and ELF backends, if the architecture has virtually indexed D-cache,
selectively flush cachelines belonging to the frame being freed.
This fixes Ticket #20.

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/*
2 * Copyright (c) 2006 Jakub Jermar
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
29#include <arch/arch.h>
30
31#define DCACHE_SIZE (16 * 1024)
32#define DCACHE_LINE_SIZE 32
33
34#define DCACHE_TAG_SHIFT 2
35
36.register %g2, #scratch
37.register %g3, #scratch
38
39/** Flush the whole D-cache. */
40.global dcache_flush
41dcache_flush:
42 set (DCACHE_SIZE - DCACHE_LINE_SIZE), %g1
43 stxa %g0, [%g1] ASI_DCACHE_TAG
440: membar #Sync
45 subcc %g1, DCACHE_LINE_SIZE, %g1
46 bnz,pt %xcc, 0b
47 stxa %g0, [%g1] ASI_DCACHE_TAG
48 retl
49 membar #Sync
50
51/** Flush only D-cache lines of one virtual color.
52 *
53 * @param o0 Virtual color to be flushed.
54 */
55.global dcache_flush_color
56dcache_flush_color:
57 mov (DCACHE_SIZE / DCACHE_LINE_SIZE) / 2, %g1
58 set DCACHE_SIZE / 2, %g2
59 sllx %g2, %o0, %g2
60 sub %g2, DCACHE_LINE_SIZE, %g2
610: stxa %g0, [%g2] ASI_DCACHE_TAG
62 membar #Sync
63 subcc %g1, 1, %g1
64 bnz,pt %xcc, 0b
65 sub %g2, DCACHE_LINE_SIZE, %g2
66 retl
67 nop
68
69/** Flush only D-cache lines of one virtual color and one tag.
70 *
71 * @param o0 Virtual color to lookup the tag.
72 * @param o1 Tag of the cachelines to be flushed.
73 */
74.global dcache_flush_tag
75dcache_flush_tag:
76 mov (DCACHE_SIZE / DCACHE_LINE_SIZE) / 2, %g1
77 set DCACHE_SIZE / 2, %g2
78 sllx %g2, %o0, %g2
79 sub %g2, DCACHE_LINE_SIZE, %g2
800: ldxa [%g2] ASI_DCACHE_TAG, %g3
81 srlx %g3, DCACHE_TAG_SHIFT, %g3
82 cmp %g3, %o1
83 bnz 1f
84 nop
85 stxa %g0, [%g2] ASI_DCACHE_TAG
86 membar #Sync
871: subcc %g1, 1, %g1
88 bnz,pt %xcc, 0b
89 sub %g2, DCACHE_LINE_SIZE, %g2
90 retl
91 nop
Note: See TracBrowser for help on using the repository browser.