Changeset 225 for trunk/hal


Ignore:
Timestamp:
Jul 18, 2017, 11:05:17 AM (7 years ago)
Author:
max@…
Message:

implement hal_gpt_create

File:
1 edited

Legend:

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

    r224 r225  
    247247 ***************************************************************************************/
    248248
    249 uint32_t  GPT_MAPPED;
    250 uint32_t  GPT_SMALL;
    251 uint32_t  GPT_READABLE;
    252 uint32_t  GPT_WRITABLE;
    253 uint32_t  GPT_EXECUTABLE;
    254 uint32_t  GPT_CACHABLE;
    255 uint32_t  GPT_USER;
    256 uint32_t  GPT_DIRTY;
    257 uint32_t  GPT_ACCESSED;
    258 uint32_t  GPT_GLOBAL;
    259 uint32_t  GPT_COW;
    260 uint32_t  GPT_SWAP;
    261 uint32_t  GPT_LOCKED;
    262 
    263 error_t hal_gpt_create( gpt_t * gpt )
    264 {
    265         x86_panic((char *)__func__);
     249uint32_t GPT_MAPPED;
     250uint32_t GPT_SMALL;
     251uint32_t GPT_READABLE;
     252uint32_t GPT_WRITABLE;
     253uint32_t GPT_EXECUTABLE;
     254uint32_t GPT_CACHABLE;
     255uint32_t GPT_USER;
     256uint32_t GPT_DIRTY;
     257uint32_t GPT_ACCESSED;
     258uint32_t GPT_GLOBAL;
     259uint32_t GPT_COW;
     260uint32_t GPT_SWAP;
     261uint32_t GPT_LOCKED;
     262
     263error_t hal_gpt_create(gpt_t *gpt)
     264{
     265        page_t *page;
     266
     267        /* check page size */
     268        if (CONFIG_PPM_PAGE_SIZE != 4096) {
     269                printk("\n[PANIC] in %s : For x86, the page must be 4 Kbytes\n", __FUNCTION__);
     270                hal_core_sleep();
     271        }
     272
     273        /* allocate a physical page for L4 */
     274        kmem_req_t req;
     275        req.type  = KMEM_PAGE;
     276        req.size  = 1;
     277        req.flags = AF_KERNEL | AF_ZERO;
     278        page = (page_t *)kmem_alloc(&req);
     279
     280        if (page == NULL) {
     281                printk("\n[ERROR] in %s : cannot allocate physical memory for PT1\n", __FUNCTION__);
     282                return ENOMEM;
     283        }
     284
     285        /* populate the kernel entries */
     286        pt_entry_t *L4src, *L4dst;
     287        extern paddr_t L4paddr; // XXX XXX smp
     288        vaddr_t L4vaddr = L4paddr + KERNBASE; // XXX
     289        L4src = (pt_entry_t *)L4vaddr;
     290        L4dst = (pt_entry_t *)ppm_page2vaddr(page);
     291        memcpy(&L4dst[256], &L4src[256], 256 * sizeof(pt_entry_t));
     292        L4dst[L4_SLOT_PTE] = (ppm_page2ppn(page) >> CONFIG_PPM_PAGE_SHIFT) |
     293            PG_V | PG_KW | PG_NX;
     294
     295        /* initialize generic page table descriptor */
     296        gpt->ptr  = ppm_page2vaddr(page);
     297        gpt->ppn  = ppm_page2ppn(page);
     298        gpt->page = page;
     299
     300        /* initialize PTE entries attributes masks */
     301        GPT_MAPPED     = PG_V;
     302        GPT_SMALL      = 0;
     303        GPT_READABLE   = PG_V;
     304        GPT_WRITABLE   = PG_RW;
     305        GPT_EXECUTABLE = 0;
     306        GPT_CACHABLE   = 0;
     307        GPT_USER       = PG_u;
     308        GPT_DIRTY      = 0;
     309        GPT_ACCESSED   = 0;
     310        GPT_GLOBAL     = PG_G;
     311        GPT_COW        = 0;
     312        GPT_SWAP       = 0;
     313        GPT_LOCKED     = 0;
     314
    266315        return 0;
    267316}
Note: See TracChangeset for help on using the changeset viewer.