1/*
2 * Copyright (c) 2007 Apple Inc. All rights reserved.
3 */
4/*
5 * FILE_ID: vm_param.h
6 */
7
8/*
9 *	ARM machine dependent virtual memory parameters.
10 */
11
12#ifndef	_MACH_ARM_VM_PARAM_H_
13#define _MACH_ARM_VM_PARAM_H_
14
15#define BYTE_SIZE	8	/* byte size in bits */
16
17#define KB (1024ULL)
18#define MB (1024 * KB)
19#define GB (1024 * GB)
20
21#define ARM_PGBYTES	4096	/* bytes per ARM small page */
22#define ARM_PGSHIFT	12	/* number of bits to shift for pages */
23
24#define KERNEL_IMAGE_TO_PHYS(x)  (x)
25#define LINEAR_KERNEL_ADDRESS ((vm_offset_t)0x0)
26
27#if defined (KERNEL) || !defined (__arm64__)
28
29#define PAGE_SIZE       ARM_PGBYTES
30#define PAGE_SHIFT     ARM_PGSHIFT
31#define PAGE_MASK      (PAGE_SIZE-1)
32#define VM_PAGE_SIZE	ARM_PGBYTES
33#define	machine_ptob(x)	((x) << ARM_PGSHIFT)
34
35#else
36
37/* ARM64 userland gets a 16k pagesize */
38#define PAGE_SIZE    	(0x4000)
39#define PAGE_SHIFT    	(14)
40#define PAGE_MASK      (PAGE_SIZE-1)
41
42#define VM_PAGE_SIZE	PAGE_SIZE
43
44#define	machine_ptob(x)	((x) << 14)
45
46#endif
47
48#define KERNEL_STACK_SIZE	(4*ARM_PGBYTES)
49#define INTSTACK_SIZE		(4*ARM_PGBYTES)
50						/* interrupt stack size */
51
52#ifndef __ASSEMBLER__
53/*
54 *	Round off or truncate to the nearest page.  These will work
55 *	for either addresses or counts.  (i.e. 1 byte rounds to 1 page
56 *	bytes.
57 */
58
59
60#if defined (__arm__)
61
62#define VM_MIN_ADDRESS		((vm_address_t) 0x00000000)
63#define VM_MAX_ADDRESS		((vm_address_t) 0x80000000)
64
65#define HIGH_EXC_VECTORS	((vm_address_t) 0xFFFF0000)
66
67#define VM_MIN_KERNEL_ADDRESS	((vm_address_t) 0x80000000)
68#define VM_MIN_KERNEL_AND_KEXT_ADDRESS VM_MIN_KERNEL_ADDRESS
69#define VM_HIGH_KERNEL_WINDOW	((vm_address_t) 0xFFFE0000)
70#define VM_MAX_KERNEL_ADDRESS	((vm_address_t) 0xFFFEFFFF)
71
72#define VM_KERNEL_ADDRESS(va)	((((vm_address_t)(va))>=VM_MIN_KERNEL_ADDRESS) && \
73              (((vm_address_t)(va))<=VM_MAX_KERNEL_ADDRESS))
74
75/* system-wide values */
76#define MACH_VM_MIN_ADDRESS		((mach_vm_offset_t) 0)
77#define MACH_VM_MAX_ADDRESS		((mach_vm_offset_t) VM_MAX_ADDRESS)
78
79#elif defined (__arm64__)
80
81#define VM_MIN_ADDRESS		((vm_address_t) 0x0000000000000000ULL)
82#define VM_MAX_ADDRESS		((vm_address_t) 0x0000000040000000ULL)
83
84#define VM_MIN_KERNEL_ADDRESS	((vm_address_t) 0xffffff8000000000ULL)
85#define VM_MIN_KERNEL_AND_KEXT_ADDRESS VM_MIN_KERNEL_ADDRESS
86#define VM_MAX_KERNEL_ADDRESS	((vm_address_t) 0xffffff80ffffffffULL)
87
88#define VM_KERNEL_ADDRESS(va)	((((vm_address_t)(va))>=VM_MIN_KERNEL_ADDRESS) && \
89              (((vm_address_t)(va))<=VM_MAX_KERNEL_ADDRESS))
90
91/* system-wide values */
92#define MACH_VM_MIN_ADDRESS		((mach_vm_offset_t) 0x0ULL)
93#define MACH_VM_MAX_ADDRESS		((mach_vm_offset_t) 0x00000001A0000000ULL)
94
95#else
96#error architecture not supported
97#endif
98
99/*
100 *	Physical memory is mapped linearly at an offset virtual memory.
101 */
102extern unsigned long gVirtBase, gPhysBase, gPhysSize;
103#define isphysmem(a) (((vm_address_t)(a) - gPhysBase) < gPhysSize)
104#define phystokv(a)	((vm_address_t)(a) - gPhysBase + gVirtBase)
105#endif
106
107#define VM_MAX_PAGE_ADDRESS VM_MAX_ADDRESS
108#define VM32_SUPPORT 1
109#define VM32_MIN_ADDRESS ((vm32_offset_t)0)
110#define VM32_MAX_ADDRESS ((vm32_offset_t)(VM_MAX_PAGE_ADDRESS & 0xFFFFFFFF))
111
112#define SWI_SYSCALL	0x80
113
114#define KALLOC_LOG2_MINALIGN 4
115#define KALLOC_MINSIZE 16
116
117#endif	/* _MACH_ARM_VM_PARAM_H_ */
118
119