Changeset c7ec94a4 in mainline for arch


Ignore:
Timestamp:
2006-02-06T14:18:28Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f5935ed
Parents:
214f5bb
Message:

Page hash table architectures now use generic hash table to manage
mappings.

Location:
arch
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • arch/ia64/include/mm/page.h

    r214f5bb rc7ec94a4  
    4646#define SET_PTL0_ADDRESS_ARCH(x)        /**< To be removed as situation permits. */
    4747
    48 /** Implementation of page hash table interface. */
    49 #define HT_WIDTH_ARCH                                   20      /* 1M */
    50 #define HT_HASH_ARCH(page, asid)                        vhpt_hash((page), (asid))
    51 #define HT_COMPARE_ARCH(page, asid, t)                  vhpt_compare((page), (asid), (t))
    52 #define HT_SLOT_EMPTY_ARCH(t)                           ((t)->present.tag.tag_info.ti)
    53 #define HT_INVALIDATE_SLOT_ARCH(t)                      (t)->present.tag.tag_info.ti = true
    54 #define HT_GET_NEXT_ARCH(t)                             (t)->present.next
    55 #define HT_SET_NEXT_ARCH(t, s)                          (t)->present.next = (s)
    56 #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags) vhpt_set_record(t, page, asid, frame, flags)
    57 
    5848#define PPN_SHIFT                       12
    5949
     
    6454
    6555#define VHPT_WIDTH                      20              /* 1M */
    66 #define VHPT_SIZE                       (1<<VHPT_WIDTH)
    67 #define VHPT_BASE                       page_ht         /* Must be aligned to VHPT_SIZE */
     56#define VHPT_SIZE                       (1 << VHPT_WIDTH)
     57#define VHPT_BASE                       0               /* Must be aligned to VHPT_SIZE */
    6858
    6959#define PTA_BASE_SHIFT                  15
     
    116106       
    117107        /* Word 3 */                                                                                                   
    118         pte_t *next;                    /**< Collision chain next pointer. */
     108        __u64 ig3 : 64;
    119109} __attribute__ ((packed));
    120110
     
    134124       
    135125        /* Word 3 */                                                                                                   
    136         pte_t *next;                    /**< Collision chain next pointer. */
    137        
     126        __u64 ig3 : 64;
    138127} __attribute__ ((packed));
    139128
     
    142131        struct vhpt_entry_not_present not_present;
    143132        __u64 word[4];
    144 } vhpt_entry;
     133} vhpt_entry_t;
    145134
    146135struct region_register_map {
     
    258247
    259248extern void page_arch_init(void);
    260 extern pte_t *vhpt_hash(__address page, asid_t asid);
    261 extern bool vhpt_compare(__address page, asid_t asid, pte_t *t);
    262 extern void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags);
     249
     250extern vhpt_entry_t *vhpt_hash(__address page, asid_t asid);
     251extern bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v);
     252extern void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags);
    263253
    264254#endif
  • arch/ia64/include/types.h

    r214f5bb rc7ec94a4  
    4848typedef __u64 __native;
    4949
    50 typedef union vhpt_entry pte_t;
     50typedef struct pte pte_t;
    5151
    5252#endif
  • arch/ia64/src/mm/page.c

    r214f5bb rc7ec94a4  
    4343#include <memstr.h>
    4444
    45 static void set_vhpt_environment(void);
     45static void set_environment(void);
    4646
    4747/** Initialize ia64 virtual address translation subsystem. */
     
    5050        page_operations = &page_ht_operations;
    5151        pk_disable();
    52         set_vhpt_environment();
     52        set_environment();
    5353}
    5454
    5555/** Initialize VHPT and region registers. */
    56 void set_vhpt_environment(void)
     56void set_environment(void)
    5757{
    5858        region_register rr;
     
    8888
    8989        /*
    90          * Allocate VHPT and invalidate all its entries.
    91          */
    92         page_ht = (pte_t *) frame_alloc(VHPT_WIDTH - FRAME_WIDTH, FRAME_KA);
    93         memsetb((__address) page_ht, VHPT_SIZE, 0);
    94         ht_invalidate_all();   
    95        
    96         /*
    9790         * Set up PTA register.
    9891         */
     
    10194        pta.map.vf = 1;                   /* large entry format */
    10295        pta.map.size = VHPT_WIDTH;
    103         pta.map.base = ((__address) page_ht) >> PTA_BASE_SHIFT;
     96        pta.map.base = VHPT_BASE >> PTA_BASE_SHIFT;
    10497        pta_write(pta.word);
    10598        srlz_i();
     
    114107 * @param asid Address space identifier.
    115108 *
    116  * @return Head of VHPT collision chain for page and asid.
    117  */
    118 pte_t *vhpt_hash(__address page, asid_t asid)
     109 * @return VHPT entry address.
     110 */
     111vhpt_entry_t *vhpt_hash(__address page, asid_t asid)
    119112{
    120113        region_register rr_save, rr;
    121114        index_t vrn;
    122115        rid_t rid;
    123         pte_t *t;
     116        vhpt_entry_t *v;
    124117
    125118        vrn = page >> VRN_SHIFT;
     
    131124                 * The RID is already in place, compute thash and return.
    132125                 */
    133                 t = (pte_t *) thash(page);
    134                 return t;
     126                v = (vhpt_entry_t *) thash(page);
     127                return v;
    135128        }
    136129       
     
    143136        rr_write(vrn, rr.word);
    144137        srlz_i();
    145         t = (pte_t *) thash(page);
     138        v = (vhpt_entry_t *) thash(page);
    146139        rr_write(vrn, rr_save.word);
    147140        srlz_i();
    148141        srlz_d();
    149142
    150         return t;
     143        return v;
    151144}
    152145
     
    160153 * @return True if page and asid match the page and asid of t, false otherwise.
    161154 */
    162 bool vhpt_compare(__address page, asid_t asid, pte_t *t)
     155bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v)
    163156{
    164157        region_register rr_save, rr;   
     
    167160        bool match;
    168161
    169         ASSERT(t);
     162        ASSERT(v);
    170163
    171164        vrn = page >> VRN_SHIFT;
     
    177170                 * The RID is already in place, compare ttag with t and return.
    178171                 */
    179                 return ttag(page) == t->present.tag.tag_word;
     172                return ttag(page) == v->present.tag.tag_word;
    180173        }
    181174       
     
    188181        rr_write(vrn, rr.word);
    189182        srlz_i();
    190         match = (ttag(page) == t->present.tag.tag_word);
     183        match = (ttag(page) == v->present.tag.tag_word);
    191184        rr_write(vrn, rr_save.word);
    192185        srlz_i();
     
    204197 * @param flags Different flags for the mapping.
    205198 */
    206 void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags)
     199void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags)
    207200{
    208201        region_register rr_save, rr;   
     
    211204        __u64 tag;
    212205
    213         ASSERT(t);
     206        ASSERT(v);
    214207
    215208        vrn = page >> VRN_SHIFT;
     
    232225         * Clear the entry.
    233226         */
    234         t->word[0] = 0;
    235         t->word[1] = 0;
    236         t->word[2] = 0;
    237         t->word[3] = 0;
    238        
    239         t->present.p = true;
    240         t->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE;
    241         t->present.a = false;   /* not accessed */
    242         t->present.d = false;   /* not dirty */
    243         t->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL;
    244         t->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ;
    245         t->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0;
    246         t->present.ppn = frame >> PPN_SHIFT;
    247         t->present.ed = false;  /* exception not deffered */
    248         t->present.ps = PAGE_WIDTH;
    249         t->present.key = 0;
    250         t->present.tag.tag_word = tag;
    251         t->present.next = NULL;
    252 }
     227        v->word[0] = 0;
     228        v->word[1] = 0;
     229        v->word[2] = 0;
     230        v->word[3] = 0;
     231       
     232        v->present.p = true;
     233        v->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE;
     234        v->present.a = false;   /* not accessed */
     235        v->present.d = false;   /* not dirty */
     236        v->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL;
     237        v->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ;
     238        v->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0;
     239        v->present.ppn = frame >> PPN_SHIFT;
     240        v->present.ed = false;  /* exception not deffered */
     241        v->present.ps = PAGE_WIDTH;
     242        v->present.key = 0;
     243        v->present.tag.tag_word = tag;
     244}
  • arch/sparc64/include/mm/page.h

    r214f5bb rc7ec94a4  
    4242#define SET_PTL0_ADDRESS_ARCH(x)        /**< To be removed as situation permits. */
    4343
    44 /** Implementation of page hash table interface. */
    45 #define HT_WIDTH_ARCH                   20      /* 1M */
    46 #define HT_HASH_ARCH(page, asid)        0
    47 #define HT_COMPARE_ARCH(page, asid, t)  0
    48 #define HT_SLOT_EMPTY_ARCH(t)           1
    49 #define HT_INVALIDATE_SLOT_ARCH(t)
    50 #define HT_GET_NEXT_ARCH(t)             0
    51 #define HT_SET_NEXT_ARCH(t, s)
    52 #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags)
    53 
    5444union page_address {
    5545        __address address;
  • arch/sparc64/include/types.h

    r214f5bb rc7ec94a4  
    4545typedef __u64 __native;
    4646
    47 typedef __u64 pte_t;
     47typedef struct pte pte_t;
    4848
    4949typedef __u8 asi_t;
  • arch/sparc64/src/mm/frame.c

    r214f5bb rc7ec94a4  
    3333void frame_arch_init(void)
    3434{
     35        /*
     36         * Workaround to prevent slab allocator from allocating fram 0,
     37         * which is not, at that time, mapped.
     38         */
     39        frame_region_not_free(0, FRAME_SIZE);
     40       
    3541        zone_create_in_region(0, config.memory_size & ~(FRAME_SIZE - 1));
    3642}
Note: See TracChangeset for help on using the changeset viewer.