Ignore:
Timestamp:
2007-01-19T12:21:27Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
718d600
Parents:
81cfefa
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/mm/cache_asm.S

    r81cfefa r9f63a83  
    2929#include <arch/arch.h>
    3030
    31 #define DCACHE_SIZE             (16*1024)
     31#define DCACHE_SIZE             (16 * 1024)
    3232#define DCACHE_LINE_SIZE        32     
    3333
     34#define DCACHE_TAG_SHIFT        2
     35
     36.register %g2, #scratch
     37.register %g3, #scratch
     38
     39/** Flush the whole D-cache. */
    3440.global dcache_flush
    3541dcache_flush:
     
    4349        membar #Sync
    4450
     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 TracChangeset for help on using the changeset viewer.