Ignore:
Timestamp:
Jun 30, 2017, 5:18:13 PM (5 years ago)
Author:
max@…
Message:

complete hal_ppm_init, to take into account the reserved areas

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/core/hal_ppm.c

    r110 r116  
    3232#include <page.h>
    3333
     34#include <hal_boot.h>
    3435#include <hal_internal.h>
    3536
    3637error_t hal_ppm_init(boot_info_t *info)
    3738{
    38         size_t i;
     39        boot_rsvd_t *rsvd;
     40        size_t i, j;
    3941
    4042        // get relevant info from boot_info structure
     
    5961        }
    6062
    61         // TODO
     63        // initialize dirty_list as empty
     64        list_root_init( &ppm->dirty_root );
    6265
    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);
    65115}
    66116
Note: See TracChangeset for help on using the changeset viewer.