Changeset 116 for trunk/hal/x86_64/core/hal_ppm.c
- Timestamp:
- Jun 30, 2017, 5:18:13 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/x86_64/core/hal_ppm.c
r110 r116 32 32 #include <page.h> 33 33 34 #include <hal_boot.h> 34 35 #include <hal_internal.h> 35 36 36 37 error_t hal_ppm_init(boot_info_t *info) 37 38 { 38 size_t i; 39 boot_rsvd_t *rsvd; 40 size_t i, j; 39 41 40 42 // get relevant info from boot_info structure … … 59 61 } 60 62 61 // TODO 63 // initialize dirty_list as empty 64 list_root_init( &ppm->dirty_root ); 62 65 63 x86_panic((char *)__func__); 64 return 0; 66 // compute size of pages_tbl[] array rounded to an integer number of pages 67 uint32_t bytes = ARROUND_UP( pages_nr * sizeof(page_t), CONFIG_PPM_PAGE_SIZE ); 68 69 // compute number of pages required to store page descriptor array 70 uint32_t pages_tbl_nr = bytes >> CONFIG_PPM_PAGE_SHIFT; 71 72 // compute total number of reserved pages (kernel code & pages_tbl[]) 73 uint32_t reserved_pages = pages_tbl_offset + pages_tbl_nr; 74 75 // initialize pages_nr, pages_tbl, and vaddr_base pointers 76 ppm->pages_nr = pages_nr; 77 ppm->vaddr_base = (void *)CLUSTER_MIN_VA(0); 78 ppm->pages_tbl = (page_t *)hal_gpt_bootstrap_valloc(pages_tbl_nr); 79 80 // make sure we respect the rule [VA = PA + constant_offset] 81 XASSERT(ppm->pages_tbl == ppm->vaddr_base + pages_tbl_offset * PAGE_SIZE); 82 83 // initialize all page descriptors in pages_tbl[] 84 for( i = 0 ; i < pages_nr ; i++ ) 85 { 86 page_init( &ppm->pages_tbl[i] ); 87 88 // TODO optimisation for this enormous loop on small pages: 89 // make only a partial init with a memset, and complete the 90 // initialisation when page is allocated [AG] 91 } 92 93 /* 94 * Set the PG_RESERVED flag for reserved pages (kernel, pages_tbl[] and 95 * memory holes). 96 */ 97 for (i = 0; i < reserved_pages; i++) { 98 page_set_flag(&ppm->pages_tbl[i], PG_RESERVED); 99 } 100 for (i = 0; i < rsvd_nr; i++) { 101 rsvd = &info->rsvd[i]; 102 for (j = 0; j < rsvd->npages; j++) { 103 page_set_flag(&ppm->pages_tbl[rsvd->first_page + j], PG_RESERVED); 104 } 105 } 106 107 /* Release all other pages to populate the free lists */ 108 for (i = reserved_pages; i < pages_nr; i++) { 109 if (!page_is_flag(&ppm->pages_tbl[i], PG_RESERVED)) 110 ppm_free_pages_nolock(&ppm->pages_tbl[i]); 111 } 112 113 /* Check consistency */ 114 return ppm_assert_order(ppm); 65 115 } 66 116
Note: See TracChangeset
for help on using the changeset viewer.