2005-04-17 02:20:36 +04:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1994 , 95 , 96 , 97 , 98 , 99 , 2000 , 2003 Ralf Baechle
* Copyright ( C ) 1999 , 2000 , 2001 Silicon Graphics , Inc .
*/
# ifndef _ASM_PGTABLE_64_H
# define _ASM_PGTABLE_64_H
2012-10-17 03:01:12 +04:00
# include <linux/compiler.h>
2005-04-17 02:20:36 +04:00
# include <linux/linkage.h>
# include <asm/addrspace.h>
# include <asm/page.h>
# include <asm/cachectl.h>
[MIPS] Load modules to CKSEG0 if CONFIG_BUILD_ELF64=n
This is a patch to load 64-bit modules to CKSEG0 so that can be
compiled with -msym32 option. This makes each module ~10% smaller.
* introduce MODULE_START and MODULE_END
* custom module_alloc()
* PGD for modules
* change XTLB refill handler synthesizer
* enable -msym32 for modules again
(revert ca78b1a5c6a6e70e052d3ea253828e49b5d07c8a)
New XTLB refill handler looks like this:
80000080 dmfc0 k0,C0_BADVADDR
80000084 bltz k0,800000e4 # goto l_module_alloc
80000088 lui k1,0x8046 # %high(pgd_current)
8000008c ld k1,24600(k1) # %low(pgd_current)
80000090 dsrl k0,k0,0x1b # l_vmalloc_done:
80000094 andi k0,k0,0x1ff8
80000098 daddu k1,k1,k0
8000009c dmfc0 k0,C0_BADVADDR
800000a0 ld k1,0(k1)
800000a4 dsrl k0,k0,0x12
800000a8 andi k0,k0,0xff8
800000ac daddu k1,k1,k0
800000b0 dmfc0 k0,C0_XCONTEXT
800000b4 ld k1,0(k1)
800000b8 andi k0,k0,0xff0
800000bc daddu k1,k1,k0
800000c0 ld k0,0(k1)
800000c4 ld k1,8(k1)
800000c8 dsrl k0,k0,0x6
800000cc mtc0 k0,C0_ENTRYLO0
800000d0 dsrl k1,k1,0x6
800000d4 mtc0 k1,C0_ENTRYL01
800000d8 nop
800000dc tlbwr
800000e0 eret
800000e4 dsll k1,k0,0x2 # l_module_alloc:
800000e8 bgez k1,80000008 # goto l_vmalloc
800000ec lui k1,0xc000
800000f0 dsubu k0,k0,k1
800000f4 lui k1,0x8046 # %high(module_pg_dir)
800000f8 beq zero,zero,80000000
800000fc nop
80000000 beq zero,zero,80000090 # goto l_vmalloc_done
80000004 daddiu k1,k1,0x4000
80000008 dsll32 k1,k1,0x0 # l_vmalloc:
8000000c dsubu k0,k0,k1
80000010 beq zero,zero,80000090 # goto l_vmalloc_done
80000014 lui k1,0x8046 # %high(swapper_pg_dir)
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-10-25 19:08:31 +04:00
# include <asm/fixmap.h>
2005-04-17 02:20:36 +04:00
2019-11-21 19:21:31 +03:00
# if CONFIG_PGTABLE_LEVELS == 2
2009-12-05 00:52:36 +03:00
# include <asm-generic/pgtable-nopmd.h>
2019-11-21 19:21:31 +03:00
# elif CONFIG_PGTABLE_LEVELS == 3
2005-02-10 15:19:59 +03:00
# include <asm-generic/pgtable-nopud.h>
2019-11-21 19:21:31 +03:00
# else
2019-11-21 19:21:33 +03:00
# include <asm-generic/pgtable-nop4d.h>
2009-12-05 00:52:36 +03:00
# endif
2005-02-10 15:19:59 +03:00
2005-04-17 02:20:36 +04:00
/*
* Each address space has 2 4 K pages as its page directory , giving 1024
* ( = = PTRS_PER_PGD ) 8 byte pointers to pmd tables . Each pmd table is a
2005-02-10 15:19:59 +03:00
* single 4 K page , giving 512 ( = = PTRS_PER_PMD ) 8 byte pointers to page
* tables . Each page table is also a single 4 K page , giving 512 ( = =
* PTRS_PER_PTE ) 8 byte ptes . Each pud entry is initialized to point to
* invalid_pmd_table , each pmd entry is initialized to point to
2017-11-16 04:34:22 +03:00
* invalid_pte_table , each pte is initialized to 0.
2005-04-17 02:20:36 +04:00
*
* Kernel mappings : kernel mappings are held in the swapper_pg_table .
* The layout is identical to userspace except it ' s indexed with the
* fault address - VMALLOC_START .
*/
2009-12-05 00:52:36 +03:00
/* PGDIR_SHIFT determines what a third-level page table entry can map */
# ifdef __PAGETABLE_PMD_FOLDED
# define PGDIR_SHIFT (PAGE_SHIFT + PAGE_SHIFT + PTE_ORDER - 3)
# else
2005-04-17 02:20:36 +04:00
/* PMD_SHIFT determines the size of the area a second-level page table can map */
2005-02-10 15:19:59 +03:00
# define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT + PTE_ORDER - 3))
2005-04-17 02:20:36 +04:00
# define PMD_SIZE (1UL << PMD_SHIFT)
# define PMD_MASK (~(PMD_SIZE-1))
2017-02-17 04:27:34 +03:00
# ifdef __PAGETABLE_PUD_FOLDED
# define PGDIR_SHIFT (PMD_SHIFT + (PAGE_SHIFT + PMD_ORDER - 3))
# endif
# endif
2009-12-05 00:52:36 +03:00
2017-02-17 04:27:34 +03:00
# ifndef __PAGETABLE_PUD_FOLDED
# define PUD_SHIFT (PMD_SHIFT + (PAGE_SHIFT + PMD_ORDER - 3))
# define PUD_SIZE (1UL << PUD_SHIFT)
# define PUD_MASK (~(PUD_SIZE-1))
# define PGDIR_SHIFT (PUD_SHIFT + (PAGE_SHIFT + PUD_ORDER - 3))
2009-12-05 00:52:36 +03:00
# endif
2017-02-17 04:27:34 +03:00
2005-04-17 02:20:36 +04:00
# define PGDIR_SIZE (1UL << PGDIR_SHIFT)
# define PGDIR_MASK (~(PGDIR_SIZE-1))
/*
2005-02-10 15:19:59 +03:00
* For 4 kB page size we use a 3 level page tree and an 8 kB pud , which
2005-04-17 02:20:36 +04:00
* permits us mapping 40 bits of virtual address space .
*
* We used to implement 41 bits by having an order 1 pmd level but that seemed
* rather pointless .
*
* For 8 kB page size we use a 3 level page tree which permits a total of
* 8 TB of address space . Alternatively a 33 - bit / 8 GB organization using
* two levels would be easy to implement .
*
* For 16 kB page size we use a 2 level page tree which permits a total of
2005-02-21 14:11:32 +03:00
* 36 bits of virtual address space . We could add a third level but it seems
2005-04-17 02:20:36 +04:00
* like at the moment there ' s no need for this .
*
* For 64 kB page size we use a 2 level page table tree for a total of 42 bits
* of virtual address space .
*/
# ifdef CONFIG_PAGE_SIZE_4KB
2017-02-17 04:27:34 +03:00
# ifdef CONFIG_MIPS_VA_BITS_48
# define PGD_ORDER 0
# define PUD_ORDER 0
# else
# define PGD_ORDER 1
# define PUD_ORDER aieeee_attempt_to_allocate_pud
# endif
2005-04-17 02:20:36 +04:00
# define PMD_ORDER 0
# define PTE_ORDER 0
# endif
# ifdef CONFIG_PAGE_SIZE_8KB
# define PGD_ORDER 0
2005-02-10 15:19:59 +03:00
# define PUD_ORDER aieeee_attempt_to_allocate_pud
2005-04-17 02:20:36 +04:00
# define PMD_ORDER 0
# define PTE_ORDER 0
# endif
# ifdef CONFIG_PAGE_SIZE_16KB
2015-05-15 04:34:43 +03:00
# ifdef CONFIG_MIPS_VA_BITS_48
# define PGD_ORDER 1
# else
# define PGD_ORDER 0
# endif
2005-02-10 15:19:59 +03:00
# define PUD_ORDER aieeee_attempt_to_allocate_pud
2005-04-17 02:20:36 +04:00
# define PMD_ORDER 0
# define PTE_ORDER 0
# endif
2009-04-02 16:07:10 +04:00
# ifdef CONFIG_PAGE_SIZE_32KB
# define PGD_ORDER 0
# define PUD_ORDER aieeee_attempt_to_allocate_pud
# define PMD_ORDER 0
# define PTE_ORDER 0
# endif
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_PAGE_SIZE_64KB
# define PGD_ORDER 0
2005-02-10 15:19:59 +03:00
# define PUD_ORDER aieeee_attempt_to_allocate_pud
2015-05-15 04:34:43 +03:00
# ifdef CONFIG_MIPS_VA_BITS_48
# define PMD_ORDER 0
# else
2009-12-05 00:52:36 +03:00
# define PMD_ORDER aieeee_attempt_to_allocate_pmd
2015-05-15 04:34:43 +03:00
# endif
2005-04-17 02:20:36 +04:00
# define PTE_ORDER 0
# endif
# define PTRS_PER_PGD ((PAGE_SIZE << PGD_ORDER) / sizeof(pgd_t))
2017-02-17 04:27:34 +03:00
# ifndef __PAGETABLE_PUD_FOLDED
# define PTRS_PER_PUD ((PAGE_SIZE << PUD_ORDER) / sizeof(pud_t))
# endif
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2005-04-17 02:20:36 +04:00
# define PTRS_PER_PMD ((PAGE_SIZE << PMD_ORDER) / sizeof(pmd_t))
2009-12-05 00:52:36 +03:00
# endif
2005-04-17 02:20:36 +04:00
# define PTRS_PER_PTE ((PAGE_SIZE << PTE_ORDER) / sizeof(pte_t))
2015-05-15 04:34:43 +03:00
# define USER_PTRS_PER_PGD ((TASK_SIZE64 / PGDIR_SIZE)?(TASK_SIZE64 / PGDIR_SIZE):1)
2006-08-23 19:15:49 +04:00
# define FIRST_USER_ADDRESS 0UL
2005-04-17 02:20:36 +04:00
2010-04-19 22:43:10 +04:00
/*
* TLB refill handlers also map the vmalloc area into xuseg . Avoid
* the first couple of pages so NULL pointer dereferences will still
* reliably trap .
*/
# define VMALLOC_START (MAP_BASE + (2 * PAGE_SIZE))
2005-04-17 02:20:36 +04:00
# define VMALLOC_END \
2010-04-19 22:43:10 +04:00
( MAP_BASE + \
2017-02-17 04:27:34 +03:00
min ( PTRS_PER_PGD * PTRS_PER_PUD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE , \
2010-02-02 19:52:20 +03:00
( 1UL < < cpu_vmbits ) ) - ( 1UL < < 32 ) )
2007-02-15 16:21:36 +03:00
# if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
[MIPS] Load modules to CKSEG0 if CONFIG_BUILD_ELF64=n
This is a patch to load 64-bit modules to CKSEG0 so that can be
compiled with -msym32 option. This makes each module ~10% smaller.
* introduce MODULE_START and MODULE_END
* custom module_alloc()
* PGD for modules
* change XTLB refill handler synthesizer
* enable -msym32 for modules again
(revert ca78b1a5c6a6e70e052d3ea253828e49b5d07c8a)
New XTLB refill handler looks like this:
80000080 dmfc0 k0,C0_BADVADDR
80000084 bltz k0,800000e4 # goto l_module_alloc
80000088 lui k1,0x8046 # %high(pgd_current)
8000008c ld k1,24600(k1) # %low(pgd_current)
80000090 dsrl k0,k0,0x1b # l_vmalloc_done:
80000094 andi k0,k0,0x1ff8
80000098 daddu k1,k1,k0
8000009c dmfc0 k0,C0_BADVADDR
800000a0 ld k1,0(k1)
800000a4 dsrl k0,k0,0x12
800000a8 andi k0,k0,0xff8
800000ac daddu k1,k1,k0
800000b0 dmfc0 k0,C0_XCONTEXT
800000b4 ld k1,0(k1)
800000b8 andi k0,k0,0xff0
800000bc daddu k1,k1,k0
800000c0 ld k0,0(k1)
800000c4 ld k1,8(k1)
800000c8 dsrl k0,k0,0x6
800000cc mtc0 k0,C0_ENTRYLO0
800000d0 dsrl k1,k1,0x6
800000d4 mtc0 k1,C0_ENTRYL01
800000d8 nop
800000dc tlbwr
800000e0 eret
800000e4 dsll k1,k0,0x2 # l_module_alloc:
800000e8 bgez k1,80000008 # goto l_vmalloc
800000ec lui k1,0xc000
800000f0 dsubu k0,k0,k1
800000f4 lui k1,0x8046 # %high(module_pg_dir)
800000f8 beq zero,zero,80000000
800000fc nop
80000000 beq zero,zero,80000090 # goto l_vmalloc_done
80000004 daddiu k1,k1,0x4000
80000008 dsll32 k1,k1,0x0 # l_vmalloc:
8000000c dsubu k0,k0,k1
80000010 beq zero,zero,80000090 # goto l_vmalloc_done
80000014 lui k1,0x8046 # %high(swapper_pg_dir)
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2006-10-25 19:08:31 +04:00
VMALLOC_START ! = CKSSEG
/* Load modules into 32bit-compatible segment. */
# define MODULE_START CKSSEG
# define MODULE_END (FIXADDR_START-2*PAGE_SIZE)
# endif
2005-04-17 02:20:36 +04:00
# define pte_ERROR(e) \
printk ( " %s:%d: bad pte %016lx. \n " , __FILE__ , __LINE__ , pte_val ( e ) )
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2005-04-17 02:20:36 +04:00
# define pmd_ERROR(e) \
printk ( " %s:%d: bad pmd %016lx. \n " , __FILE__ , __LINE__ , pmd_val ( e ) )
2009-12-05 00:52:36 +03:00
# endif
2017-02-17 04:27:34 +03:00
# ifndef __PAGETABLE_PUD_FOLDED
# define pud_ERROR(e) \
printk ( " %s:%d: bad pud %016lx. \n " , __FILE__ , __LINE__ , pud_val ( e ) )
# endif
2005-04-17 02:20:36 +04:00
# define pgd_ERROR(e) \
printk ( " %s:%d: bad pgd %016lx. \n " , __FILE__ , __LINE__ , pgd_val ( e ) )
2005-02-10 15:19:59 +03:00
extern pte_t invalid_pte_table [ PTRS_PER_PTE ] ;
2009-12-05 00:52:36 +03:00
2017-02-17 04:27:34 +03:00
# ifndef __PAGETABLE_PUD_FOLDED
/*
* For 4 - level pagetables we defines these ourselves , for 3 - level the
* definitions are below , for 2 - level the
* definitions are supplied by < asm - generic / pgtable - nopmd . h > .
*/
typedef struct { unsigned long pud ; } pud_t ;
# define pud_val(x) ((x).pud)
# define __pud(x) ((pud_t) { (x) })
extern pud_t invalid_pud_table [ PTRS_PER_PUD ] ;
/*
* Empty pgd entries point to the invalid_pud_table .
*/
2019-11-21 19:21:33 +03:00
static inline int p4d_none ( p4d_t p4d )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
return p4d_val ( p4d ) = = ( unsigned long ) invalid_pud_table ;
2017-02-17 04:27:34 +03:00
}
2019-11-21 19:21:33 +03:00
static inline int p4d_bad ( p4d_t p4d )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
if ( unlikely ( p4d_val ( p4d ) & ~ PAGE_MASK ) )
2017-02-17 04:27:34 +03:00
return 1 ;
return 0 ;
}
2019-11-21 19:21:33 +03:00
static inline int p4d_present ( p4d_t p4d )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
return p4d_val ( p4d ) ! = ( unsigned long ) invalid_pud_table ;
2017-02-17 04:27:34 +03:00
}
2019-11-21 19:21:33 +03:00
static inline void p4d_clear ( p4d_t * p4dp )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
p4d_val ( * p4dp ) = ( unsigned long ) invalid_pud_table ;
2017-02-17 04:27:34 +03:00
}
2019-11-21 19:21:33 +03:00
static inline unsigned long p4d_page_vaddr ( p4d_t p4d )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
return p4d_val ( p4d ) ;
2017-02-17 04:27:34 +03:00
}
2019-11-21 19:21:33 +03:00
# define p4d_phys(p4d) virt_to_phys((void *)p4d_val(p4d))
# define p4d_page(p4d) (pfn_to_page(p4d_phys(p4d) >> PAGE_SHIFT))
2019-11-21 19:21:31 +03:00
2019-11-21 19:21:33 +03:00
# define p4d_index(address) (((address) >> P4D_SHIFT) & (PTRS_PER_P4D - 1))
static inline void set_p4d ( p4d_t * p4d , p4d_t p4dval )
2017-02-17 04:27:34 +03:00
{
2019-11-21 19:21:33 +03:00
* p4d = p4dval ;
2017-02-17 04:27:34 +03:00
}
# endif
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
/*
* For 3 - level pagetables we defines these ourselves , for 2 - level the
* definitions are supplied by < asm - generic / pgtable - nopmd . h > .
*/
typedef struct { unsigned long pmd ; } pmd_t ;
# define pmd_val(x) ((x).pmd)
# define __pmd(x) ((pmd_t) { (x) } )
2005-02-10 15:19:59 +03:00
extern pmd_t invalid_pmd_table [ PTRS_PER_PMD ] ;
2009-12-05 00:52:36 +03:00
# endif
2005-04-17 02:20:36 +04:00
/*
2005-04-01 18:07:13 +04:00
* Empty pgd / pmd entries point to the invalid_pte_table .
2005-04-17 02:20:36 +04:00
*/
static inline int pmd_none ( pmd_t pmd )
{
return pmd_val ( pmd ) = = ( unsigned long ) invalid_pte_table ;
}
2012-10-17 03:01:12 +04:00
static inline int pmd_bad ( pmd_t pmd )
{
2012-10-18 15:54:15 +04:00
# ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
2012-10-17 03:01:12 +04:00
/* pmd_huge(pmd) but inline */
if ( unlikely ( pmd_val ( pmd ) & _PAGE_HUGE ) )
return 0 ;
# endif
if ( unlikely ( pmd_val ( pmd ) & ~ PAGE_MASK ) )
return 1 ;
return 0 ;
}
2005-04-17 02:20:36 +04:00
static inline int pmd_present ( pmd_t pmd )
{
2018-11-15 10:53:54 +03:00
# ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
if ( unlikely ( pmd_val ( pmd ) & _PAGE_HUGE ) )
return pmd_val ( pmd ) & _PAGE_PRESENT ;
# endif
2005-04-17 02:20:36 +04:00
return pmd_val ( pmd ) ! = ( unsigned long ) invalid_pte_table ;
}
static inline void pmd_clear ( pmd_t * pmdp )
{
pmd_val ( * pmdp ) = ( ( unsigned long ) invalid_pte_table ) ;
}
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2005-04-17 02:20:36 +04:00
/*
2005-02-21 14:11:32 +03:00
* Empty pud entries point to the invalid_pmd_table .
2005-04-17 02:20:36 +04:00
*/
2005-02-10 15:19:59 +03:00
static inline int pud_none ( pud_t pud )
2005-04-17 02:20:36 +04:00
{
2005-02-10 15:19:59 +03:00
return pud_val ( pud ) = = ( unsigned long ) invalid_pmd_table ;
2005-04-17 02:20:36 +04:00
}
2005-02-10 15:19:59 +03:00
static inline int pud_bad ( pud_t pud )
{
return pud_val ( pud ) & ~ PAGE_MASK ;
}
2005-04-17 02:20:36 +04:00
2005-02-10 15:19:59 +03:00
static inline int pud_present ( pud_t pud )
2005-04-17 02:20:36 +04:00
{
2005-02-10 15:19:59 +03:00
return pud_val ( pud ) ! = ( unsigned long ) invalid_pmd_table ;
2005-04-17 02:20:36 +04:00
}
2005-02-10 15:19:59 +03:00
static inline void pud_clear ( pud_t * pudp )
2005-04-17 02:20:36 +04:00
{
2005-02-10 15:19:59 +03:00
pud_val ( * pudp ) = ( ( unsigned long ) invalid_pmd_table ) ;
2005-04-17 02:20:36 +04:00
}
2009-12-05 00:52:36 +03:00
# endif
2005-04-17 02:20:36 +04:00
2005-04-01 18:07:13 +04:00
# define pte_page(x) pfn_to_page(pte_pfn(x))
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_CPU_VR41XX
# define pte_pfn(x) ((unsigned long)((x).pte >> (PAGE_SHIFT + 2)))
# define pfn_pte(pfn, prot) __pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot))
# else
2010-02-11 02:12:47 +03:00
# define pte_pfn(x) ((unsigned long)((x).pte >> _PFN_SHIFT))
# define pfn_pte(pfn, prot) __pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
2013-01-18 22:16:40 +04:00
# define pfn_pmd(pfn, prot) __pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
2005-04-17 02:20:36 +04:00
# endif
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2006-09-26 10:31:48 +04:00
static inline unsigned long pud_page_vaddr ( pud_t pud )
2005-04-17 02:20:36 +04:00
{
2005-02-10 15:19:59 +03:00
return pud_val ( pud ) ;
2005-04-17 02:20:36 +04:00
}
2007-03-19 19:36:42 +03:00
# define pud_phys(pud) virt_to_phys((void *)pud_val(pud))
2006-09-26 10:31:48 +04:00
# define pud_page(pud) (pfn_to_page(pud_phys(pud) >> PAGE_SHIFT))
2005-04-17 02:20:36 +04:00
2009-12-05 00:52:36 +03:00
# endif
2005-04-17 02:20:36 +04:00
/*
* Initialize a new pgd / pmd table with invalid pointers .
*/
extern void pgd_init ( unsigned long page ) ;
2017-02-17 04:27:34 +03:00
extern void pud_init ( unsigned long page , unsigned long pagetable ) ;
2005-04-17 02:20:36 +04:00
extern void pmd_init ( unsigned long page , unsigned long pagetable ) ;
/*
2015-02-25 02:35:34 +03:00
* Non - present pages : high 40 bits are offset , next 8 bits type ,
* low 16 bits zero .
2005-04-17 02:20:36 +04:00
*/
static inline pte_t mk_swap_pte ( unsigned long type , unsigned long offset )
2015-02-25 02:35:34 +03:00
{ pte_t pte ; pte_val ( pte ) = ( type < < 16 ) | ( offset < < 24 ) ; return pte ; }
2005-04-17 02:20:36 +04:00
2015-02-25 02:35:34 +03:00
# define __swp_type(x) (((x).val >> 16) & 0xff)
# define __swp_offset(x) ((x).val >> 24)
2007-10-12 02:46:15 +04:00
# define __swp_entry(type, offset) ((swp_entry_t) { pte_val(mk_swap_pte((type), (offset))) })
2013-01-22 15:59:30 +04:00
# define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
2005-04-17 02:20:36 +04:00
# define __swp_entry_to_pte(x) ((pte_t) { (x).val })
# endif /* _ASM_PGTABLE_64_H */