- Timestamp:
- 2006-01-19T22:17:47Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6461d67c
- Parents:
- 64c44e8
- Location:
- generic
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/include/mm/as.h
r64c44e8 r4512d7e 49 49 #define UDATA_ADDRESS UDATA_ADDRESS_ARCH 50 50 51 #define AS_KERNEL (1<<0) /**< Kernel address space. */ 52 51 53 enum as_area_type { 52 54 AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK … … 62 64 link_t link; 63 65 as_area_type_t type; 64 size_t size; /**< Size of this area . */66 size_t size; /**< Size of this area in multiples of PAGE_SIZE. */ 65 67 __address base; /**< Base address of this area. */ 66 68 index_t *mapping; /**< Map of physical frame numbers mapped to virtual page numbers in this area. */ … … 75 77 */ 76 78 struct as { 79 /** Protected by asidlock. Must be acquired before as-> lock. */ 80 link_t as_with_asid_link; 81 77 82 SPINLOCK_DECLARE(lock); 78 83 link_t as_area_head; … … 81 86 }; 82 87 83 extern as_t * as_create(pte_t *ptl0 );88 extern as_t * as_create(pte_t *ptl0, int flags); 84 89 extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base); 85 90 extern void as_area_set_mapping(as_area_t *a, index_t vpn, index_t pfn); … … 87 92 extern void as_install(as_t *m); 88 93 89 /* 90 * Each architecture should implement this function. 91 * Its main purpose is to do TLB purges according 92 * to architecture's requirements. Note that 93 * some architectures invalidate their TLB automatically 94 * on hardware address space switch (e.g. ia32 and 95 * amd64). 96 */ 94 /* Interface to be implemented by architectures. */ 97 95 #ifndef as_install_arch 98 96 extern void as_install_arch(as_t *as); -
generic/include/mm/asid.h
r64c44e8 r4512d7e 27 27 */ 28 28 29 /* 30 * This is generic interface for managing 31 * Address Space IDentifiers (ASIDs). 32 */ 33 29 34 #ifndef __ASID_H__ 30 35 #define __ASID_H__ 31 36 37 #include <arch/mm/asid.h> 38 #include <typedefs.h> 39 32 40 #define ASID_KERNEL 0 41 #define ASID_INVALID 1 42 #define ASID_START 2 43 #define ASID_MAX ASID_MAX_ARCH 44 45 #define ASIDS_ALLOCABLE ((ASID_MAX+1)-ASID_START) 46 47 extern spinlock_t asidlock; 48 extern link_t as_with_asid_head; 49 50 extern asid_t asid_get(void); 51 extern void asid_put(asid_t asid); 52 53 #ifndef asid_install 54 extern void asid_install(as_t *as); 55 #endif /* !def asid_install */ 56 57 #define asid_find_free() ASID_START 58 #define asid_put_arch(x) 33 59 34 60 #endif -
generic/include/mm/tlb.h
r64c44e8 r4512d7e 32 32 #include <arch/mm/asid.h> 33 33 #include <arch/types.h> 34 35 extern void tlb_init(void); 36 37 #ifdef CONFIG_SMP 38 extern void tlb_shootdown_start(void); 39 extern void tlb_shootdown_finalize(void); 40 extern void tlb_shootdown_ipi_recv(void); 41 #else 42 # define tlb_shootdown_start() ; 43 # define tlb_shootdown_finalize() ; 44 # define tlb_shootdown_ipi_recv() ; 45 #endif /* CONFIG_SMP */ 34 #include <typedefs.h> 46 35 47 36 /** Type of TLB shootdown message. */ … … 50 39 TLB_INVL_ALL, /**< Invalidate all entries in TLB. */ 51 40 TLB_INVL_ASID, /**< Invalidate all entries belonging to one address space. */ 52 TLB_INVL_PAGE /**< Invalidate one entry for specified page. */41 TLB_INVL_PAGES /**< Invalidate specified page range belonging to one address space. */ 53 42 }; 54 43 … … 64 53 typedef struct tlb_shootdown_msg tlb_shootdown_msg_t; 65 54 55 extern void tlb_init(void); 56 57 #ifdef CONFIG_SMP 58 extern void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, __address page, count_t cnt); 59 extern void tlb_shootdown_finalize(void); 60 extern void tlb_shootdown_ipi_recv(void); 61 #else 62 # define tlb_shootdown_start(w, x, y, z) 63 # define tlb_shootdown_finalize() 64 # define tlb_shootdown_ipi_recv() 65 #endif /* CONFIG_SMP */ 66 67 66 68 /* Export TLB interface that each architecture must implement. */ 67 69 extern void tlb_arch_init(void); 68 70 extern void tlb_print(void); 69 extern void tlb_invalidate(asid_t asid);70 71 extern void tlb_shootdown_ipi_send(void); 71 72 72 73 extern void tlb_invalidate_all(void); 73 74 extern void tlb_invalidate_asid(asid_t asid); 74 extern void tlb_invalidate_page(asid_t asid, __address page); 75 75 extern void tlb_invalidate_pages(asid_t asid, __address page, count_t cnt); 76 76 #endif -
generic/src/main/kinit.c
r64c44e8 r4512d7e 147 147 panic("config.init_addr is not frame aligned"); 148 148 149 as = as_create(NULL );149 as = as_create(NULL, 0); 150 150 if (!as) 151 151 panic("as_create\n"); -
generic/src/main/main.c
r64c44e8 r4512d7e 186 186 * Create kernel address space. 187 187 */ 188 as = as_create(GET_PTL0_ADDRESS() );188 as = as_create(GET_PTL0_ADDRESS(), AS_KERNEL); 189 189 if (!as) 190 190 panic("can't create kernel address space\n"); -
generic/src/mm/as.c
r64c44e8 r4512d7e 34 34 35 35 #include <mm/as.h> 36 #include <mm/asid.h> 36 37 #include <mm/page.h> 37 38 #include <mm/frame.h> … … 40 41 #include <arch/mm/page.h> 41 42 #include <genarch/mm/page_pt.h> 43 #include <mm/asid.h> 42 44 #include <arch/mm/asid.h> 43 45 #include <arch/mm/as.h> … … 71 73 * (Virtual Address Translation) mechanisms. 72 74 */ 73 as_t *as_create(pte_t *ptl0 )75 as_t *as_create(pte_t *ptl0, int flags) 74 76 { 75 77 as_t *as; … … 77 79 as = (as_t *) malloc(sizeof(as_t)); 78 80 if (as) { 81 list_initialize(&as->as_with_asid_link); 79 82 spinlock_initialize(&as->lock, "as_lock"); 80 83 list_initialize(&as->as_area_head); 81 84 82 as->asid = asid_get(); 85 if (flags & AS_KERNEL) 86 as->asid = ASID_KERNEL; 87 else 88 as->asid = ASID_INVALID; 83 89 84 90 as->ptl0 = ptl0; … … 290 296 ipl_t ipl; 291 297 298 asid_install(as); 299 292 300 ipl = interrupts_disable(); 293 301 spinlock_lock(&as->lock); … … 299 307 /* 300 308 * Perform architecture-specific steps. 301 * (e.g. invalidate TLB, install ASIDetc.)309 * (e.g. write ASID to hardware register etc.) 302 310 */ 303 311 as_install_arch(as); -
generic/src/mm/tlb.c
r64c44e8 r4512d7e 47 47 #ifdef CONFIG_SMP 48 48 /* must be called with interrupts disabled */ 49 void tlb_shootdown_start( void)49 void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, __address page, count_t cnt) 50 50 { 51 51 int i; … … 53 53 CPU->tlb_active = 0; 54 54 spinlock_lock(&tlblock); 55 56 /* 57 * TODO: assemble shootdown message. 58 */ 55 59 tlb_shootdown_ipi_send(); 56 tlb_invalidate(0); /* TODO: use valid ASID */ 60 61 switch (type) { 62 case TLB_INVL_ALL: 63 tlb_invalidate_all(); 64 break; 65 case TLB_INVL_ASID: 66 tlb_invalidate_asid(asid); 67 break; 68 case TLB_INVL_PAGES: 69 tlb_invalidate_pages(asid, page, cnt); 70 break; 71 default: 72 panic("unknown tlb_invalidate_type_t value: %d\n", type); 73 break; 74 } 57 75 58 76 busy_wait: … … 78 96 spinlock_lock(&tlblock); 79 97 spinlock_unlock(&tlblock); 80 tlb_invalidate (0); /* TODO: use valid ASID */98 tlb_invalidate_all(); /* TODO: use valid ASID */ 81 99 CPU->tlb_active = 1; 82 100 }
Note:
See TracChangeset
for help on using the changeset viewer.