diff options
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/Kconfig | 12 | ||||
-rw-r--r-- | arch/ia64/include/asm/compat.h | 208 | ||||
-rw-r--r-- | arch/ia64/include/asm/hardirq.h | 11 | ||||
-rw-r--r-- | arch/ia64/include/asm/iommu_table.h | 6 | ||||
-rw-r--r-- | arch/ia64/include/asm/irqflags.h | 94 | ||||
-rw-r--r-- | arch/ia64/include/asm/system.h | 80 | ||||
-rw-r--r-- | arch/ia64/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/cyclone.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/fsys.S | 30 | ||||
-rw-r--r-- | arch/ia64/kernel/iosapic.c | 60 | ||||
-rw-r--r-- | arch/ia64/kernel/irq_ia64.c | 5 | ||||
-rw-r--r-- | arch/ia64/kernel/mca.c | 38 | ||||
-rw-r--r-- | arch/ia64/kernel/msi_ia64.c | 8 | ||||
-rw-r--r-- | arch/ia64/kernel/palinfo.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/perfmon.c | 12 | ||||
-rw-r--r-- | arch/ia64/kernel/salinfo.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 4 | ||||
-rw-r--r-- | arch/ia64/kernel/stacktrace.c | 39 | ||||
-rw-r--r-- | arch/ia64/kernel/unwind.c | 23 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/msi_sn.c | 4 | ||||
-rw-r--r-- | arch/ia64/xen/xen_pv_ops.c | 5 |
21 files changed, 245 insertions, 401 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index ba22849ee3ec..7c82fa1fc911 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -53,6 +53,9 @@ config MMU | |||
53 | bool | 53 | bool |
54 | default y | 54 | default y |
55 | 55 | ||
56 | config ARCH_DMA_ADDR_T_64BIT | ||
57 | def_bool y | ||
58 | |||
56 | config NEED_DMA_MAP_STATE | 59 | config NEED_DMA_MAP_STATE |
57 | def_bool y | 60 | def_bool y |
58 | 61 | ||
@@ -62,6 +65,9 @@ config NEED_SG_DMA_LENGTH | |||
62 | config SWIOTLB | 65 | config SWIOTLB |
63 | bool | 66 | bool |
64 | 67 | ||
68 | config STACKTRACE_SUPPORT | ||
69 | def_bool y | ||
70 | |||
65 | config GENERIC_LOCKBREAK | 71 | config GENERIC_LOCKBREAK |
66 | def_bool n | 72 | def_bool n |
67 | 73 | ||
@@ -683,8 +689,10 @@ source "lib/Kconfig" | |||
683 | # Use the generic interrupt handling code in kernel/irq/: | 689 | # Use the generic interrupt handling code in kernel/irq/: |
684 | # | 690 | # |
685 | config GENERIC_HARDIRQS | 691 | config GENERIC_HARDIRQS |
686 | bool | 692 | def_bool y |
687 | default y | 693 | |
694 | config GENERIC_HARDIRQS_NO__DO_IRQ | ||
695 | def_bool y | ||
688 | 696 | ||
689 | config GENERIC_IRQ_PROBE | 697 | config GENERIC_IRQ_PROBE |
690 | bool | 698 | bool |
diff --git a/arch/ia64/include/asm/compat.h b/arch/ia64/include/asm/compat.h deleted file mode 100644 index f90edc85b509..000000000000 --- a/arch/ia64/include/asm/compat.h +++ /dev/null | |||
@@ -1,208 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_COMPAT_H | ||
2 | #define _ASM_IA64_COMPAT_H | ||
3 | /* | ||
4 | * Architecture specific compatibility types | ||
5 | */ | ||
6 | #include <linux/types.h> | ||
7 | |||
8 | #define COMPAT_USER_HZ 100 | ||
9 | #define COMPAT_UTS_MACHINE "i686\0\0\0" | ||
10 | |||
11 | typedef u32 compat_size_t; | ||
12 | typedef s32 compat_ssize_t; | ||
13 | typedef s32 compat_time_t; | ||
14 | typedef s32 compat_clock_t; | ||
15 | typedef s32 compat_key_t; | ||
16 | typedef s32 compat_pid_t; | ||
17 | typedef u16 __compat_uid_t; | ||
18 | typedef u16 __compat_gid_t; | ||
19 | typedef u32 __compat_uid32_t; | ||
20 | typedef u32 __compat_gid32_t; | ||
21 | typedef u16 compat_mode_t; | ||
22 | typedef u32 compat_ino_t; | ||
23 | typedef u16 compat_dev_t; | ||
24 | typedef s32 compat_off_t; | ||
25 | typedef s64 compat_loff_t; | ||
26 | typedef u16 compat_nlink_t; | ||
27 | typedef u16 compat_ipc_pid_t; | ||
28 | typedef s32 compat_daddr_t; | ||
29 | typedef u32 compat_caddr_t; | ||
30 | typedef __kernel_fsid_t compat_fsid_t; | ||
31 | typedef s32 compat_timer_t; | ||
32 | |||
33 | typedef s32 compat_int_t; | ||
34 | typedef s32 compat_long_t; | ||
35 | typedef s64 __attribute__((aligned(4))) compat_s64; | ||
36 | typedef u32 compat_uint_t; | ||
37 | typedef u32 compat_ulong_t; | ||
38 | typedef u64 __attribute__((aligned(4))) compat_u64; | ||
39 | |||
40 | struct compat_timespec { | ||
41 | compat_time_t tv_sec; | ||
42 | s32 tv_nsec; | ||
43 | }; | ||
44 | |||
45 | struct compat_timeval { | ||
46 | compat_time_t tv_sec; | ||
47 | s32 tv_usec; | ||
48 | }; | ||
49 | |||
50 | struct compat_stat { | ||
51 | compat_dev_t st_dev; | ||
52 | u16 __pad1; | ||
53 | compat_ino_t st_ino; | ||
54 | compat_mode_t st_mode; | ||
55 | compat_nlink_t st_nlink; | ||
56 | __compat_uid_t st_uid; | ||
57 | __compat_gid_t st_gid; | ||
58 | compat_dev_t st_rdev; | ||
59 | u16 __pad2; | ||
60 | u32 st_size; | ||
61 | u32 st_blksize; | ||
62 | u32 st_blocks; | ||
63 | u32 st_atime; | ||
64 | u32 st_atime_nsec; | ||
65 | u32 st_mtime; | ||
66 | u32 st_mtime_nsec; | ||
67 | u32 st_ctime; | ||
68 | u32 st_ctime_nsec; | ||
69 | u32 __unused4; | ||
70 | u32 __unused5; | ||
71 | }; | ||
72 | |||
73 | struct compat_flock { | ||
74 | short l_type; | ||
75 | short l_whence; | ||
76 | compat_off_t l_start; | ||
77 | compat_off_t l_len; | ||
78 | compat_pid_t l_pid; | ||
79 | }; | ||
80 | |||
81 | #define F_GETLK64 12 | ||
82 | #define F_SETLK64 13 | ||
83 | #define F_SETLKW64 14 | ||
84 | |||
85 | /* | ||
86 | * IA32 uses 4 byte alignment for 64 bit quantities, | ||
87 | * so we need to pack this structure. | ||
88 | */ | ||
89 | struct compat_flock64 { | ||
90 | short l_type; | ||
91 | short l_whence; | ||
92 | compat_loff_t l_start; | ||
93 | compat_loff_t l_len; | ||
94 | compat_pid_t l_pid; | ||
95 | } __attribute__((packed)); | ||
96 | |||
97 | struct compat_statfs { | ||
98 | int f_type; | ||
99 | int f_bsize; | ||
100 | int f_blocks; | ||
101 | int f_bfree; | ||
102 | int f_bavail; | ||
103 | int f_files; | ||
104 | int f_ffree; | ||
105 | compat_fsid_t f_fsid; | ||
106 | int f_namelen; /* SunOS ignores this field. */ | ||
107 | int f_frsize; | ||
108 | int f_spare[5]; | ||
109 | }; | ||
110 | |||
111 | #define COMPAT_RLIM_OLD_INFINITY 0x7fffffff | ||
112 | #define COMPAT_RLIM_INFINITY 0xffffffff | ||
113 | |||
114 | typedef u32 compat_old_sigset_t; /* at least 32 bits */ | ||
115 | |||
116 | #define _COMPAT_NSIG 64 | ||
117 | #define _COMPAT_NSIG_BPW 32 | ||
118 | |||
119 | typedef u32 compat_sigset_word; | ||
120 | |||
121 | #define COMPAT_OFF_T_MAX 0x7fffffff | ||
122 | #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL | ||
123 | |||
124 | struct compat_ipc64_perm { | ||
125 | compat_key_t key; | ||
126 | __compat_uid32_t uid; | ||
127 | __compat_gid32_t gid; | ||
128 | __compat_uid32_t cuid; | ||
129 | __compat_gid32_t cgid; | ||
130 | unsigned short mode; | ||
131 | unsigned short __pad1; | ||
132 | unsigned short seq; | ||
133 | unsigned short __pad2; | ||
134 | compat_ulong_t unused1; | ||
135 | compat_ulong_t unused2; | ||
136 | }; | ||
137 | |||
138 | struct compat_semid64_ds { | ||
139 | struct compat_ipc64_perm sem_perm; | ||
140 | compat_time_t sem_otime; | ||
141 | compat_ulong_t __unused1; | ||
142 | compat_time_t sem_ctime; | ||
143 | compat_ulong_t __unused2; | ||
144 | compat_ulong_t sem_nsems; | ||
145 | compat_ulong_t __unused3; | ||
146 | compat_ulong_t __unused4; | ||
147 | }; | ||
148 | |||
149 | struct compat_msqid64_ds { | ||
150 | struct compat_ipc64_perm msg_perm; | ||
151 | compat_time_t msg_stime; | ||
152 | compat_ulong_t __unused1; | ||
153 | compat_time_t msg_rtime; | ||
154 | compat_ulong_t __unused2; | ||
155 | compat_time_t msg_ctime; | ||
156 | compat_ulong_t __unused3; | ||
157 | compat_ulong_t msg_cbytes; | ||
158 | compat_ulong_t msg_qnum; | ||
159 | compat_ulong_t msg_qbytes; | ||
160 | compat_pid_t msg_lspid; | ||
161 | compat_pid_t msg_lrpid; | ||
162 | compat_ulong_t __unused4; | ||
163 | compat_ulong_t __unused5; | ||
164 | }; | ||
165 | |||
166 | struct compat_shmid64_ds { | ||
167 | struct compat_ipc64_perm shm_perm; | ||
168 | compat_size_t shm_segsz; | ||
169 | compat_time_t shm_atime; | ||
170 | compat_ulong_t __unused1; | ||
171 | compat_time_t shm_dtime; | ||
172 | compat_ulong_t __unused2; | ||
173 | compat_time_t shm_ctime; | ||
174 | compat_ulong_t __unused3; | ||
175 | compat_pid_t shm_cpid; | ||
176 | compat_pid_t shm_lpid; | ||
177 | compat_ulong_t shm_nattch; | ||
178 | compat_ulong_t __unused4; | ||
179 | compat_ulong_t __unused5; | ||
180 | }; | ||
181 | |||
182 | /* | ||
183 | * A pointer passed in from user mode. This should not be used for syscall parameters, | ||
184 | * just declare them as pointers because the syscall entry code will have appropriately | ||
185 | * converted them already. | ||
186 | */ | ||
187 | typedef u32 compat_uptr_t; | ||
188 | |||
189 | static inline void __user * | ||
190 | compat_ptr (compat_uptr_t uptr) | ||
191 | { | ||
192 | return (void __user *) (unsigned long) uptr; | ||
193 | } | ||
194 | |||
195 | static inline compat_uptr_t | ||
196 | ptr_to_compat(void __user *uptr) | ||
197 | { | ||
198 | return (u32)(unsigned long)uptr; | ||
199 | } | ||
200 | |||
201 | static __inline__ void __user * | ||
202 | compat_alloc_user_space (long len) | ||
203 | { | ||
204 | struct pt_regs *regs = task_pt_regs(current); | ||
205 | return (void __user *) (((regs->r12 & 0xffffffff) & -16) - len); | ||
206 | } | ||
207 | |||
208 | #endif /* _ASM_IA64_COMPAT_H */ | ||
diff --git a/arch/ia64/include/asm/hardirq.h b/arch/ia64/include/asm/hardirq.h index d514cd9edb49..8fb7d33a661f 100644 --- a/arch/ia64/include/asm/hardirq.h +++ b/arch/ia64/include/asm/hardirq.h | |||
@@ -6,12 +6,6 @@ | |||
6 | * David Mosberger-Tang <davidm@hpl.hp.com> | 6 | * David Mosberger-Tang <davidm@hpl.hp.com> |
7 | */ | 7 | */ |
8 | 8 | ||
9 | |||
10 | #include <linux/threads.h> | ||
11 | #include <linux/irq.h> | ||
12 | |||
13 | #include <asm/processor.h> | ||
14 | |||
15 | /* | 9 | /* |
16 | * No irq_cpustat_t for IA-64. The data is held in the per-CPU data structure. | 10 | * No irq_cpustat_t for IA-64. The data is held in the per-CPU data structure. |
17 | */ | 11 | */ |
@@ -20,6 +14,11 @@ | |||
20 | 14 | ||
21 | #define local_softirq_pending() (local_cpu_data->softirq_pending) | 15 | #define local_softirq_pending() (local_cpu_data->softirq_pending) |
22 | 16 | ||
17 | #include <linux/threads.h> | ||
18 | #include <linux/irq.h> | ||
19 | |||
20 | #include <asm/processor.h> | ||
21 | |||
23 | extern void __iomem *ipi_base_addr; | 22 | extern void __iomem *ipi_base_addr; |
24 | 23 | ||
25 | void ack_bad_irq(unsigned int irq); | 24 | void ack_bad_irq(unsigned int irq); |
diff --git a/arch/ia64/include/asm/iommu_table.h b/arch/ia64/include/asm/iommu_table.h new file mode 100644 index 000000000000..92c8d36ae5ae --- /dev/null +++ b/arch/ia64/include/asm/iommu_table.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _ASM_IA64_IOMMU_TABLE_H | ||
2 | #define _ASM_IA64_IOMMU_TABLE_H | ||
3 | |||
4 | #define IOMMU_INIT_POST(_detect) | ||
5 | |||
6 | #endif /* _ASM_IA64_IOMMU_TABLE_H */ | ||
diff --git a/arch/ia64/include/asm/irqflags.h b/arch/ia64/include/asm/irqflags.h new file mode 100644 index 000000000000..f82d6be2ecd2 --- /dev/null +++ b/arch/ia64/include/asm/irqflags.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * IRQ flags defines. | ||
3 | * | ||
4 | * Copyright (C) 1998-2003 Hewlett-Packard Co | ||
5 | * David Mosberger-Tang <davidm@hpl.hp.com> | ||
6 | * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com> | ||
7 | * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> | ||
8 | */ | ||
9 | |||
10 | #ifndef _ASM_IA64_IRQFLAGS_H | ||
11 | #define _ASM_IA64_IRQFLAGS_H | ||
12 | |||
13 | #ifdef CONFIG_IA64_DEBUG_IRQ | ||
14 | extern unsigned long last_cli_ip; | ||
15 | static inline void arch_maybe_save_ip(unsigned long flags) | ||
16 | { | ||
17 | if (flags & IA64_PSR_I) | ||
18 | last_cli_ip = ia64_getreg(_IA64_REG_IP); | ||
19 | } | ||
20 | #else | ||
21 | #define arch_maybe_save_ip(flags) do {} while (0) | ||
22 | #endif | ||
23 | |||
24 | /* | ||
25 | * - clearing psr.i is implicitly serialized (visible by next insn) | ||
26 | * - setting psr.i requires data serialization | ||
27 | * - we need a stop-bit before reading PSR because we sometimes | ||
28 | * write a floating-point register right before reading the PSR | ||
29 | * and that writes to PSR.mfl | ||
30 | */ | ||
31 | |||
32 | static inline unsigned long arch_local_save_flags(void) | ||
33 | { | ||
34 | ia64_stop(); | ||
35 | #ifdef CONFIG_PARAVIRT | ||
36 | return ia64_get_psr_i(); | ||
37 | #else | ||
38 | return ia64_getreg(_IA64_REG_PSR); | ||
39 | #endif | ||
40 | } | ||
41 | |||
42 | static inline unsigned long arch_local_irq_save(void) | ||
43 | { | ||
44 | unsigned long flags = arch_local_save_flags(); | ||
45 | |||
46 | ia64_stop(); | ||
47 | ia64_rsm(IA64_PSR_I); | ||
48 | arch_maybe_save_ip(flags); | ||
49 | return flags; | ||
50 | } | ||
51 | |||
52 | static inline void arch_local_irq_disable(void) | ||
53 | { | ||
54 | #ifdef CONFIG_IA64_DEBUG_IRQ | ||
55 | arch_local_irq_save(); | ||
56 | #else | ||
57 | ia64_stop(); | ||
58 | ia64_rsm(IA64_PSR_I); | ||
59 | #endif | ||
60 | } | ||
61 | |||
62 | static inline void arch_local_irq_enable(void) | ||
63 | { | ||
64 | ia64_stop(); | ||
65 | ia64_ssm(IA64_PSR_I); | ||
66 | ia64_srlz_d(); | ||
67 | } | ||
68 | |||
69 | static inline void arch_local_irq_restore(unsigned long flags) | ||
70 | { | ||
71 | #ifdef CONFIG_IA64_DEBUG_IRQ | ||
72 | unsigned long old_psr = arch_local_save_flags(); | ||
73 | #endif | ||
74 | ia64_intrin_local_irq_restore(flags & IA64_PSR_I); | ||
75 | arch_maybe_save_ip(old_psr & ~flags); | ||
76 | } | ||
77 | |||
78 | static inline bool arch_irqs_disabled_flags(unsigned long flags) | ||
79 | { | ||
80 | return (flags & IA64_PSR_I) == 0; | ||
81 | } | ||
82 | |||
83 | static inline bool arch_irqs_disabled(void) | ||
84 | { | ||
85 | return arch_irqs_disabled_flags(arch_local_save_flags()); | ||
86 | } | ||
87 | |||
88 | static inline void arch_safe_halt(void) | ||
89 | { | ||
90 | ia64_pal_halt_light(); /* PAL_HALT_LIGHT */ | ||
91 | } | ||
92 | |||
93 | |||
94 | #endif /* _ASM_IA64_IRQFLAGS_H */ | ||
diff --git a/arch/ia64/include/asm/system.h b/arch/ia64/include/asm/system.h index 9f342a574ce8..6cca30705d50 100644 --- a/arch/ia64/include/asm/system.h +++ b/arch/ia64/include/asm/system.h | |||
@@ -107,87 +107,11 @@ extern struct ia64_boot_param { | |||
107 | */ | 107 | */ |
108 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) | 108 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) |
109 | 109 | ||
110 | #define safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */ | ||
111 | |||
112 | /* | 110 | /* |
113 | * The group barrier in front of the rsm & ssm are necessary to ensure | 111 | * The group barrier in front of the rsm & ssm are necessary to ensure |
114 | * that none of the previous instructions in the same group are | 112 | * that none of the previous instructions in the same group are |
115 | * affected by the rsm/ssm. | 113 | * affected by the rsm/ssm. |
116 | */ | 114 | */ |
117 | /* For spinlocks etc */ | ||
118 | |||
119 | /* | ||
120 | * - clearing psr.i is implicitly serialized (visible by next insn) | ||
121 | * - setting psr.i requires data serialization | ||
122 | * - we need a stop-bit before reading PSR because we sometimes | ||
123 | * write a floating-point register right before reading the PSR | ||
124 | * and that writes to PSR.mfl | ||
125 | */ | ||
126 | #ifdef CONFIG_PARAVIRT | ||
127 | #define __local_save_flags() ia64_get_psr_i() | ||
128 | #else | ||
129 | #define __local_save_flags() ia64_getreg(_IA64_REG_PSR) | ||
130 | #endif | ||
131 | |||
132 | #define __local_irq_save(x) \ | ||
133 | do { \ | ||
134 | ia64_stop(); \ | ||
135 | (x) = __local_save_flags(); \ | ||
136 | ia64_stop(); \ | ||
137 | ia64_rsm(IA64_PSR_I); \ | ||
138 | } while (0) | ||
139 | |||
140 | #define __local_irq_disable() \ | ||
141 | do { \ | ||
142 | ia64_stop(); \ | ||
143 | ia64_rsm(IA64_PSR_I); \ | ||
144 | } while (0) | ||
145 | |||
146 | #define __local_irq_restore(x) ia64_intrin_local_irq_restore((x) & IA64_PSR_I) | ||
147 | |||
148 | #ifdef CONFIG_IA64_DEBUG_IRQ | ||
149 | |||
150 | extern unsigned long last_cli_ip; | ||
151 | |||
152 | # define __save_ip() last_cli_ip = ia64_getreg(_IA64_REG_IP) | ||
153 | |||
154 | # define local_irq_save(x) \ | ||
155 | do { \ | ||
156 | unsigned long __psr; \ | ||
157 | \ | ||
158 | __local_irq_save(__psr); \ | ||
159 | if (__psr & IA64_PSR_I) \ | ||
160 | __save_ip(); \ | ||
161 | (x) = __psr; \ | ||
162 | } while (0) | ||
163 | |||
164 | # define local_irq_disable() do { unsigned long __x; local_irq_save(__x); } while (0) | ||
165 | |||
166 | # define local_irq_restore(x) \ | ||
167 | do { \ | ||
168 | unsigned long __old_psr, __psr = (x); \ | ||
169 | \ | ||
170 | local_save_flags(__old_psr); \ | ||
171 | __local_irq_restore(__psr); \ | ||
172 | if ((__old_psr & IA64_PSR_I) && !(__psr & IA64_PSR_I)) \ | ||
173 | __save_ip(); \ | ||
174 | } while (0) | ||
175 | |||
176 | #else /* !CONFIG_IA64_DEBUG_IRQ */ | ||
177 | # define local_irq_save(x) __local_irq_save(x) | ||
178 | # define local_irq_disable() __local_irq_disable() | ||
179 | # define local_irq_restore(x) __local_irq_restore(x) | ||
180 | #endif /* !CONFIG_IA64_DEBUG_IRQ */ | ||
181 | |||
182 | #define local_irq_enable() ({ ia64_stop(); ia64_ssm(IA64_PSR_I); ia64_srlz_d(); }) | ||
183 | #define local_save_flags(flags) ({ ia64_stop(); (flags) = __local_save_flags(); }) | ||
184 | |||
185 | #define irqs_disabled() \ | ||
186 | ({ \ | ||
187 | unsigned long __ia64_id_flags; \ | ||
188 | local_save_flags(__ia64_id_flags); \ | ||
189 | (__ia64_id_flags & IA64_PSR_I) == 0; \ | ||
190 | }) | ||
191 | 115 | ||
192 | #ifdef __KERNEL__ | 116 | #ifdef __KERNEL__ |
193 | 117 | ||
@@ -272,10 +196,6 @@ void cpu_idle_wait(void); | |||
272 | 196 | ||
273 | void default_idle(void); | 197 | void default_idle(void); |
274 | 198 | ||
275 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
276 | extern void account_system_vtime(struct task_struct *); | ||
277 | #endif | ||
278 | |||
279 | #endif /* __KERNEL__ */ | 199 | #endif /* __KERNEL__ */ |
280 | 200 | ||
281 | #endif /* __ASSEMBLY__ */ | 201 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index db10b1e378b0..395c2f216dd8 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile | |||
@@ -34,6 +34,7 @@ obj-$(CONFIG_AUDIT) += audit.o | |||
34 | obj-$(CONFIG_PCI_MSI) += msi_ia64.o | 34 | obj-$(CONFIG_PCI_MSI) += msi_ia64.o |
35 | mca_recovery-y += mca_drv.o mca_drv_asm.o | 35 | mca_recovery-y += mca_drv.o mca_drv_asm.o |
36 | obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o | 36 | obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o |
37 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | ||
37 | 38 | ||
38 | obj-$(CONFIG_PARAVIRT) += paravirt.o paravirtentry.o \ | 39 | obj-$(CONFIG_PARAVIRT) += paravirt.o paravirtentry.o \ |
39 | paravirt_patch.o | 40 | paravirt_patch.o |
diff --git a/arch/ia64/kernel/cyclone.c b/arch/ia64/kernel/cyclone.c index 71e35864d2e2..d52f1f78eff2 100644 --- a/arch/ia64/kernel/cyclone.c +++ b/arch/ia64/kernel/cyclone.c | |||
@@ -59,13 +59,13 @@ int __init init_cyclone_clock(void) | |||
59 | return -ENODEV; | 59 | return -ENODEV; |
60 | } | 60 | } |
61 | base = readq(reg); | 61 | base = readq(reg); |
62 | iounmap(reg); | ||
62 | if(!base){ | 63 | if(!base){ |
63 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR" | 64 | printk(KERN_ERR "Summit chipset: Could not find valid CBAR" |
64 | " value.\n"); | 65 | " value.\n"); |
65 | use_cyclone = 0; | 66 | use_cyclone = 0; |
66 | return -ENODEV; | 67 | return -ENODEV; |
67 | } | 68 | } |
68 | iounmap(reg); | ||
69 | 69 | ||
70 | /* setup PMCC */ | 70 | /* setup PMCC */ |
71 | offset = (base + CYCLONE_PMCC_OFFSET); | 71 | offset = (base + CYCLONE_PMCC_OFFSET); |
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index 3567d54f8cee..331d42bda77a 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S | |||
@@ -420,22 +420,31 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set | |||
420 | ;; | 420 | ;; |
421 | 421 | ||
422 | RSM_PSR_I(p0, r18, r19) // mask interrupt delivery | 422 | RSM_PSR_I(p0, r18, r19) // mask interrupt delivery |
423 | mov ar.ccv=0 | ||
424 | andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP | 423 | andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP |
424 | mov r8=EINVAL // default to EINVAL | ||
425 | 425 | ||
426 | #ifdef CONFIG_SMP | 426 | #ifdef CONFIG_SMP |
427 | mov r17=1 | 427 | // __ticket_spin_trylock(r31) |
428 | ld4 r17=[r31] | ||
428 | ;; | 429 | ;; |
429 | cmpxchg4.acq r18=[r31],r17,ar.ccv // try to acquire the lock | 430 | mov.m ar.ccv=r17 |
430 | mov r8=EINVAL // default to EINVAL | 431 | extr.u r9=r17,17,15 |
432 | adds r19=1,r17 | ||
433 | extr.u r18=r17,0,15 | ||
434 | ;; | ||
435 | cmp.eq p6,p7=r9,r18 | ||
431 | ;; | 436 | ;; |
437 | (p6) cmpxchg4.acq r9=[r31],r19,ar.ccv | ||
438 | (p6) dep.z r20=r19,1,15 // next serving ticket for unlock | ||
439 | (p7) br.cond.spnt.many .lock_contention | ||
440 | ;; | ||
441 | cmp4.eq p0,p7=r9,r17 | ||
442 | adds r31=2,r31 | ||
443 | (p7) br.cond.spnt.many .lock_contention | ||
432 | ld8 r3=[r2] // re-read current->blocked now that we hold the lock | 444 | ld8 r3=[r2] // re-read current->blocked now that we hold the lock |
433 | cmp4.ne p6,p0=r18,r0 | ||
434 | (p6) br.cond.spnt.many .lock_contention | ||
435 | ;; | 445 | ;; |
436 | #else | 446 | #else |
437 | ld8 r3=[r2] // re-read current->blocked now that we hold the lock | 447 | ld8 r3=[r2] // re-read current->blocked now that we hold the lock |
438 | mov r8=EINVAL // default to EINVAL | ||
439 | #endif | 448 | #endif |
440 | add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16 | 449 | add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16 |
441 | add r19=IA64_TASK_SIGNAL_OFFSET,r16 | 450 | add r19=IA64_TASK_SIGNAL_OFFSET,r16 |
@@ -490,7 +499,9 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set | |||
490 | (p6) br.cond.spnt.few 1b // yes -> retry | 499 | (p6) br.cond.spnt.few 1b // yes -> retry |
491 | 500 | ||
492 | #ifdef CONFIG_SMP | 501 | #ifdef CONFIG_SMP |
493 | st4.rel [r31]=r0 // release the lock | 502 | // __ticket_spin_unlock(r31) |
503 | st2.rel [r31]=r20 | ||
504 | mov r20=0 // i must not leak kernel bits... | ||
494 | #endif | 505 | #endif |
495 | SSM_PSR_I(p0, p9, r31) | 506 | SSM_PSR_I(p0, p9, r31) |
496 | ;; | 507 | ;; |
@@ -512,7 +523,8 @@ EX(.fail_efault, (p15) st8 [r34]=r3) | |||
512 | 523 | ||
513 | .sig_pending: | 524 | .sig_pending: |
514 | #ifdef CONFIG_SMP | 525 | #ifdef CONFIG_SMP |
515 | st4.rel [r31]=r0 // release the lock | 526 | // __ticket_spin_unlock(r31) |
527 | st2.rel [r31]=r20 // release the lock | ||
516 | #endif | 528 | #endif |
517 | SSM_PSR_I(p0, p9, r17) | 529 | SSM_PSR_I(p0, p9, r17) |
518 | ;; | 530 | ;; |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 7ded76658d2d..22c38404f539 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -108,10 +108,6 @@ | |||
108 | #define DBG(fmt...) | 108 | #define DBG(fmt...) |
109 | #endif | 109 | #endif |
110 | 110 | ||
111 | #define NR_PREALLOCATE_RTE_ENTRIES \ | ||
112 | (PAGE_SIZE / sizeof(struct iosapic_rte_info)) | ||
113 | #define RTE_PREALLOCATED (1) | ||
114 | |||
115 | static DEFINE_SPINLOCK(iosapic_lock); | 111 | static DEFINE_SPINLOCK(iosapic_lock); |
116 | 112 | ||
117 | /* | 113 | /* |
@@ -136,7 +132,6 @@ struct iosapic_rte_info { | |||
136 | struct list_head rte_list; /* RTEs sharing the same vector */ | 132 | struct list_head rte_list; /* RTEs sharing the same vector */ |
137 | char rte_index; /* IOSAPIC RTE index */ | 133 | char rte_index; /* IOSAPIC RTE index */ |
138 | int refcnt; /* reference counter */ | 134 | int refcnt; /* reference counter */ |
139 | unsigned int flags; /* flags */ | ||
140 | struct iosapic *iosapic; | 135 | struct iosapic *iosapic; |
141 | } ____cacheline_aligned; | 136 | } ____cacheline_aligned; |
142 | 137 | ||
@@ -155,9 +150,6 @@ static struct iosapic_intr_info { | |||
155 | 150 | ||
156 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ | 151 | static unsigned char pcat_compat __devinitdata; /* 8259 compatibility flag */ |
157 | 152 | ||
158 | static int iosapic_kmalloc_ok; | ||
159 | static LIST_HEAD(free_rte_list); | ||
160 | |||
161 | static inline void | 153 | static inline void |
162 | iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) | 154 | iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) |
163 | { | 155 | { |
@@ -394,7 +386,7 @@ iosapic_startup_level_irq (unsigned int irq) | |||
394 | } | 386 | } |
395 | 387 | ||
396 | static void | 388 | static void |
397 | iosapic_end_level_irq (unsigned int irq) | 389 | iosapic_unmask_level_irq (unsigned int irq) |
398 | { | 390 | { |
399 | ia64_vector vec = irq_to_vector(irq); | 391 | ia64_vector vec = irq_to_vector(irq); |
400 | struct iosapic_rte_info *rte; | 392 | struct iosapic_rte_info *rte; |
@@ -404,7 +396,8 @@ iosapic_end_level_irq (unsigned int irq) | |||
404 | if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { | 396 | if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { |
405 | do_unmask_irq = 1; | 397 | do_unmask_irq = 1; |
406 | mask_irq(irq); | 398 | mask_irq(irq); |
407 | } | 399 | } else |
400 | unmask_irq(irq); | ||
408 | 401 | ||
409 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) | 402 | list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list) |
410 | iosapic_eoi(rte->iosapic->addr, vec); | 403 | iosapic_eoi(rte->iosapic->addr, vec); |
@@ -427,9 +420,8 @@ static struct irq_chip irq_type_iosapic_level = { | |||
427 | .enable = iosapic_enable_level_irq, | 420 | .enable = iosapic_enable_level_irq, |
428 | .disable = iosapic_disable_level_irq, | 421 | .disable = iosapic_disable_level_irq, |
429 | .ack = iosapic_ack_level_irq, | 422 | .ack = iosapic_ack_level_irq, |
430 | .end = iosapic_end_level_irq, | ||
431 | .mask = mask_irq, | 423 | .mask = mask_irq, |
432 | .unmask = unmask_irq, | 424 | .unmask = iosapic_unmask_level_irq, |
433 | .set_affinity = iosapic_set_affinity | 425 | .set_affinity = iosapic_set_affinity |
434 | }; | 426 | }; |
435 | 427 | ||
@@ -552,37 +544,6 @@ iosapic_reassign_vector (int irq) | |||
552 | } | 544 | } |
553 | } | 545 | } |
554 | 546 | ||
555 | static struct iosapic_rte_info * __init_refok iosapic_alloc_rte (void) | ||
556 | { | ||
557 | int i; | ||
558 | struct iosapic_rte_info *rte; | ||
559 | int preallocated = 0; | ||
560 | |||
561 | if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) { | ||
562 | rte = alloc_bootmem(sizeof(struct iosapic_rte_info) * | ||
563 | NR_PREALLOCATE_RTE_ENTRIES); | ||
564 | for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++) | ||
565 | list_add(&rte->rte_list, &free_rte_list); | ||
566 | } | ||
567 | |||
568 | if (!list_empty(&free_rte_list)) { | ||
569 | rte = list_entry(free_rte_list.next, struct iosapic_rte_info, | ||
570 | rte_list); | ||
571 | list_del(&rte->rte_list); | ||
572 | preallocated++; | ||
573 | } else { | ||
574 | rte = kmalloc(sizeof(struct iosapic_rte_info), GFP_ATOMIC); | ||
575 | if (!rte) | ||
576 | return NULL; | ||
577 | } | ||
578 | |||
579 | memset(rte, 0, sizeof(struct iosapic_rte_info)); | ||
580 | if (preallocated) | ||
581 | rte->flags |= RTE_PREALLOCATED; | ||
582 | |||
583 | return rte; | ||
584 | } | ||
585 | |||
586 | static inline int irq_is_shared (int irq) | 547 | static inline int irq_is_shared (int irq) |
587 | { | 548 | { |
588 | return (iosapic_intr_info[irq].count > 1); | 549 | return (iosapic_intr_info[irq].count > 1); |
@@ -615,7 +576,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
615 | 576 | ||
616 | rte = find_rte(irq, gsi); | 577 | rte = find_rte(irq, gsi); |
617 | if (!rte) { | 578 | if (!rte) { |
618 | rte = iosapic_alloc_rte(); | 579 | rte = kzalloc(sizeof (*rte), GFP_ATOMIC); |
619 | if (!rte) { | 580 | if (!rte) { |
620 | printk(KERN_WARNING "%s: cannot allocate memory\n", | 581 | printk(KERN_WARNING "%s: cannot allocate memory\n", |
621 | __func__); | 582 | __func__); |
@@ -658,6 +619,10 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
658 | idesc->chip->name, irq_type->name); | 619 | idesc->chip->name, irq_type->name); |
659 | idesc->chip = irq_type; | 620 | idesc->chip = irq_type; |
660 | } | 621 | } |
622 | if (trigger == IOSAPIC_EDGE) | ||
623 | __set_irq_handler_unlocked(irq, handle_edge_irq); | ||
624 | else | ||
625 | __set_irq_handler_unlocked(irq, handle_level_irq); | ||
661 | return 0; | 626 | return 0; |
662 | } | 627 | } |
663 | 628 | ||
@@ -1161,10 +1126,3 @@ map_iosapic_to_node(unsigned int gsi_base, int node) | |||
1161 | return; | 1126 | return; |
1162 | } | 1127 | } |
1163 | #endif | 1128 | #endif |
1164 | |||
1165 | static int __init iosapic_enable_kmalloc (void) | ||
1166 | { | ||
1167 | iosapic_kmalloc_ok = 1; | ||
1168 | return 0; | ||
1169 | } | ||
1170 | core_initcall (iosapic_enable_kmalloc); | ||
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index f14c35f9b03a..9a26015c3e50 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <linux/ratelimit.h> | 32 | #include <linux/ratelimit.h> |
33 | #include <linux/acpi.h> | ||
33 | 34 | ||
34 | #include <asm/delay.h> | 35 | #include <asm/delay.h> |
35 | #include <asm/intrinsics.h> | 36 | #include <asm/intrinsics.h> |
@@ -635,6 +636,7 @@ ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action) | |||
635 | desc->chip = &irq_type_ia64_lsapic; | 636 | desc->chip = &irq_type_ia64_lsapic; |
636 | if (action) | 637 | if (action) |
637 | setup_irq(irq, action); | 638 | setup_irq(irq, action); |
639 | set_irq_handler(irq, handle_percpu_irq); | ||
638 | } | 640 | } |
639 | 641 | ||
640 | void __init | 642 | void __init |
@@ -650,6 +652,9 @@ ia64_native_register_ipi(void) | |||
650 | void __init | 652 | void __init |
651 | init_IRQ (void) | 653 | init_IRQ (void) |
652 | { | 654 | { |
655 | #ifdef CONFIG_ACPI | ||
656 | acpi_boot_init(); | ||
657 | #endif | ||
653 | ia64_register_ipi(); | 658 | ia64_register_ipi(); |
654 | register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL); | 659 | register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL); |
655 | #ifdef CONFIG_SMP | 660 | #ifdef CONFIG_SMP |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index a0220dc5ff42..1753f6a30d55 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -2055,25 +2055,6 @@ ia64_mca_init(void) | |||
2055 | 2055 | ||
2056 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__); | 2056 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__); |
2057 | 2057 | ||
2058 | /* | ||
2059 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
2060 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
2061 | */ | ||
2062 | register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); | ||
2063 | register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); | ||
2064 | ia64_mca_cmc_vector_setup(); /* Setup vector on BSP */ | ||
2065 | |||
2066 | /* Setup the MCA rendezvous interrupt vector */ | ||
2067 | register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); | ||
2068 | |||
2069 | /* Setup the MCA wakeup interrupt vector */ | ||
2070 | register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); | ||
2071 | |||
2072 | #ifdef CONFIG_ACPI | ||
2073 | /* Setup the CPEI/P handler */ | ||
2074 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
2075 | #endif | ||
2076 | |||
2077 | /* Initialize the areas set aside by the OS to buffer the | 2058 | /* Initialize the areas set aside by the OS to buffer the |
2078 | * platform/processor error states for MCA/INIT/CMC | 2059 | * platform/processor error states for MCA/INIT/CMC |
2079 | * handling. | 2060 | * handling. |
@@ -2103,6 +2084,25 @@ ia64_mca_late_init(void) | |||
2103 | if (!mca_init) | 2084 | if (!mca_init) |
2104 | return 0; | 2085 | return 0; |
2105 | 2086 | ||
2087 | /* | ||
2088 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
2089 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
2090 | */ | ||
2091 | register_percpu_irq(IA64_CMC_VECTOR, &cmci_irqaction); | ||
2092 | register_percpu_irq(IA64_CMCP_VECTOR, &cmcp_irqaction); | ||
2093 | ia64_mca_cmc_vector_setup(); /* Setup vector on BSP */ | ||
2094 | |||
2095 | /* Setup the MCA rendezvous interrupt vector */ | ||
2096 | register_percpu_irq(IA64_MCA_RENDEZ_VECTOR, &mca_rdzv_irqaction); | ||
2097 | |||
2098 | /* Setup the MCA wakeup interrupt vector */ | ||
2099 | register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); | ||
2100 | |||
2101 | #ifdef CONFIG_ACPI | ||
2102 | /* Setup the CPEI/P handler */ | ||
2103 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
2104 | #endif | ||
2105 | |||
2106 | register_hotcpu_notifier(&mca_cpu_notifier); | 2106 | register_hotcpu_notifier(&mca_cpu_notifier); |
2107 | 2107 | ||
2108 | /* Setup the CMCI/P vector and handler */ | 2108 | /* Setup the CMCI/P vector and handler */ |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 4a746ea838ff..00b19a416eab 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -104,8 +104,8 @@ static int ia64_msi_retrigger_irq(unsigned int irq) | |||
104 | */ | 104 | */ |
105 | static struct irq_chip ia64_msi_chip = { | 105 | static struct irq_chip ia64_msi_chip = { |
106 | .name = "PCI-MSI", | 106 | .name = "PCI-MSI", |
107 | .mask = mask_msi_irq, | 107 | .irq_mask = mask_msi_irq, |
108 | .unmask = unmask_msi_irq, | 108 | .irq_unmask = unmask_msi_irq, |
109 | .ack = ia64_ack_msi_irq, | 109 | .ack = ia64_ack_msi_irq, |
110 | #ifdef CONFIG_SMP | 110 | #ifdef CONFIG_SMP |
111 | .set_affinity = ia64_set_msi_irq_affinity, | 111 | .set_affinity = ia64_set_msi_irq_affinity, |
@@ -160,8 +160,8 @@ static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
160 | 160 | ||
161 | static struct irq_chip dmar_msi_type = { | 161 | static struct irq_chip dmar_msi_type = { |
162 | .name = "DMAR_MSI", | 162 | .name = "DMAR_MSI", |
163 | .unmask = dmar_msi_unmask, | 163 | .irq_unmask = dmar_msi_unmask, |
164 | .mask = dmar_msi_mask, | 164 | .irq_mask = dmar_msi_mask, |
165 | .ack = ia64_ack_msi_irq, | 165 | .ack = ia64_ack_msi_irq, |
166 | #ifdef CONFIG_SMP | 166 | #ifdef CONFIG_SMP |
167 | .set_affinity = dmar_msi_set_affinity, | 167 | .set_affinity = dmar_msi_set_affinity, |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index fdf6f9d013e5..77597e5ea60a 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
@@ -434,7 +434,7 @@ register_info(char *page) | |||
434 | unsigned long phys_stacked; | 434 | unsigned long phys_stacked; |
435 | pal_hints_u_t hints; | 435 | pal_hints_u_t hints; |
436 | unsigned long iregs, dregs; | 436 | unsigned long iregs, dregs; |
437 | char *info_type[]={ | 437 | static const char * const info_type[] = { |
438 | "Implemented AR(s)", | 438 | "Implemented AR(s)", |
439 | "AR(s) with read side-effects", | 439 | "AR(s) with read side-effects", |
440 | "Implemented CR(s)", | 440 | "Implemented CR(s)", |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index cce050e85c73..6b1852f7f972 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -1573,7 +1573,7 @@ pfm_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos) | |||
1573 | return -EINVAL; | 1573 | return -EINVAL; |
1574 | } | 1574 | } |
1575 | 1575 | ||
1576 | ctx = (pfm_context_t *)filp->private_data; | 1576 | ctx = filp->private_data; |
1577 | if (ctx == NULL) { | 1577 | if (ctx == NULL) { |
1578 | printk(KERN_ERR "perfmon: pfm_read: NULL ctx [%d]\n", task_pid_nr(current)); | 1578 | printk(KERN_ERR "perfmon: pfm_read: NULL ctx [%d]\n", task_pid_nr(current)); |
1579 | return -EINVAL; | 1579 | return -EINVAL; |
@@ -1673,7 +1673,7 @@ pfm_poll(struct file *filp, poll_table * wait) | |||
1673 | return 0; | 1673 | return 0; |
1674 | } | 1674 | } |
1675 | 1675 | ||
1676 | ctx = (pfm_context_t *)filp->private_data; | 1676 | ctx = filp->private_data; |
1677 | if (ctx == NULL) { | 1677 | if (ctx == NULL) { |
1678 | printk(KERN_ERR "perfmon: pfm_poll: NULL ctx [%d]\n", task_pid_nr(current)); | 1678 | printk(KERN_ERR "perfmon: pfm_poll: NULL ctx [%d]\n", task_pid_nr(current)); |
1679 | return 0; | 1679 | return 0; |
@@ -1733,7 +1733,7 @@ pfm_fasync(int fd, struct file *filp, int on) | |||
1733 | return -EBADF; | 1733 | return -EBADF; |
1734 | } | 1734 | } |
1735 | 1735 | ||
1736 | ctx = (pfm_context_t *)filp->private_data; | 1736 | ctx = filp->private_data; |
1737 | if (ctx == NULL) { | 1737 | if (ctx == NULL) { |
1738 | printk(KERN_ERR "perfmon: pfm_fasync NULL ctx [%d]\n", task_pid_nr(current)); | 1738 | printk(KERN_ERR "perfmon: pfm_fasync NULL ctx [%d]\n", task_pid_nr(current)); |
1739 | return -EBADF; | 1739 | return -EBADF; |
@@ -1841,7 +1841,7 @@ pfm_flush(struct file *filp, fl_owner_t id) | |||
1841 | return -EBADF; | 1841 | return -EBADF; |
1842 | } | 1842 | } |
1843 | 1843 | ||
1844 | ctx = (pfm_context_t *)filp->private_data; | 1844 | ctx = filp->private_data; |
1845 | if (ctx == NULL) { | 1845 | if (ctx == NULL) { |
1846 | printk(KERN_ERR "perfmon: pfm_flush: NULL ctx [%d]\n", task_pid_nr(current)); | 1846 | printk(KERN_ERR "perfmon: pfm_flush: NULL ctx [%d]\n", task_pid_nr(current)); |
1847 | return -EBADF; | 1847 | return -EBADF; |
@@ -1984,7 +1984,7 @@ pfm_close(struct inode *inode, struct file *filp) | |||
1984 | return -EBADF; | 1984 | return -EBADF; |
1985 | } | 1985 | } |
1986 | 1986 | ||
1987 | ctx = (pfm_context_t *)filp->private_data; | 1987 | ctx = filp->private_data; |
1988 | if (ctx == NULL) { | 1988 | if (ctx == NULL) { |
1989 | printk(KERN_ERR "perfmon: pfm_close: NULL ctx [%d]\n", task_pid_nr(current)); | 1989 | printk(KERN_ERR "perfmon: pfm_close: NULL ctx [%d]\n", task_pid_nr(current)); |
1990 | return -EBADF; | 1990 | return -EBADF; |
@@ -4907,7 +4907,7 @@ restart_args: | |||
4907 | goto error_args; | 4907 | goto error_args; |
4908 | } | 4908 | } |
4909 | 4909 | ||
4910 | ctx = (pfm_context_t *)file->private_data; | 4910 | ctx = file->private_data; |
4911 | if (unlikely(ctx == NULL)) { | 4911 | if (unlikely(ctx == NULL)) { |
4912 | DPRINT(("no context for fd %d\n", fd)); | 4912 | DPRINT(("no context for fd %d\n", fd)); |
4913 | goto error_args; | 4913 | goto error_args; |
diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 6f22c4041630..79802e540e53 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c | |||
@@ -644,7 +644,7 @@ salinfo_init(void) | |||
644 | for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) { | 644 | for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) { |
645 | data = salinfo_data + i; | 645 | data = salinfo_data + i; |
646 | data->type = i; | 646 | data->type = i; |
647 | init_MUTEX(&data->mutex); | 647 | sema_init(&data->mutex, 1); |
648 | dir = proc_mkdir(salinfo_log_name[i], salinfo_dir); | 648 | dir = proc_mkdir(salinfo_log_name[i], salinfo_dir); |
649 | if (!dir) | 649 | if (!dir) |
650 | continue; | 650 | continue; |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 8fb958abf8d0..911cf9749700 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -594,10 +594,6 @@ setup_arch (char **cmdline_p) | |||
594 | cpu_init(); /* initialize the bootstrap CPU */ | 594 | cpu_init(); /* initialize the bootstrap CPU */ |
595 | mmu_context_init(); /* initialize context_id bitmap */ | 595 | mmu_context_init(); /* initialize context_id bitmap */ |
596 | 596 | ||
597 | #ifdef CONFIG_ACPI | ||
598 | acpi_boot_init(); | ||
599 | #endif | ||
600 | |||
601 | paravirt_banner(); | 597 | paravirt_banner(); |
602 | paravirt_arch_setup_console(cmdline_p); | 598 | paravirt_arch_setup_console(cmdline_p); |
603 | 599 | ||
diff --git a/arch/ia64/kernel/stacktrace.c b/arch/ia64/kernel/stacktrace.c new file mode 100644 index 000000000000..5af2783a87f4 --- /dev/null +++ b/arch/ia64/kernel/stacktrace.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * arch/ia64/kernel/stacktrace.c | ||
3 | * | ||
4 | * Stack trace management functions | ||
5 | * | ||
6 | */ | ||
7 | #include <linux/sched.h> | ||
8 | #include <linux/stacktrace.h> | ||
9 | #include <linux/module.h> | ||
10 | |||
11 | static void | ||
12 | ia64_do_save_stack(struct unw_frame_info *info, void *arg) | ||
13 | { | ||
14 | struct stack_trace *trace = arg; | ||
15 | unsigned long ip; | ||
16 | int skip = trace->skip; | ||
17 | |||
18 | trace->nr_entries = 0; | ||
19 | do { | ||
20 | unw_get_ip(info, &ip); | ||
21 | if (ip == 0) | ||
22 | break; | ||
23 | if (skip == 0) { | ||
24 | trace->entries[trace->nr_entries++] = ip; | ||
25 | if (trace->nr_entries == trace->max_entries) | ||
26 | break; | ||
27 | } else | ||
28 | skip--; | ||
29 | } while (unw_unwind(info) >= 0); | ||
30 | } | ||
31 | |||
32 | /* | ||
33 | * Save stack-backtrace addresses into a stack_trace buffer. | ||
34 | */ | ||
35 | void save_stack_trace(struct stack_trace *trace) | ||
36 | { | ||
37 | unw_init_running(ia64_do_save_stack, trace); | ||
38 | } | ||
39 | EXPORT_SYMBOL(save_stack_trace); | ||
diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c index b6c0e63a0bf6..fed6afa2e8a9 100644 --- a/arch/ia64/kernel/unwind.c +++ b/arch/ia64/kernel/unwind.c | |||
@@ -1204,10 +1204,10 @@ desc_spill_sprel_p (unsigned char qp, unw_word t, unsigned char abreg, unw_word | |||
1204 | static inline unw_hash_index_t | 1204 | static inline unw_hash_index_t |
1205 | hash (unsigned long ip) | 1205 | hash (unsigned long ip) |
1206 | { | 1206 | { |
1207 | # define hashmagic 0x9e3779b97f4a7c16UL /* based on (sqrt(5)/2-1)*2^64 */ | 1207 | /* magic number = ((sqrt(5)-1)/2)*2^64 */ |
1208 | static const unsigned long hashmagic = 0x9e3779b97f4a7c16UL; | ||
1208 | 1209 | ||
1209 | return (ip >> 4)*hashmagic >> (64 - UNW_LOG_HASH_SIZE); | 1210 | return (ip >> 4) * hashmagic >> (64 - UNW_LOG_HASH_SIZE); |
1210 | #undef hashmagic | ||
1211 | } | 1211 | } |
1212 | 1212 | ||
1213 | static inline long | 1213 | static inline long |
@@ -1531,7 +1531,7 @@ build_script (struct unw_frame_info *info) | |||
1531 | struct unw_labeled_state *ls, *next; | 1531 | struct unw_labeled_state *ls, *next; |
1532 | unsigned long ip = info->ip; | 1532 | unsigned long ip = info->ip; |
1533 | struct unw_state_record sr; | 1533 | struct unw_state_record sr; |
1534 | struct unw_table *table; | 1534 | struct unw_table *table, *prev; |
1535 | struct unw_reg_info *r; | 1535 | struct unw_reg_info *r; |
1536 | struct unw_insn insn; | 1536 | struct unw_insn insn; |
1537 | u8 *dp, *desc_end; | 1537 | u8 *dp, *desc_end; |
@@ -1560,11 +1560,26 @@ build_script (struct unw_frame_info *info) | |||
1560 | 1560 | ||
1561 | STAT(parse_start = ia64_get_itc()); | 1561 | STAT(parse_start = ia64_get_itc()); |
1562 | 1562 | ||
1563 | prev = NULL; | ||
1563 | for (table = unw.tables; table; table = table->next) { | 1564 | for (table = unw.tables; table; table = table->next) { |
1564 | if (ip >= table->start && ip < table->end) { | 1565 | if (ip >= table->start && ip < table->end) { |
1566 | /* | ||
1567 | * Leave the kernel unwind table at the very front, | ||
1568 | * lest moving it breaks some assumption elsewhere. | ||
1569 | * Otherwise, move the matching table to the second | ||
1570 | * position in the list so that traversals can benefit | ||
1571 | * from commonality in backtrace paths. | ||
1572 | */ | ||
1573 | if (prev && prev != unw.tables) { | ||
1574 | /* unw is safe - we're already spinlocked */ | ||
1575 | prev->next = table->next; | ||
1576 | table->next = unw.tables->next; | ||
1577 | unw.tables->next = table; | ||
1578 | } | ||
1565 | e = lookup(table, ip - table->segment_base); | 1579 | e = lookup(table, ip - table->segment_base); |
1566 | break; | 1580 | break; |
1567 | } | 1581 | } |
1582 | prev = table; | ||
1568 | } | 1583 | } |
1569 | if (!e) { | 1584 | if (!e) { |
1570 | /* no info, return default unwinder (leaf proc, no mem stack, no saved regs) */ | 1585 | /* no info, return default unwinder (leaf proc, no mem stack, no saved regs) */ |
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c index 0c72dd463831..a5e500f02853 100644 --- a/arch/ia64/sn/kernel/msi_sn.c +++ b/arch/ia64/sn/kernel/msi_sn.c | |||
@@ -228,8 +228,8 @@ static int sn_msi_retrigger_irq(unsigned int irq) | |||
228 | 228 | ||
229 | static struct irq_chip sn_msi_chip = { | 229 | static struct irq_chip sn_msi_chip = { |
230 | .name = "PCI-MSI", | 230 | .name = "PCI-MSI", |
231 | .mask = mask_msi_irq, | 231 | .irq_mask = mask_msi_irq, |
232 | .unmask = unmask_msi_irq, | 232 | .irq_unmask = unmask_msi_irq, |
233 | .ack = sn_ack_msi_irq, | 233 | .ack = sn_ack_msi_irq, |
234 | #ifdef CONFIG_SMP | 234 | #ifdef CONFIG_SMP |
235 | .set_affinity = sn_set_msi_irq_affinity, | 235 | .set_affinity = sn_set_msi_irq_affinity, |
diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c index 8adc6a14272a..3e8d350fdf39 100644 --- a/arch/ia64/xen/xen_pv_ops.c +++ b/arch/ia64/xen/xen_pv_ops.c | |||
@@ -1136,7 +1136,6 @@ __initconst = { | |||
1136 | static void __init | 1136 | static void __init |
1137 | xen_patch_branch(unsigned long tag, unsigned long type) | 1137 | xen_patch_branch(unsigned long tag, unsigned long type) |
1138 | { | 1138 | { |
1139 | const unsigned long nelem = | 1139 | __paravirt_patch_apply_branch(tag, type, xen_branch_target, |
1140 | sizeof(xen_branch_target) / sizeof(xen_branch_target[0]); | 1140 | ARRAY_SIZE(xen_branch_target)); |
1141 | __paravirt_patch_apply_branch(tag, type, xen_branch_target, nelem); | ||
1142 | } | 1141 | } |