Changeset 92778f2 in mainline for kernel/arch/sparc64/src


Ignore:
Timestamp:
2006-12-04T21:14:07Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4b43f86
Parents:
3d76996
Message:

Initial support for handling illegal virtual aliases on sparc64.

Location:
kernel/arch/sparc64/src
Files:
1 added
7 edited
1 moved

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/cpu/cpu.c

    r3d76996 r92778f2  
    9393        }
    9494
     95        /*
     96         * Set the D-cache active flag.
     97         * Needed for the D-cache to work.
     98         */
     99        CPU->arch.dcache_active = 1;
    95100}
    96101
  • kernel/arch/sparc64/src/mm/as.c

    r3d76996 r92778f2  
    4848#include <bitops.h>
    4949#include <macros.h>
    50 #endif
     50#endif /* CONFIG_TSB */
     51
     52#ifdef CONFIG_VIRT_IDX_DCACHE
     53#include <arch/mm/cache.h>
     54#endif /* CONFIG_VIRT_IDX_DCACHE */
    5155
    5256/** Architecture dependent address space init. */
     
    159163        dtsb_base_write(tsb_base.value);
    160164#endif
     165#ifdef CONFIG_VIRT_IDX_DCACHE
     166        if (as->dcache_flush_on_install) {
     167                /*
     168                 * Some mappings in this address space are illegal address
     169                 * aliases. Upon their creation, the flush_dcache_on_install
     170                 * flag was set.
     171                 *
     172                 * We are now obliged to flush the D-cache in order to guarantee
     173                 * that there will be at most one cache line for each address
     174                 * alias.
     175                 *
     176                 * This flush performs a cleanup after another address space in
     177                 * which the alias might have existed.
     178                 */
     179                dcache_flush();
     180        }
     181#endif /* CONFIG_VIRT_IDX_DCACHE */
    161182}
    162183
     
    193214        }
    194215#endif
     216#ifdef CONFIG_VIRT_IDX_DCACHE
     217        if (as->dcache_flush_on_deinstall) {
     218                /*
     219                 * Some mappings in this address space are illegal address
     220                 * aliases. Upon their creation, the flush_dcache_on_deinstall
     221                 * flag was set.
     222                 *
     223                 * We are now obliged to flush the D-cache in order to guarantee
     224                 * that there will be at most one cache line for each address
     225                 * alias.
     226                 *
     227                 * This flush performs a cleanup after this address space. It is
     228                 * necessary because other address spaces that contain the same
     229                 * alias are not necessarily aware of the need to carry out the
     230                 * cache flush. The only address spaces that are aware of it are
     231                 * those that created the illegal alias.
     232                 */
     233                dcache_flush();
     234        }
     235#endif /* CONFIG_VIRT_IDX_DCACHE */
    195236}
    196237
  • kernel/arch/sparc64/src/mm/tlb.c

    r3d76996 r92778f2  
    112112        data.l = locked;
    113113        data.cp = cacheable;
    114 #ifdef CONFIG_VIRT_IDX_CACHE
     114#ifdef CONFIG_VIRT_IDX_DCACHE
    115115        data.cv = cacheable;
    116 #endif /* CONFIG_VIRT_IDX_CACHE */
     116#endif /* CONFIG_VIRT_IDX_DCACHE */
    117117        data.p = true;
    118118        data.w = true;
     
    149149        data.l = false;
    150150        data.cp = t->c;
    151 #ifdef CONFIG_VIRT_IDX_CACHE
     151#ifdef CONFIG_VIRT_IDX_DCACHE
    152152        data.cv = t->c;
    153 #endif /* CONFIG_VIRT_IDX_CACHE */
     153#endif /* CONFIG_VIRT_IDX_DCACHE */
    154154        data.p = t->k;          /* p like privileged */
    155155        data.w = ro ? false : t->w;
     
    185185        data.l = false;
    186186        data.cp = t->c;
    187 #ifdef CONFIG_VIRT_IDX_CACHE
    188         data.cv = t->c;
    189 #endif /* CONFIG_VIRT_IDX_CACHE */
    190187        data.p = t->k;          /* p like privileged */
    191188        data.w = false;
  • kernel/arch/sparc64/src/mm/tsb.c

    r3d76996 r92778f2  
    101101        tsb->data.pfn = t->frame >> FRAME_WIDTH;
    102102        tsb->data.cp = t->c;
    103 #ifdef CONFIG_VIRT_IDX_CACHE
    104         tsb->data.cv = t->c;
    105 #endif /* CONFIG_VIRT_IDX_CACHE */
    106103        tsb->data.p = t->k;             /* p as privileged */
    107104        tsb->data.v = t->p;
     
    143140        tsb->data.pfn = t->frame >> FRAME_WIDTH;
    144141        tsb->data.cp = t->c;
    145 #ifdef CONFIG_VIRT_IDX_CACHE
     142#ifdef CONFIG_VIRT_IDX_DCACHE
    146143        tsb->data.cv = t->c;
    147 #endif /* CONFIG_VIRT_IDX_CACHE */
     144#endif /* CONFIG_VIRT_IDX_DCACHE */
    148145        tsb->data.p = t->k;             /* p as privileged */
    149146        tsb->data.w = ro ? false : t->w;
  • kernel/arch/sparc64/src/smp/ipi.c

    r3d76996 r92778f2  
    3939#include <config.h>
    4040#include <mm/tlb.h>
     41#include <arch/mm/cache.h>
    4142#include <arch/interrupt.h>
    4243#include <arch/trap/interrupt.h>
     
    121122                func = tlb_shootdown_ipi_recv;
    122123                break;
     124        case IPI_DCACHE_SHOOTDOWN:
     125                func = dcache_shootdown_ipi_recv;
     126                break;
    123127        default:
    124128                panic("Unknown IPI (%d).\n", ipi);
  • kernel/arch/sparc64/src/start.S

    r3d76996 r92778f2  
    123123        membar #Sync
    124124
    125 #ifdef CONFIG_VIRT_IDX_CACHE
     125#ifdef CONFIG_VIRT_IDX_DCACHE
    126126#define TTE_LOW_DATA(imm)       (TTE_CP | TTE_CV | TTE_P | LMA | (imm))
    127 #else /* CONFIG_VIRT_IDX_CACHE */
     127#else /* CONFIG_VIRT_IDX_DCACHE */
    128128#define TTE_LOW_DATA(imm)       (TTE_CP | TTE_P | LMA | (imm))
    129 #endif /* CONFIG_VIRT_IDX_CACHE */
     129#endif /* CONFIG_VIRT_IDX_DCACHE */
    130130
    131131#define SET_TLB_DATA(r1, r2, imm) \
     
    361361.global kernel_8k_tlb_data_template
    362362kernel_8k_tlb_data_template:
    363 #ifdef CONFIG_VIRT_IDX_CACHE
     363#ifdef CONFIG_VIRT_IDX_DCACHE
    364364        .quad ((1 << TTE_V_SHIFT) | (PAGESIZE_8K << TTE_SIZE_SHIFT) | TTE_CP | TTE_CV | TTE_P | TTE_W)
    365 #else /* CONFIG_VIRT_IDX_CACHE */
     365#else /* CONFIG_VIRT_IDX_DCACHE */
    366366        .quad ((1 << TTE_V_SHIFT) | (PAGESIZE_8K << TTE_SIZE_SHIFT) | TTE_CP | TTE_P | TTE_W)
    367 #endif /* CONFIG_VIRT_IDX_CACHE */
     367#endif /* CONFIG_VIRT_IDX_DCACHE */
  • kernel/arch/sparc64/src/trap/interrupt.c

    r3d76996 r92778f2  
    4545#include <arch.h>
    4646#include <mm/tlb.h>
     47#include <arch/mm/cache.h>
    4748#include <config.h>
    4849#include <synch/spinlock.h>
     
    9192                if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) {
    9293                        tlb_shootdown_ipi_recv();
     94                } else if (data0 == (uintptr_t) dcache_shootdown_ipi_recv) {
     95                        dcache_shootdown_ipi_recv();
    9396                }
    9497#endif
Note: See TracChangeset for help on using the changeset viewer.