Changeset 9f63a83 in mainline


Ignore:
Timestamp:
2007-01-19T12:21:27Z (17 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.

Location:
kernel
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/include/mm/cache.h

    r81cfefa r9f63a83  
    3636#define KERN_sparc64_CACHE_H_
    3737
     38#include <mm/page.h>
     39#include <mm/frame.h>
     40
     41#define dcache_flush_page(p) \
     42        dcache_flush_color(PAGE_COLOR((p)))
     43#define dcache_flush_frame(p, f) \
     44        dcache_flush_tag(PAGE_COLOR((p)), ADDR2PFN((f)));
     45
    3846extern void dcache_flush(void);
     47extern void dcache_flush_color(int c);
     48extern void dcache_flush_tag(int c, pfn_t tag);
    3949
    4050#endif
  • 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
  • kernel/generic/src/mm/backend_anon.c

    r81cfefa r9f63a83  
    5151#include <align.h>
    5252#include <arch.h>
     53
     54#ifdef CONFIG_VIRT_IDX_DCACHE
     55#include <arch/mm/cache.h>
     56#endif
    5357
    5458static int anon_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access);
     
    154158 *
    155159 * @param area Ignored.
    156  * @param page Ignored.
     160 * @param page Virtual address of the page corresponding to the frame.
    157161 * @param frame Frame to be released.
    158162 */
     
    160164{
    161165        frame_free(frame);
     166#ifdef CONFIG_VIRT_IDX_DCACHE
     167        dcache_flush_frame(page, frame);
     168#endif
    162169}
    163170
  • kernel/generic/src/mm/backend_elf.c

    r81cfefa r9f63a83  
    5151#include <arch.h>
    5252
     53#ifdef CONFIG_VIRT_IDX_DCACHE
     54#include <arch/mm/cache.h>
     55#endif
     56
    5357static int elf_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access);
    5458static void elf_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame);
     
    220224                         */
    221225                        frame_free(frame);
     226#ifdef CONFIG_VIRT_IDX_DCACHE
     227                        dcache_flush_frame(page, frame);
     228#endif
    222229                }
    223230        } else {
     
    228235                 */
    229236                frame_free(frame);
     237#ifdef CONFIG_VIRT_IDX_DCACHE
     238                dcache_flush_frame(page, frame);
     239#endif
    230240        }
    231241}
Note: See TracChangeset for help on using the changeset viewer.