Changeset e386cbf in mainline for kernel/arch/sparc64/src


Ignore:
Timestamp:
2006-08-01T15:58:32Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e12ccc5
Parents:
b3e8c90
Message:

sparc64 work.
Dump take_over_tlb_and_tt() and add its assembly language replacement.

Location:
kernel/arch/sparc64/src
Files:
2 edited

Legend:

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

    rb3e8c90 re386cbf  
    9292}
    9393
    94 /** Take over TLB and trap table.
    95  *
    96  * Initialize ITLB and DTLB and switch to kernel
    97  * trap table.
    98  *
    99  * First, demap context 0 and install the
    100  * global 4M locked kernel mapping.
    101  *
    102  * Second, prepare a temporary IMMU mapping in
    103  * context 1, switch to it, demap context 0,
    104  * install the global 4M locked kernel mapping
    105  * in context 0 and switch back to context 0.
    106  *
    107  * @param base Base address that will be hardwired in both TLBs.
    108  */
    109 void take_over_tlb_and_tt(uintptr_t base)
    110 {
    111         tlb_tag_access_reg_t tag;
    112         tlb_data_t data;
    113         frame_address_t fr;
    114         page_address_t pg;
    115 
    116         /*
    117          * Switch to the kernel trap table.
    118          */
    119         trap_switch_trap_table();
    120 
    121         fr.address = base;
    122         pg.address = base;
    123 
    124         /*
    125          * We do identity mapping of 4M-page at 4M.
    126          */
    127         tag.value = 0;
    128         tag.context = 0;
    129         tag.vpn = pg.vpn;
    130 
    131         data.value = 0;
    132         data.v = true;
    133         data.size = PAGESIZE_4M;
    134         data.pfn = fr.pfn;
    135         data.l = true;
    136         data.cp = 1;
    137         data.cv = 0;
    138         data.p = true;
    139         data.w = true;
    140         data.g = true;
    141 
    142         /*
    143          * Straightforwardly demap DMUU context 0,
    144          * and replace it with the locked kernel mapping.
    145          */
    146         dtlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_NUCLEUS, 0);
    147         dtlb_tag_access_write(tag.value);
    148         dtlb_data_in_write(data.value);
    149 
    150         /*
    151          * Install kernel code mapping in context 1
    152          * and switch to it.
    153          */
    154         tag.context = 1;
    155         data.g = false;
    156         itlb_tag_access_write(tag.value);
    157         itlb_data_in_write(data.value);
    158         mmu_primary_context_write(1);
    159        
    160         /*
    161          * Demap old context 0.
    162          */
    163         itlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_NUCLEUS, 0);
    164        
    165         /*
    166          * Install the locked kernel mapping in context 0
    167          * and switch to it.
    168          */
    169         tag.context = 0;
    170         data.g = true;
    171         itlb_tag_access_write(tag.value);
    172         itlb_data_in_write(data.value);
    173         mmu_primary_context_write(0);
    174 }
    175 
    17694/** @}
    17795 */
  • kernel/arch/sparc64/src/start.S

    rb3e8c90 re386cbf  
    2828
    2929#include <arch/regdef.h>
     30#include <arch/boot/boot.h>
     31
     32#include <arch/mm/mmu.h>
     33#include <arch/mm/tlb.h>
     34#include <arch/mm/tte.h>
    3035
    3136.register %g2, #scratch
     
    5358.global kernel_image_start
    5459kernel_image_start:
     60
     61        /*
     62         * Setup basic runtime environment.
     63         */
     64
    5565        flushw                          ! flush all but the active register window
    56 
    57         /*
    58          * Disable interrupts and disable 32-bit address masking.
    59          */
    60         rdpr %pstate, %l0
    61         and %l0, ~(PSTATE_AM_BIT|PSTATE_IE_BIT), %l0
    62         wrpr %l0, 0, %pstate
     66        wrpr %g0, 0, %tl                ! TL = 0, primary context register is used
     67
     68        ! Disable interrupts and disable 32-bit address masking.
     69        rdpr %pstate, %g1
     70        and %g1, ~(PSTATE_AM_BIT|PSTATE_IE_BIT), %g1
     71        wrpr %g1, 0, %pstate
     72
     73        wrpr %r0, 0, %pil               ! intialize %pil
    6374
    6475        /*
     
    7283        nop
    7384
    74         set kernel_image_start, %o0
    75         /*
    76          * Take over control of MMU.
    77          *
    78          * First, take over DMMU for which we don't need to issue
    79          * any FLUSH instructions. Because of that, we can
    80          * demap the old DTLB pretty straightforwardly.
    81          */
    82         call take_over_tlb_and_tt
    83         nop
    84 
    85         wrpr %r0, 0, %pil
    86 
     85        /*
     86         * Switch to kernel trap table.
     87         */
     88        set trap_table, %g1
     89        wrpr %g1, 0, %tba
     90
     91        /*
     92         * Take over the DMMU by installing global locked
     93         * TTE entry identically mapping the first 4M
     94         * of memory.
     95         *
     96         * In case of DMMU, no FLUSH instructions need to be
     97         * issued. Because of that, the old DTLB contents can
     98         * be demapped pretty straightforwardly and without
     99         * causing any traps.
     100         */
     101
     102        wr %g0, ASI_DMMU, %asi
     103
     104#define SET_TLB_DEMAP_CMD(r1, context_id) \
     105        set (TLB_DEMAP_CONTEXT<<TLB_DEMAP_TYPE_SHIFT) | (context_id<<TLB_DEMAP_CONTEXT_SHIFT), %r1
     106       
     107        ! demap context 0
     108        SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_NUCLEUS)
     109        stxa %g0, [%g1] ASI_DMMU_DEMAP                 
     110        membar #Sync
     111
     112#define SET_TLB_TAG(r1, context) \
     113        set VMA | (context<<TLB_TAG_ACCESS_CONTEXT_SHIFT), %r1
     114
     115        ! write DTLB tag
     116        SET_TLB_TAG(g1, MEM_CONTEXT_KERNEL)
     117        stxa %g1, [VA_DMMU_TAG_ACCESS] %asi                     
     118        membar #Sync
     119
     120#define SET_TLB_DATA(r1, r2, imm) \
     121        set TTE_L | TTE_CP | TTE_P | TTE_W | LMA | imm, %r1; \
     122        set PAGESIZE_4M, %r2; \
     123        sllx %r2, TTE_SIZE_SHIFT, %r2; \
     124        or %r1, %r2, %r1; \
     125        set 1, %r2; \
     126        sllx %r2, TTE_V_SHIFT, %r2; \
     127        or %r1, %r2, %r1;
     128       
     129        ! write DTLB data and install the kernel mapping
     130        SET_TLB_DATA(g1, g2, TTE_G)
     131        stxa %g1, [%g0] ASI_DTLB_DATA_IN_REG           
     132        membar #Sync
     133       
     134        /*
     135         * Now is time to take over the IMMU.
     136         * Unfortunatelly, it cannot be done as easily as the DMMU,
     137         * because the IMMU is mapping the code it executes.
     138         *
     139         * [ Note that brave experiments with disabling the IMMU
     140         * and using the DMMU approach failed after a dozen
     141         * of desparate days with only little success. ]
     142         *
     143         * The approach used here is inspired from OpenBSD.
     144         * First, the kernel creates IMMU mapping for itself
     145         * in context 1 (MEM_CONTEXT_TEMP) and switches to
     146         * it. Context 0 (MEM_CONTEXT_KERNEL) can be demapped
     147         * afterwards and replaced with the kernel permanent
     148         * mapping. Finally, the kernel switches back to
     149         * context 0 and demaps context 1.
     150         *
     151         * Moreover, the IMMU requires use of the FLUSH instructions.
     152         * But that is OK because we always use operands with
     153         * addresses already mapped by the taken over DTLB.
     154         */
     155       
     156        set kernel_image_start, %g7
     157       
     158        ! write ITLB tag of context 1
     159        SET_TLB_TAG(g1, MEM_CONTEXT_TEMP)
     160        set VA_DMMU_TAG_ACCESS, %g2
     161        stxa %g1, [%g2] ASI_IMMU
     162        flush %g7
     163
     164        ! write ITLB data and install the temporary mapping in context 1
     165        SET_TLB_DATA(g1, g2, 0)                 ! use non-global mapping
     166        stxa %g1, [%g0] ASI_ITLB_DATA_IN_REG           
     167        flush %g7
     168       
     169        ! switch to context 1
     170        set MEM_CONTEXT_TEMP, %g1
     171        stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!!
     172        flush %g7
     173       
     174        ! demap context 0
     175        SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_NUCLEUS)
     176        stxa %g0, [%g1] ASI_IMMU_DEMAP                 
     177        flush %g7
     178       
     179        ! write ITLB tag of context 0
     180        SET_TLB_TAG(g1, MEM_CONTEXT_KERNEL)
     181        set VA_DMMU_TAG_ACCESS, %g2
     182        stxa %g1, [%g2] ASI_IMMU
     183        flush %g7
     184
     185        ! write ITLB data and install the permanent kernel mapping in context 0
     186        SET_TLB_DATA(g1, g2, 0)                 ! use non-global mapping
     187        stxa %g1, [%g0] ASI_ITLB_DATA_IN_REG           
     188        flush %g7
     189
     190        ! switch to context 0
     191        stxa %g0, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!!
     192        flush %g7
     193
     194        ! ensure nucleus mapping
     195        wrpr %g0, 1, %tl
     196
     197        ! set context 1 in the primary context register
     198        set MEM_CONTEXT_TEMP, %g1
     199        stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!!
     200        flush %g7
     201
     202        ! demap context 1
     203        SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_PRIMARY)
     204        stxa %g0, [%g1] ASI_IMMU_DEMAP                 
     205        flush %g7
     206       
     207        ! set context 0 in the primary context register
     208        stxa %g0, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!!
     209        flush %g7
     210       
     211        ! set TL back to 0
     212        wrpr %g0, 0, %tl
     213       
    87214        call main_bsp
    88215        nop
Note: See TracChangeset for help on using the changeset viewer.