highmem.h 2.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * highmem.h: virtual kernel memory mappings for high memory
 *
 * Used in CONFIG_HIGHMEM systems for memory pages which
 * are not addressable by direct kernel virtual addresses.
 *
 * Copyright (C) 1999 Gerhard Wichert, Siemens AG
 *		      Gerhard.Wichert@pdb.siemens.de
 *
 *
11
 * Redesigned the x86 32-bit VM architecture to deal with
L
Linus Torvalds 已提交
12 13 14 15 16 17
 * up to 16 Terabyte physical memory. With current x86 CPUs
 * we now support up to 64 Gigabytes physical RAM.
 *
 * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
 */

V
Vegard Nossum 已提交
18 19
#ifndef ASM_X86__HIGHMEM_H
#define ASM_X86__HIGHMEM_H
L
Linus Torvalds 已提交
20 21 22 23 24 25 26

#ifdef __KERNEL__

#include <linux/interrupt.h>
#include <linux/threads.h>
#include <asm/kmap_types.h>
#include <asm/tlbflush.h>
27
#include <asm/paravirt.h>
L
Linus Torvalds 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

/* declarations for highmem.c */
extern unsigned long highstart_pfn, highend_pfn;

extern pte_t *kmap_pte;
extern pgprot_t kmap_prot;
extern pte_t *pkmap_page_table;

/*
 * Right now we initialize only a single pte table. It can be extended
 * easily, subsequent pte tables have to be allocated in one physical
 * chunk of RAM.
 */
/*
 * Ordering is:
 *
 * FIXADDR_TOP
 * 			fixed_addresses
 * FIXADDR_START
 * 			temp fixed addresses
 * FIXADDR_BOOT_START
 * 			Persistent kmap area
 * PKMAP_BASE
 * VMALLOC_END
 * 			Vmalloc area
 * VMALLOC_START
 * high_memory
 */
#define LAST_PKMAP_MASK (LAST_PKMAP-1)
#define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))

60 61
extern void *kmap_high(struct page *page);
extern void kunmap_high(struct page *page);
L
Linus Torvalds 已提交
62 63 64

void *kmap(struct page *page);
void kunmap(struct page *page);
65
void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot);
L
Linus Torvalds 已提交
66 67
void *kmap_atomic(struct page *page, enum km_type type);
void kunmap_atomic(void *kvaddr, enum km_type type);
68
void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
L
Linus Torvalds 已提交
69 70
struct page *kmap_atomic_to_page(void *ptr);

71 72 73 74
#ifndef CONFIG_PARAVIRT
#define kmap_atomic_pte(page, type)	kmap_atomic(page, type)
#endif

L
Linus Torvalds 已提交
75 76
#define flush_cache_kmaps()	do { } while (0)

77
extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn,
Y
Yinghai Lu 已提交
78
					unsigned long end_pfn);
79

L
Linus Torvalds 已提交
80 81
#endif /* __KERNEL__ */

V
Vegard Nossum 已提交
82
#endif /* ASM_X86__HIGHMEM_H */