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


Ignore:
Timestamp:
2010-07-12T10:53:30Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bd11d3e
Parents:
c40e6ef (diff), bee2d4c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rc40e6ef rbd48f4c  
    3535/** Paging on AMD64
    3636 *
    37  * The space is divided in positive numbers - userspace and
    38  * negative numbers - kernel space. The 'negative' space starting
    39  * with 0xffff800000000000 and ending with 0xffffffff80000000
    40  * (-2GB) is identically mapped physical memory. The area
    41  * (0xffffffff80000000 ... 0xffffffffffffffff is again identically
    42  * mapped first 2GB.
    43  *
    44  * ATTENTION - PA2KA(KA2PA(x)) != x if 'x' is in kernel
     37 * The space is divided in positive numbers (uspace) and
     38 * negative numbers (kernel). The 'negative' space starting
     39 * with 0xffff800000000000 and ending with 0xffffffffffffffff
     40 * is identically mapped physical memory.
     41 *
    4542 */
    4643
     
    4946
    5047#include <arch/mm/frame.h>
    51 
    52 #define PAGE_WIDTH      FRAME_WIDTH
    53 #define PAGE_SIZE       FRAME_SIZE
     48#include <trace.h>
     49
     50#define PAGE_WIDTH  FRAME_WIDTH
     51#define PAGE_SIZE   FRAME_SIZE
    5452
    5553#ifdef KERNEL
    5654
    5755#ifndef __ASM__
    58 #       include <mm/mm.h>
    59 #       include <typedefs.h>
    60 #       include <arch/interrupt.h>
    61 
    62 static inline uintptr_t ka2pa(uintptr_t x)
    63 {
    64         if (x > 0xffffffff80000000)
    65                 return x - 0xffffffff80000000;
    66         else
    67                 return x - 0xffff800000000000;
    68 }
    69 
    70 #       define KA2PA(x)         ka2pa((uintptr_t) x)
    71 #       define PA2KA_CODE(x)    (((uintptr_t) (x)) + 0xffffffff80000000)
    72 #       define PA2KA(x)         (((uintptr_t) (x)) + 0xffff800000000000)
    73 #else
    74 #       define KA2PA(x)         ((x) - 0xffffffff80000000)
    75 #       define PA2KA(x)         ((x) + 0xffffffff80000000)
    76 #endif
     56
     57#define KA2PA(x)  (((uintptr_t) (x)) - 0xffff800000000000)
     58#define PA2KA(x)  (((uintptr_t) (x)) + 0xffff800000000000)
     59
     60#else /* __ASM__ */
     61
     62#define KA2PA(x)  ((x) - 0xffff800000000000)
     63#define PA2KA(x)  ((x) + 0xffff800000000000)
     64
     65#endif /* __ASM__ */
    7766
    7867/* Number of entries in each level. */
    79 #define PTL0_ENTRIES_ARCH       512
    80 #define PTL1_ENTRIES_ARCH       512
    81 #define PTL2_ENTRIES_ARCH       512
    82 #define PTL3_ENTRIES_ARCH       512
     68#define PTL0_ENTRIES_ARCH  512
     69#define PTL1_ENTRIES_ARCH  512
     70#define PTL2_ENTRIES_ARCH  512
     71#define PTL3_ENTRIES_ARCH  512
    8372
    8473/* Page table sizes for each level. */
    85 #define PTL0_SIZE_ARCH          ONE_FRAME
    86 #define PTL1_SIZE_ARCH          ONE_FRAME
    87 #define PTL2_SIZE_ARCH          ONE_FRAME
    88 #define PTL3_SIZE_ARCH          ONE_FRAME
     74#define PTL0_SIZE_ARCH  ONE_FRAME
     75#define PTL1_SIZE_ARCH  ONE_FRAME
     76#define PTL2_SIZE_ARCH  ONE_FRAME
     77#define PTL3_SIZE_ARCH  ONE_FRAME
    8978
    9079/* Macros calculating indices into page tables in each level. */
    91 #define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 39) & 0x1ff)
    92 #define PTL1_INDEX_ARCH(vaddr)  (((vaddr) >> 30) & 0x1ff)
    93 #define PTL2_INDEX_ARCH(vaddr)  (((vaddr) >> 21) & 0x1ff)
    94 #define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x1ff)
     80#define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 39) & 0x1ff)
     81#define PTL1_INDEX_ARCH(vaddr)  (((vaddr) >> 30) & 0x1ff)
     82#define PTL2_INDEX_ARCH(vaddr)  (((vaddr) >> 21) & 0x1ff)
     83#define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x1ff)
    9584
    9685/* Get PTE address accessors for each level. */
     
    156145#ifndef __ASM__
    157146
     147#include <mm/mm.h>
     148#include <arch/interrupt.h>
     149#include <typedefs.h>
     150
    158151/* Page fault error codes. */
    159152
     
    161154 * page.
    162155 */
    163 #define PFERR_CODE_P            (1 << 0) 
     156#define PFERR_CODE_P  (1 << 0)
    164157
    165158/** When bit on this position is 1, the page fault was caused by a write. */
    166 #define PFERR_CODE_RW           (1 << 1)
     159#define PFERR_CODE_RW  (1 << 1)
    167160
    168161/** When bit on this position is 1, the page fault was caused in user mode. */
    169 #define PFERR_CODE_US           (1 << 2)
     162#define PFERR_CODE_US  (1 << 2)
    170163
    171164/** When bit on this position is 1, a reserved bit was set in page directory. */
    172 #define PFERR_CODE_RSVD         (1 << 3)
     165#define PFERR_CODE_RSVD  (1 << 3)
    173166
    174167/** When bit on this position os 1, the page fault was caused during instruction
    175168 * fecth.
    176169 */
    177 #define PFERR_CODE_ID           (1 << 4)
     170#define PFERR_CODE_ID  (1 << 4)
    178171
    179172/** Page Table Entry. */
    180173typedef struct {
    181         unsigned present : 1;
    182         unsigned writeable : 1;
    183         unsigned uaccessible : 1;
    184         unsigned page_write_through : 1;
    185         unsigned page_cache_disable : 1;
    186         unsigned accessed : 1;
    187         unsigned dirty : 1;
    188         unsigned unused: 1;
    189         unsigned global : 1;
    190         unsigned soft_valid : 1;                /**< Valid content even if present bit is cleared. */
    191         unsigned avl : 2;
    192         unsigned addr_12_31 : 30;
    193         unsigned addr_32_51 : 21;
    194         unsigned no_execute : 1;
     174        unsigned int present : 1;
     175        unsigned int writeable : 1;
     176        unsigned int uaccessible : 1;
     177        unsigned int page_write_through : 1;
     178        unsigned int page_cache_disable : 1;
     179        unsigned int accessed : 1;
     180        unsigned int dirty : 1;
     181        unsigned int unused: 1;
     182        unsigned int global : 1;
     183        unsigned int soft_valid : 1;  /**< Valid content even if present bit is cleared. */
     184        unsigned int avl : 2;
     185        unsigned int addr_12_31 : 30;
     186        unsigned int addr_32_51 : 21;
     187        unsigned int no_execute : 1;
    195188} __attribute__ ((packed)) pte_t;
    196189
    197 static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
     190NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
    198191{
    199192        pte_t *p = &pt[i];
     
    208201}
    209202
    210 static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a)
     203NO_TRACE static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a)
    211204{
    212205        pte_t *p = &pt[i];
    213 
     206       
    214207        p->addr_12_31 = (a >> 12) & 0xfffff;
    215208        p->addr_32_51 = a >> 32;
    216209}
    217210
    218 static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
     211NO_TRACE static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
    219212{
    220213        pte_t *p = &pt[i];
Note: See TracChangeset for help on using the changeset viewer.