Changeset db3341e in mainline for arch/amd64/include/mm/page.h


Ignore:
Timestamp:
2005-09-01T14:28:00Z (20 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
623ba26c
Parents:
1dde3b61
Message:

Fixed typo in 'outb' instruction.
Paging basically working.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/include/mm/page.h

    r1dde3b61 rdb3341e  
    3939
    4040#ifndef __ASM__
    41 # define KA2PA(x)       (((__address) (x)) + 0x80000000)
    42 # define PA2KA(x)       (((__address) (x)) - 0x80000000)
     41# define KA2PA(x)      (((__address) (x)) + 0x80000000)
     42# define PA2KA(x)      (((__address) (x)) - 0x80000000)
    4343#else
    44 # define KA2PA(x)       ((x) + 0x80000000)
    45 # define PA2KA(x)       ((x)) - 0x80000000)
     44# define KA2PA(x)      ((x) + 0x80000000)
     45//# define PA2KA(x)      ((x)) - 0x80000000)
    4646#endif
    4747
    48 #define PTL0_INDEX_ARCH(vaddr)          0
    49 #define PTL1_INDEX_ARCH(vaddr)          0
    50 #define PTL2_INDEX_ARCH(vaddr)          0
    51 #define PTL3_INDEX_ARCH(vaddr)          0
     48#define PTL0_INDEX_ARCH(vaddr)  (((vaddr)>>39)&0x1ff)
     49#define PTL1_INDEX_ARCH(vaddr)  (((vaddr)>>30)&0x1ff)
     50#define PTL2_INDEX_ARCH(vaddr)  (((vaddr)>>21)&0x1ff)
     51#define PTL3_INDEX_ARCH(vaddr)  (((vaddr)>>12)&0x1ff)
    5252
    53 #define GET_PTL0_ADDRESS_ARCH()         0
    54 #define SET_PTL0_ADDRESS_ARCH(ptl0)
     53#define GET_PTL0_ADDRESS_ARCH()                 ((pte_t *) read_cr3())
     54#define GET_PTL1_ADDRESS_ARCH(ptl0, i)          ((pte_t *) ((((__u64) ((pte_t *)(ptl0))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl0))[(i)].addr_32_51)<<32 )))
     55#define GET_PTL2_ADDRESS_ARCH(ptl1, i)          ((pte_t *) ((((__u64) ((pte_t *)(ptl1))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl1))[(i)].addr_32_51)<<32 )))
     56#define GET_PTL3_ADDRESS_ARCH(ptl2, i)          ((pte_t *) ((((__u64) ((pte_t *)(ptl2))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl2))[(i)].addr_32_51)<<32 )))
     57#define GET_FRAME_ADDRESS_ARCH(ptl3, i)         ((__address *) ((((__u64) ((pte_t *)(ptl3))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl3))[(i)].addr_32_51)<<32 )))
    5558
    56 #define GET_PTL1_ADDRESS_ARCH(ptl0, i)          ((pte_t *) 0)
    57 #define GET_PTL2_ADDRESS_ARCH(ptl1, i)          ((pte_t *) 0)
    58 #define GET_PTL3_ADDRESS_ARCH(ptl2, i)          ((pte_t *) 0)
    59 #define GET_FRAME_ADDRESS_ARCH(ptl3, i)         ((pte_t *) 0)
     59#define SET_PTL0_ADDRESS_ARCH(ptl0)             (write_cr3((__address) (ptl0)))
     60#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)       set_pt_addr((pte_t *)(ptl0), (index_t)(i), a)
     61#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)       set_pt_addr((pte_t *)(ptl1), (index_t)(i), a)
     62#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)       set_pt_addr((pte_t *)(ptl2), (index_t)(i), a)
     63#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)      set_pt_addr((pte_t *)(ptl3), (index_t)(i), a)
    6064
    61 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)
    62 #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
    63 #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
    64 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)
     65#define GET_PTL1_FLAGS_ARCH(ptl0, i)            get_pt_flags((pte_t *)(ptl0), (index_t)(i))
     66#define GET_PTL2_FLAGS_ARCH(ptl1, i)            get_pt_flags((pte_t *)(ptl1), (index_t)(i))
     67#define GET_PTL3_FLAGS_ARCH(ptl2, i)            get_pt_flags((pte_t *)(ptl2), (index_t)(i))
     68#define GET_FRAME_FLAGS_ARCH(ptl3, i)           get_pt_flags((pte_t *)(ptl3), (index_t)(i))
    6569
    66 #define GET_PTL1_FLAGS_ARCH(ptl0, i)            0
    67 #define GET_PTL2_FLAGS_ARCH(ptl1, i)            0
    68 #define GET_PTL3_FLAGS_ARCH(ptl2, i)            0
    69 #define GET_FRAME_FLAGS_ARCH(ptl3, i)           0
    70 
    71 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x)
    72 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
    73 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
    74 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x)
     70#define SET_PTL1_FLAGS_ARCH(ptl0, i, x)         set_pt_flags((pte_t *)(ptl0), (index_t)(i), (x))
     71#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)         set_pt_flags((pte_t *)(ptl1), (index_t)(i), (x))
     72#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)         set_pt_flags((pte_t *)(ptl2), (index_t)(i), (x))
     73#define SET_FRAME_FLAGS_ARCH(ptl3, i, x)        set_pt_flags((pte_t *)(ptl3), (index_t)(i), (x))
    7574
    7675#ifndef __ASM__
     76
     77typedef struct page_specifier pte_t;
     78
     79struct page_specifier {
     80        unsigned present : 1;
     81        unsigned writeable : 1;
     82        unsigned uaccessible : 1;
     83        unsigned page_write_through : 1;
     84        unsigned page_cache_disable : 1;
     85        unsigned accessed : 1;
     86        unsigned dirty : 1;
     87        unsigned unused: 1;
     88        unsigned global : 1;
     89        unsigned avl : 3;
     90        unsigned addr_12_31 : 30;
     91        unsigned addr_32_51 : 21;
     92        unsigned no_execute : 1;
     93} __attribute__ ((packed));
     94
     95static inline int get_pt_flags(pte_t *pt, index_t i)
     96{
     97        pte_t *p = &pt[i];
     98       
     99        return (
     100                (!p->page_cache_disable)<<PAGE_CACHEABLE_SHIFT |
     101                (!p->present)<<PAGE_PRESENT_SHIFT |
     102                p->uaccessible<<PAGE_USER_SHIFT |
     103                1<<PAGE_READ_SHIFT |
     104                p->writeable<<PAGE_WRITE_SHIFT |
     105                (!p->no_execute)<<PAGE_EXEC_SHIFT
     106        );
     107}
     108
     109static inline void set_pt_addr(pte_t *pt, index_t i, __address a)
     110{
     111        pte_t *p = &pt[i];
     112
     113        p->addr_12_31 = (a >> 12) & 0xfffff;
     114        p->addr_32_51 = a >> 32;
     115}
     116
     117static inline void set_pt_flags(pte_t *pt, index_t i, int flags)
     118{
     119        pte_t *p = &pt[i];
     120       
     121        p->page_cache_disable = !(flags & PAGE_CACHEABLE);
     122        p->present = !(flags & PAGE_NOT_PRESENT);
     123        p->uaccessible = (flags & PAGE_USER) != 0;
     124        p->writeable = (flags & PAGE_WRITE) != 0;
     125        p->no_execute = (flags & PAGE_EXEC) == 0;
     126}
     127
    77128extern void page_arch_init(void);
    78129
    79 typedef __u64 pte_t;
    80130#endif
    81131
Note: See TracChangeset for help on using the changeset viewer.