mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 08:44:21 +08:00
5c01b46bb6
Memory management in generic is highly architecture specific, but on NOMMU architectures, it is mostly trivial, so just add a default implementation in asm-generic that applies to all NOMMU architectures. The two files cache.h and cacheflush.h can possibly also be used by architectures that have an MMU but never require flushing the cache or have cache lines larger than 32 bytes. Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
#ifndef __ASM_GENERIC_PAGE_H
|
|
#define __ASM_GENERIC_PAGE_H
|
|
/*
|
|
* Generic page.h implementation, for NOMMU architectures.
|
|
* This provides the dummy definitions for the memory management.
|
|
*/
|
|
|
|
#ifdef CONFIG_MMU
|
|
#error need to prove a real asm/page.h
|
|
#endif
|
|
|
|
|
|
/* PAGE_SHIFT determines the page size */
|
|
|
|
#define PAGE_SHIFT 12
|
|
#ifdef __ASSEMBLY__
|
|
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
|
#else
|
|
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
|
#endif
|
|
#define PAGE_MASK (~(PAGE_SIZE-1))
|
|
|
|
#include <asm/setup.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#define get_user_page(vaddr) __get_free_page(GFP_KERNEL)
|
|
#define free_user_page(page, addr) free_page(addr)
|
|
|
|
#define clear_page(page) memset((page), 0, PAGE_SIZE)
|
|
#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE)
|
|
|
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
|
|
|
/*
|
|
* These are used to make use of C type-checking..
|
|
*/
|
|
typedef struct {
|
|
unsigned long pte;
|
|
} pte_t;
|
|
typedef struct {
|
|
unsigned long pmd[16];
|
|
} pmd_t;
|
|
typedef struct {
|
|
unsigned long pgd;
|
|
} pgd_t;
|
|
typedef struct {
|
|
unsigned long pgprot;
|
|
} pgprot_t;
|
|
typedef struct page *pgtable_t;
|
|
|
|
#define pte_val(x) ((x).pte)
|
|
#define pmd_val(x) ((&x)->pmd[0])
|
|
#define pgd_val(x) ((x).pgd)
|
|
#define pgprot_val(x) ((x).pgprot)
|
|
|
|
#define __pte(x) ((pte_t) { (x) } )
|
|
#define __pmd(x) ((pmd_t) { (x) } )
|
|
#define __pgd(x) ((pgd_t) { (x) } )
|
|
#define __pgprot(x) ((pgprot_t) { (x) } )
|
|
|
|
extern unsigned long memory_start;
|
|
extern unsigned long memory_end;
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
#ifdef CONFIG_KERNEL_RAM_BASE_ADDRESS
|
|
#define PAGE_OFFSET (CONFIG_KERNEL_RAM_BASE_ADDRESS)
|
|
#else
|
|
#define PAGE_OFFSET (0)
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
|
|
#define __pa(x) ((unsigned long) (x) - PAGE_OFFSET)
|
|
|
|
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
|
#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
|
|
|
|
#define virt_to_page(addr) (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
|
|
#define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
|
|
|
|
#ifndef page_to_phys
|
|
#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
|
|
#endif
|
|
|
|
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
|
|
|
#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
|
|
((void *)(kaddr) < (void *)memory_end))
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#include <asm-generic/memory_model.h>
|
|
#include <asm-generic/getorder.h>
|
|
|
|
#endif /* __ASM_GENERIC_PAGE_H */
|