Changeset c59dd1a2 in mainline for kernel/arch/xen32/src/mm/frame.c


Ignore:
Timestamp:
2006-07-25T00:47:29Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a0c12f5
Parents:
aecf79f
Message:

xen32 work: create identity mapping for the main memory zone,
make several dummy modifications to get to the banner

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/xen32/src/mm/frame.c

    raecf79f rc59dd1a2  
    3939#include <config.h>
    4040#include <arch/boot/boot.h>
     41#include <arch/hypercall.h>
    4142#include <panic.h>
    4243#include <debug.h>
     
    4445#include <macros.h>
    4546
    46 #include <print.h>
    4747#include <console/cmd.h>
    4848#include <console/kconsole.h>
     
    5050uintptr_t last_frame = 0;
    5151
     52#define L1_PT_SHIFT     10
     53#define L2_PT_SHIFT     0
     54
     55#define L1_OFFSET_MASK                  0x3ff
     56#define L2_OFFSET_MASK                  0x3ff
     57
     58#define PFN2PTL1_OFFSET(pfn)    ((pfn >> L1_PT_SHIFT) & L1_OFFSET_MASK)
     59#define PFN2PTL2_OFFSET(pfn)    ((pfn >> L2_PT_SHIFT) & L2_OFFSET_MASK)
     60
     61#define PAGE_MASK       (~(PAGE_SIZE - 1))
     62
     63#define PTE2ADDR(pte)   (pte & PAGE_MASK)
     64
     65#define _PAGE_PRESENT   0x001UL
     66#define _PAGE_RW                0x002UL
     67#define _PAGE_USER              0x004UL
     68#define _PAGE_PWT               0x008UL
     69#define _PAGE_PCD               0x010UL
     70#define _PAGE_ACCESSED  0x020UL
     71#define _PAGE_DIRTY             0x040UL
     72#define _PAGE_PAT               0x080UL
     73#define _PAGE_PSE               0x080UL
     74#define _PAGE_GLOBAL    0x100UL
     75
     76#define L1_PROT (_PAGE_PRESENT | _PAGE_ACCESSED)
     77#define L2_PROT (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED)
     78
    5279void frame_arch_init(void)
    5380{
    5481        if (config.cpu_active == 1) {
     82                /* The only memory zone starts just after page table */
    5583                pfn_t start = ADDR2PFN(ALIGN_UP(KA2PA(start_info.pt_base), PAGE_SIZE)) + start_info.nr_pt_frames;
    5684                size_t size = start_info.nr_pages - start;
     85               
     86                /* Create identity mapping */
     87                pfn_t phys;
     88                for (phys = start; phys < start + size; phys++) {
     89                        mmu_update_t updates[1];
     90                        pfn_t virt = ADDR2PFN(PA2KA(PFN2ADDR(phys)));
     91                       
     92                        size_t ptl1_offset = PFN2PTL1_OFFSET(virt);
     93                        size_t ptl2_offset = PFN2PTL2_OFFSET(virt);
     94                       
     95                        unsigned long *ptl2_base = (unsigned long *) PTE2ADDR(start_info.pt_base[ptl1_offset]);
     96                       
     97                        if (ptl2_base == 0) {
     98                                mmuext_op_t mmu_ext;
     99                               
     100                                pfn_t virt2 = ADDR2PFN(PA2KA(PFN2ADDR(start)));
     101                               
     102                                /* New L1 page table entry needed */
     103                                memsetb(PFN2ADDR(virt2), PAGE_SIZE, 0);
     104                               
     105                                size_t ptl1_offset2 = PFN2PTL1_OFFSET(virt2);
     106                                size_t ptl2_offset2 = PFN2PTL2_OFFSET(virt2);
     107                                unsigned long *ptl2_base2 = (unsigned long *) PTE2ADDR(start_info.pt_base[ptl1_offset2]);
     108                               
     109                                if (ptl2_base2 == 0)
     110                                        panic("Unable to find page table reference");
     111                               
     112                                updates[0].ptr = (uintptr_t) &ptl2_base2[ptl2_offset2];
     113                                updates[0].val = PFN2ADDR(start_info.mfn_list[start]) | L1_PROT;
     114                                if (xen_mmu_update(updates, 1, NULL, DOMID_SELF) < 0)
     115                                        panic("Unable to map new page table");
     116                               
     117                                mmu_ext.cmd = MMUEXT_PIN_L1_TABLE;
     118                                mmu_ext.arg1.mfn = start_info.mfn_list[start];
     119                                if (xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF) < 0)
     120                                        panic("Error pinning new page table");
     121                               
     122                                unsigned long *ptl0 = (unsigned long *) PFN2ADDR(start_info.mfn_list[ADDR2PFN(KA2PA(start_info.pt_base))]);
     123                               
     124                                updates[0].ptr = (uintptr_t) &ptl0[ptl1_offset];
     125                                updates[0].val = PFN2ADDR(start_info.mfn_list[start]) | L2_PROT;
     126                                if (xen_mmu_update(updates, 1, NULL, DOMID_SELF) < 0)
     127                                        panic("Unable to update PTE for page table");
     128                               
     129                                ptl2_base = (unsigned long *) PTE2ADDR(start_info.pt_base[ptl1_offset]);
     130                                start++;
     131                                size--;
     132                        }
     133                       
     134                        updates[0].ptr = (uintptr_t) &ptl2_base[ptl2_offset];
     135                        updates[0].val = PFN2ADDR(start_info.mfn_list[phys]) | L2_PROT;
     136                        if (xen_mmu_update(updates, 1, NULL, DOMID_SELF) < 0)
     137                                panic("Unable to update PTE");
     138                }
    57139               
    58140                zone_create(start, size, start, 0);
Note: See TracChangeset for help on using the changeset viewer.