Changeset 0cfc4d38 in mainline


Ignore:
Timestamp:
2005-12-14T01:52:19Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
38282c0
Parents:
8ad925c
Message:

sparc64 work.
Functions for disabling/enabling MMU.
TLB initialization.
Identity mapping of first 4M for kernel.
Switch to kernel copy of trap table.

Location:
arch/sparc64
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/Makefile.inc

    r8ad925c r0cfc4d38  
    5757        arch/$(ARCH)/src/sparc64.c \
    5858        arch/$(ARCH)/src/start.S \
    59         arch/$(ARCH)/src/trap_table.S
     59        arch/$(ARCH)/src/trap_table.S \
     60        arch/$(ARCH)/src/trap.c
  • arch/sparc64/include/mm/frame.h

    r8ad925c r0cfc4d38  
    3030#define __sparc64_FRAME_H__
    3131
     32#include <arch/types.h>
     33
    3234#define FRAME_SIZE              8192
     35
     36union frame_address {
     37        __address address;
     38        struct {
     39                unsigned : 23;
     40                __u64 pfn : 28;         /**< Physical Frame Number. */
     41                unsigned offset : 13;   /**< Offset. */
     42        } __attribute__ ((packed));
     43};
     44
     45typedef union frame_address frame_address_t;
    3346
    3447extern void frame_arch_init(void);
  • arch/sparc64/include/mm/tlb.h

    r8ad925c r0cfc4d38  
    3131
    3232#include <arch/mm/tte.h>
     33#include <arch/mm/mmu.h>
    3334#include <arch/mm/page.h>
    3435#include <arch/asm.h>
     
    4041#define DTLB_ENTRY_COUNT                64
    4142
    42 /** I-MMU ASIs. */
    43 #define ASI_IMMU                        0x50
    44 #define ASI_IMMU_TSB_8KB_PTR_REG        0x51   
    45 #define ASI_IMMU_TSB_64KB_PTR_REG       0x52
    46 #define ASI_ITLB_DATA_IN_REG            0x54
    47 #define ASI_ITLB_DATA_ACCESS_REG        0x55
    48 #define ASI_ITLB_TAG_READ_REG           0x56
    49 #define ASI_IMMU_DEMAP                  0x57
    50 
    51 /** Virtual Addresses within ASI_IMMU. */
    52 #define VA_IMMU_TAG_TARGET              0x0     /**< IMMU tag target register. */
    53 #define VA_IMMU_SFSR                    0x18    /**< IMMU sync fault status register. */
    54 #define VA_IMMU_TSB_BASE                0x28    /**< IMMU TSB base register. */
    55 #define VA_IMMU_TAG_ACCESS              0x30    /**< IMMU TLB tag access register. */
    56 
    57 /** D-MMU ASIs. */
    58 #define ASI_DMMU                        0x58
    59 #define ASI_DMMU_TSB_8KB_PTR_REG        0x59   
    60 #define ASI_DMMU_TSB_64KB_PTR_REG       0x5a
    61 #define ASI_DMMU_TSB_DIRECT_PTR_REG     0x5b
    62 #define ASI_DTLB_DATA_IN_REG            0x5c
    63 #define ASI_DTLB_DATA_ACCESS_REG        0x5d
    64 #define ASI_DTLB_TAG_READ_REG           0x5e
    65 #define ASI_DMMU_DEMAP                  0x5f
    66 
    67 /** Virtual Addresses within ASI_DMMU. */
    68 #define VA_DMMU_TAG_TARGET              0x0     /**< DMMU tag target register. */
    69 #define VA_PRIMARY_CONTEXT_REG          0x8     /**< DMMU primary context register. */
    70 #define VA_SECONDARY_CONTEXT_REG        0x10    /**< DMMU secondary context register. */
    71 #define VA_DMMU_SFSR                    0x18    /**< DMMU sync fault status register. */
    72 #define VA_DMMU_SFAR                    0x20    /**< DMMU sync fault address register. */
    73 #define VA_DMMU_TSB_BASE                0x28    /**< DMMU TSB base register. */
    74 #define VA_DMMU_TAG_ACCESS              0x30    /**< DMMU TLB tag access register. */
    75 #define VA_DMMU_VA_WATCHPOINT_REG       0x38    /**< DMMU VA data watchpoint register. */
    76 #define VA_DMMU_PA_WATCHPOINT_REG       0x40    /**< DMMU PA data watchpoint register. */
     43/** Page sizes. */
     44#define PAGESIZE_8K     0
     45#define PAGESIZE_64K    1
     46#define PAGESIZE_512K   2
     47#define PAGESIZE_4M     3
    7748
    7849/** I-/D-TLB Data In/Access Register type. */
  • arch/sparc64/src/mm/tlb.c

    r8ad925c r0cfc4d38  
    2929#include <arch/mm/tlb.h>
    3030#include <mm/tlb.h>
     31#include <arch/mm/frame.h>
     32#include <arch/mm/page.h>
     33#include <arch/mm/mmu.h>
    3134#include <print.h>
    3235#include <arch/types.h>
    3336#include <typedefs.h>
     37#include <config.h>
    3438
     39/** Initialize ITLB and DTLB.
     40 *
     41 * The goal of this function is to disable MMU
     42 * so that both TLBs can be purged and new
     43 * kernel 4M locked entry can be installed.
     44 * After TLB is initialized, MMU is enabled
     45 * again.
     46 */
    3547void tlb_arch_init(void)
    3648{
     49        tlb_tag_access_reg_t tag;
     50        tlb_data_t data;
     51        frame_address_t fr;
     52        page_address_t pg;
     53
     54        fr.address = config.base;
     55        pg.address = config.base;
     56       
     57        immu_disable();
     58        dmmu_disable();
     59       
     60        /*
     61         * For simplicity, we do identity mapping of first 4M of memory.
     62         * The very next change should be leaving the first 4M unmapped.
     63         */
     64        tag.value = 0;
     65        tag.vpn = pg.vpn;
     66
     67        itlb_tag_access_write(tag.value);
     68        dtlb_tag_access_write(tag.value);
     69
     70        data.value = 0;
     71        data.v = true;
     72        data.size = PAGESIZE_4M;
     73        data.pfn = fr.pfn;
     74        data.l = true;
     75        data.cp = 1;
     76        data.cv = 1;
     77        data.p = true;
     78        data.w = true;
     79        data.g = true;
     80
     81        itlb_data_in_write(data.value);
     82        dtlb_data_in_write(data.value);
     83
     84        tlb_invalidate_all();
     85
     86        dmmu_enable();
     87        immu_enable();
    3788}
    3889
     
    74125                d.value = itlb_data_access_read(i);
    75126                if (!d.l) {
    76                         printf("invalidating ");
    77127                        t.value = itlb_tag_read_read(i);
    78128                        d.v = false;
  • arch/sparc64/src/sparc64.c

    r8ad925c r0cfc4d38  
    2929#include <arch.h>
    3030#include <print.h>
    31 #include <arch/asm.h>
    32 #include <memstr.h>
     31#include <arch/trap.h>
    3332#include <arch/trap_table.h>
    3433#include <arch/console.h>
     
    4544void arch_pre_smp_init(void)
    4645{
    47         /*
    48          * Copy OFW's trap table into kernel and point TBA there.
    49          */
    50         memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
    51 /*
    52  *      TBA cannot be changed until there are means of getting it into TLB.
    53  *      tba_write((__u64) trap_table);
    54  */
     46        trap_init();
    5547}
    5648
Note: See TracChangeset for help on using the changeset viewer.