2 * $Id: kl_mem_ia64.h 1250 2006-04-18 18:23:44Z cliffpwickman $
4 * This file is part of libklib.
5 * A library which provides access to Linux system kernel dumps.
7 * Created by Silicon Graphics, Inc.
8 * Contributions by IBM, NEC, and others
10 * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
11 * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
12 * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
14 * This code is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser Public License as published by
16 * the Free Software Foundation; either version 2.1 of the License, or
17 * (at your option) any later version. See the file COPYING for more
21 #ifndef __KL_MEM_IA64_H
22 #define __KL_MEM_IA64_H
24 /* XXX - the following macros are used by functions in kl_page.c and in */
25 /* function kl_virtop, they still have to be defined properly, */
26 /* all the following macros have first to be set with correct values. */
27 /* I don't have a clue what values to use for ia64 architecture!!! */
29 /* KSTACK_SIZE depends on page size (see kernel headers ptrace.h and page.h)
30 * #define IA64_STK_OFFSET ((1 << IA64_TASK_STRUCT_LOG_NUM_PAGES)*PAGE_SIZE)
32 * #define PAGE_SIZE 1UL<<PAGE_SHIFT
34 * #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
35 * # define PAGE_SHIFT 12
36 * #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
37 * # define PAGE_SHIFT 13
38 * #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
39 * # define PAGE_SHIFT 14
40 * #elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
41 * # define PAGE_SHIFT 16
43 * # error Unsupported page size!
46 * #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
47 * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 3
48 * #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
49 * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 2
50 * #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
51 * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 1
53 * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 0
55 * Finally we have for page sizes 4KB, 8K, 16K IA64_STK_OFFSET=32K, and
56 * for page size 64K IA64_STK_OFFSET=64K.
57 * FIXME: !!!Don't know how to handle 64K page size case!!!
59 #define KL_KSTACK_SIZE_IA64 0x8000ULL
60 /* 64KB page size case:
61 * #define KL_KSTACK_SIZE_IA64 0x10000ULL
64 #define KL_PAGE_OFFSET_IA64 0xe000000000000000
66 #define KL_PAGE_SHIFT_IA64 KL_PAGE_SHIFT
67 #define KL_PAGE_SIZE_IA64 (1ULL << KL_PAGE_SHIFT_IA64)
68 #define KL_PAGE_MASK_IA64 (~(KL_PAGE_SIZE_IA64-1))
70 /* for 3-level page tables: */
71 #define KL_PGDIR_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*2)
72 #define KL_PGDIR_SIZE_IA64 (1ULL<<KL_PGDIR_SHIFT_IA64)
73 #define KL_PGDIR_MASK_IA64 (~(KL_PGDIR_SIZE_IA64-1))
75 /* for 4-level page tables: */
76 #define KL_PGDIR4_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*3)
77 #define KL_PGDIR4_SIZE_IA64 (1ULL<<KL_PGDIR4_SHIFT_IA64)
78 #define KL_PGDIR4_MASK_IA64 (~(KL_PGDIR_SIZE4_IA64-1))
79 #define KL_PUD_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*2)
80 #define KL_PUD_SIZE_IA64 (1ULL<<KL_PUD_SHIFT_IA64)
81 #define KL_PUD_MASK_IA64 (~(KL_PUD_SIZE_IA64-1))
83 #define KL_PMD_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*1)
84 #define KL_PMD_SIZE_IA64 (1ULL<<KL_PMD_SHIFT_IA64)
85 #define KL_PMD_MASK_IA64 (~(KL_PMD_SIZE_IA64-1))
87 #define KL_PTRS_PER_PGD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
88 #define KL_PTRS_PER_PUD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
89 #define KL_PTRS_PER_PMD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
90 #define KL_PTRS_PER_PTE_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
92 /* These values describe the bits of pgd/pmd/pte entries that are
93 * status bits and therefor have to be masked in order to get valid
96 #define KL_PMD_BASE_MASK_IA64 (((1ULL<<50)-1)&(~0xfffULL))
97 #define KL_PT_BASE_MASK_IA64 KL_PMD_BASE_MASK_IA64
98 #define KL_PAGE_BASE_MASK_IA64 KL_PMD_BASE_MASK_IA64
100 #define KL_KADDR_IS_HIGHMEM(vaddr) ((KL_HIGH_MEMORY && (vaddr >= KL_HIGH_MEMORY)))
102 uint32_t dha_num_cpus_ia64(void);
103 kaddr_t dha_current_task_ia64(int);
104 int dha_cpuid_ia64(kaddr_t);
105 kaddr_t dha_stack_ia64(int);
106 kaddr_t dha_stack_ptr_ia64(int);
107 kaddr_t kl_kernelstack_ia64(kaddr_t);
108 kaddr_t kl_mmap_virtop_ia64(kaddr_t, void*);
109 int kl_init_virtop_ia64(void);
110 int kl_virtop_ia64(kaddr_t, void*, kaddr_t*);
111 int kl_vtop_ia64(kaddr_t, kaddr_t*);
112 int kl_valid_physmem_ia64(kaddr_t, int);
113 kaddr_t kl_next_valid_physaddr_ia64(kaddr_t);
114 kaddr_t kl_fix_vaddr_ia64(kaddr_t, size_t);
116 /* Structure containing key data for ia64 virtual memory mapping.
117 * Note that a number of fields are SN system specific.
119 typedef struct ia64_vminfo_s {
121 kaddr_t vpernode_base;
122 kaddr_t vglobal_base;
123 kaddr_t to_phys_mask;
124 kaddr_t kernphysbase;
125 int nasid_shift; /* SN specific */
126 int nasid_mask; /* SN specific */
129 extern ia64_vminfo_t ia64_vminfo;
133 #define MAPPED_KERN_FLAG 0x1
136 /* Some vminfo macros
138 #define IS_MAPPED_KERN (ia64_vminfo.flags & MAPPED_KERN_FLAG)
139 #define IS_SN2 (ia64_vminfo.flags & SN2_FLAG)
140 #define KL_VPERNODE_BASE ia64_vminfo.vpernode_base
141 #define KL_VGLOBAL_BASE ia64_vminfo.vglobal_base
142 #define KL_TO_PHYS_MASK ia64_vminfo.to_phys_mask
143 #define KL_KERNPHYSBASE ia64_vminfo.kernphysbase
144 #define KL_NASID_SHIFT ia64_vminfo.nasid_shift
145 #define KL_NASID_MASK ia64_vminfo.nasid_mask
147 #define ADDR_TO_NASID(A) (((A) >> (long)(KL_NASID_SHIFT)) & KL_NASID_MASK)
149 #endif /* __KL_MEM_IA64_H */