Added patch headers.
[linux-flexiantxendom0-3.2.10.git] / kdb / modules / lcrash / kl_mem_ia64.h
1 /*
2  * $Id: kl_mem_ia64.h 1250 2006-04-18 18:23:44Z cliffpwickman $
3  *
4  * This file is part of libklib.
5  * A library which provides access to Linux system kernel dumps.
6  *
7  * Created by Silicon Graphics, Inc.
8  * Contributions by IBM, NEC, and others
9  *
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>
13  *
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
18  * information.
19  */
20
21 #ifndef __KL_MEM_IA64_H
22 #define __KL_MEM_IA64_H
23
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!!! */
28
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)
31  * and
32  * #define PAGE_SIZE 1UL<<PAGE_SHIFT
33  * and
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
42  * #else
43  * # error Unsupported page size!
44  * #endif
45  * and
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
52  * #else
53  * # define IA64_TASK_STRUCT_LOG_NUM_PAGES         0
54  * #endif
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!!!
58  */
59 #define KL_KSTACK_SIZE_IA64        0x8000ULL
60 /* 64KB page size case:
61  * #define KL_KSTACK_SIZE_IA64        0x10000ULL
62  */
63
64 #define KL_PAGE_OFFSET_IA64        0xe000000000000000
65
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))
69
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))
74
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))
82
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))
86
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))
91
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
94  * addresses
95  */
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
99
100 #define KL_KADDR_IS_HIGHMEM(vaddr) ((KL_HIGH_MEMORY && (vaddr >= KL_HIGH_MEMORY)))
101
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);
115
116 /* Structure containing key data for ia64 virtual memory mapping.
117  * Note that a number of fields are SN system specific.
118  */
119 typedef struct ia64_vminfo_s {
120         int             flags;
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 */
127 } ia64_vminfo_t;
128
129 extern ia64_vminfo_t ia64_vminfo;
130
131 /* Some vminfo flags
132  */
133 #define MAPPED_KERN_FLAG        0x1
134 #define SN2_FLAG                0x2
135
136 /* Some vminfo macros
137  */
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
146
147 #define ADDR_TO_NASID(A) (((A) >> (long)(KL_NASID_SHIFT)) & KL_NASID_MASK)
148
149 #endif /* __KL_MEM_IA64_H */