diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-28 18:07:55 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-28 18:07:55 -0400 |
commit | cb28a1bbdb4790378e7366d6c9ee1d2340b84f92 (patch) | |
tree | 316436f77dac75335fd2c3ef5f109e71606c50d3 /include/asm-generic | |
parent | b6d4f7e3ef25beb8c658c97867d98883e69dc544 (diff) | |
parent | f934fb19ef34730263e6afc01e8ec27a8a71470f (diff) |
Merge branch 'linus' into core/generic-dma-coherent
Conflicts:
arch/x86/Kconfig
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-generic')
-rw-r--r-- | include/asm-generic/Kbuild.asm | 2 | ||||
-rw-r--r-- | include/asm-generic/bug.h | 25 | ||||
-rw-r--r-- | include/asm-generic/dma-mapping-broken.h | 2 | ||||
-rw-r--r-- | include/asm-generic/dma-mapping.h | 4 | ||||
-rw-r--r-- | include/asm-generic/gpio.h | 37 | ||||
-rw-r--r-- | include/asm-generic/int-ll64.h | 2 | ||||
-rw-r--r-- | include/asm-generic/pci-dma-compat.h | 4 | ||||
-rw-r--r-- | include/asm-generic/syscall.h | 141 | ||||
-rw-r--r-- | include/asm-generic/vmlinux.lds.h | 6 |
9 files changed, 212 insertions, 11 deletions
diff --git a/include/asm-generic/Kbuild.asm b/include/asm-generic/Kbuild.asm index 7cd25b8e7c9a..1170dc60e638 100644 --- a/include/asm-generic/Kbuild.asm +++ b/include/asm-generic/Kbuild.asm | |||
@@ -1,4 +1,6 @@ | |||
1 | ifneq ($(wildcard $(srctree)/include/asm-$(SRCARCH)/kvm.h),) | ||
1 | header-y += kvm.h | 2 | header-y += kvm.h |
3 | endif | ||
2 | 4 | ||
3 | ifneq ($(wildcard $(srctree)/include/asm-$(SRCARCH)/a.out.h),) | 5 | ifneq ($(wildcard $(srctree)/include/asm-$(SRCARCH)/a.out.h),) |
4 | unifdef-y += a.out.h | 6 | unifdef-y += a.out.h |
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 2632328d8646..a3f738cffdb6 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h | |||
@@ -34,9 +34,14 @@ struct bug_entry { | |||
34 | #ifndef __WARN | 34 | #ifndef __WARN |
35 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
36 | extern void warn_on_slowpath(const char *file, const int line); | 36 | extern void warn_on_slowpath(const char *file, const int line); |
37 | extern void warn_slowpath(const char *file, const int line, | ||
38 | const char *fmt, ...) __attribute__((format(printf, 3, 4))); | ||
37 | #define WANT_WARN_ON_SLOWPATH | 39 | #define WANT_WARN_ON_SLOWPATH |
38 | #endif | 40 | #endif |
39 | #define __WARN() warn_on_slowpath(__FILE__, __LINE__) | 41 | #define __WARN() warn_on_slowpath(__FILE__, __LINE__) |
42 | #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) | ||
43 | #else | ||
44 | #define __WARN_printf(arg...) __WARN() | ||
40 | #endif | 45 | #endif |
41 | 46 | ||
42 | #ifndef WARN_ON | 47 | #ifndef WARN_ON |
@@ -48,6 +53,15 @@ extern void warn_on_slowpath(const char *file, const int line); | |||
48 | }) | 53 | }) |
49 | #endif | 54 | #endif |
50 | 55 | ||
56 | #ifndef WARN | ||
57 | #define WARN(condition, format...) ({ \ | ||
58 | int __ret_warn_on = !!(condition); \ | ||
59 | if (unlikely(__ret_warn_on)) \ | ||
60 | __WARN_printf(format); \ | ||
61 | unlikely(__ret_warn_on); \ | ||
62 | }) | ||
63 | #endif | ||
64 | |||
51 | #else /* !CONFIG_BUG */ | 65 | #else /* !CONFIG_BUG */ |
52 | #ifndef HAVE_ARCH_BUG | 66 | #ifndef HAVE_ARCH_BUG |
53 | #define BUG() | 67 | #define BUG() |
@@ -63,6 +77,14 @@ extern void warn_on_slowpath(const char *file, const int line); | |||
63 | unlikely(__ret_warn_on); \ | 77 | unlikely(__ret_warn_on); \ |
64 | }) | 78 | }) |
65 | #endif | 79 | #endif |
80 | |||
81 | #ifndef WARN | ||
82 | #define WARN(condition, format...) ({ \ | ||
83 | int __ret_warn_on = !!(condition); \ | ||
84 | unlikely(__ret_warn_on); \ | ||
85 | }) | ||
86 | #endif | ||
87 | |||
66 | #endif | 88 | #endif |
67 | 89 | ||
68 | #define WARN_ON_ONCE(condition) ({ \ | 90 | #define WARN_ON_ONCE(condition) ({ \ |
@@ -75,6 +97,9 @@ extern void warn_on_slowpath(const char *file, const int line); | |||
75 | unlikely(__ret_warn_once); \ | 97 | unlikely(__ret_warn_once); \ |
76 | }) | 98 | }) |
77 | 99 | ||
100 | #define WARN_ON_RATELIMIT(condition, state) \ | ||
101 | WARN_ON((condition) && __ratelimit(state)) | ||
102 | |||
78 | #ifdef CONFIG_SMP | 103 | #ifdef CONFIG_SMP |
79 | # define WARN_ON_SMP(x) WARN_ON(x) | 104 | # define WARN_ON_SMP(x) WARN_ON(x) |
80 | #else | 105 | #else |
diff --git a/include/asm-generic/dma-mapping-broken.h b/include/asm-generic/dma-mapping-broken.h index e2468f894d2a..82cd0cb1c3fe 100644 --- a/include/asm-generic/dma-mapping-broken.h +++ b/include/asm-generic/dma-mapping-broken.h | |||
@@ -61,7 +61,7 @@ dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | |||
61 | #define dma_sync_sg_for_device dma_sync_sg_for_cpu | 61 | #define dma_sync_sg_for_device dma_sync_sg_for_cpu |
62 | 62 | ||
63 | extern int | 63 | extern int |
64 | dma_mapping_error(dma_addr_t dma_addr); | 64 | dma_mapping_error(struct device *dev, dma_addr_t dma_addr); |
65 | 65 | ||
66 | extern int | 66 | extern int |
67 | dma_supported(struct device *dev, u64 mask); | 67 | dma_supported(struct device *dev, u64 mask); |
diff --git a/include/asm-generic/dma-mapping.h b/include/asm-generic/dma-mapping.h index 783ab9944d70..189486c3f92e 100644 --- a/include/asm-generic/dma-mapping.h +++ b/include/asm-generic/dma-mapping.h | |||
@@ -144,9 +144,9 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, | |||
144 | } | 144 | } |
145 | 145 | ||
146 | static inline int | 146 | static inline int |
147 | dma_mapping_error(dma_addr_t dma_addr) | 147 | dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
148 | { | 148 | { |
149 | return pci_dma_mapping_error(dma_addr); | 149 | return pci_dma_mapping_error(to_pci_dev(dev), dma_addr); |
150 | } | 150 | } |
151 | 151 | ||
152 | 152 | ||
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 6be061d09da9..c764a8fcb058 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | 5 | ||
6 | #ifdef CONFIG_HAVE_GPIO_LIB | 6 | #ifdef CONFIG_GPIOLIB |
7 | 7 | ||
8 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
9 | 9 | ||
@@ -13,7 +13,7 @@ | |||
13 | * | 13 | * |
14 | * While the GPIO programming interface defines valid GPIO numbers | 14 | * While the GPIO programming interface defines valid GPIO numbers |
15 | * to be in the range 0..MAX_INT, this library restricts them to the | 15 | * to be in the range 0..MAX_INT, this library restricts them to the |
16 | * smaller range 0..ARCH_NR_GPIOS. | 16 | * smaller range 0..ARCH_NR_GPIOS-1. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #ifndef ARCH_NR_GPIOS | 19 | #ifndef ARCH_NR_GPIOS |
@@ -32,6 +32,8 @@ struct module; | |||
32 | /** | 32 | /** |
33 | * struct gpio_chip - abstract a GPIO controller | 33 | * struct gpio_chip - abstract a GPIO controller |
34 | * @label: for diagnostics | 34 | * @label: for diagnostics |
35 | * @dev: optional device providing the GPIOs | ||
36 | * @owner: helps prevent removal of modules exporting active GPIOs | ||
35 | * @direction_input: configures signal "offset" as input, or returns error | 37 | * @direction_input: configures signal "offset" as input, or returns error |
36 | * @get: returns value for signal "offset"; for output signals this | 38 | * @get: returns value for signal "offset"; for output signals this |
37 | * returns either the value actually sensed, or zero | 39 | * returns either the value actually sensed, or zero |
@@ -59,6 +61,7 @@ struct module; | |||
59 | */ | 61 | */ |
60 | struct gpio_chip { | 62 | struct gpio_chip { |
61 | char *label; | 63 | char *label; |
64 | struct device *dev; | ||
62 | struct module *owner; | 65 | struct module *owner; |
63 | 66 | ||
64 | int (*direction_input)(struct gpio_chip *chip, | 67 | int (*direction_input)(struct gpio_chip *chip, |
@@ -74,6 +77,7 @@ struct gpio_chip { | |||
74 | int base; | 77 | int base; |
75 | u16 ngpio; | 78 | u16 ngpio; |
76 | unsigned can_sleep:1; | 79 | unsigned can_sleep:1; |
80 | unsigned exported:1; | ||
77 | }; | 81 | }; |
78 | 82 | ||
79 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, | 83 | extern const char *gpiochip_is_requested(struct gpio_chip *chip, |
@@ -108,7 +112,18 @@ extern void __gpio_set_value(unsigned gpio, int value); | |||
108 | extern int __gpio_cansleep(unsigned gpio); | 112 | extern int __gpio_cansleep(unsigned gpio); |
109 | 113 | ||
110 | 114 | ||
111 | #else | 115 | #ifdef CONFIG_GPIO_SYSFS |
116 | |||
117 | /* | ||
118 | * A sysfs interface can be exported by individual drivers if they want, | ||
119 | * but more typically is configured entirely from userspace. | ||
120 | */ | ||
121 | extern int gpio_export(unsigned gpio, bool direction_may_change); | ||
122 | extern void gpio_unexport(unsigned gpio); | ||
123 | |||
124 | #endif /* CONFIG_GPIO_SYSFS */ | ||
125 | |||
126 | #else /* !CONFIG_HAVE_GPIO_LIB */ | ||
112 | 127 | ||
113 | static inline int gpio_is_valid(int number) | 128 | static inline int gpio_is_valid(int number) |
114 | { | 129 | { |
@@ -137,6 +152,20 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value) | |||
137 | gpio_set_value(gpio, value); | 152 | gpio_set_value(gpio, value); |
138 | } | 153 | } |
139 | 154 | ||
140 | #endif | 155 | #endif /* !CONFIG_HAVE_GPIO_LIB */ |
156 | |||
157 | #ifndef CONFIG_GPIO_SYSFS | ||
158 | |||
159 | /* sysfs support is only available with gpiolib, where it's optional */ | ||
160 | |||
161 | static inline int gpio_export(unsigned gpio, bool direction_may_change) | ||
162 | { | ||
163 | return -ENOSYS; | ||
164 | } | ||
165 | |||
166 | static inline void gpio_unexport(unsigned gpio) | ||
167 | { | ||
168 | } | ||
169 | #endif /* CONFIG_GPIO_SYSFS */ | ||
141 | 170 | ||
142 | #endif /* _ASM_GENERIC_GPIO_H */ | 171 | #endif /* _ASM_GENERIC_GPIO_H */ |
diff --git a/include/asm-generic/int-ll64.h b/include/asm-generic/int-ll64.h index 260948905e4e..f9bc9ac29b36 100644 --- a/include/asm-generic/int-ll64.h +++ b/include/asm-generic/int-ll64.h | |||
@@ -26,7 +26,7 @@ typedef unsigned int __u32; | |||
26 | #ifdef __GNUC__ | 26 | #ifdef __GNUC__ |
27 | __extension__ typedef __signed__ long long __s64; | 27 | __extension__ typedef __signed__ long long __s64; |
28 | __extension__ typedef unsigned long long __u64; | 28 | __extension__ typedef unsigned long long __u64; |
29 | #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L | 29 | #else |
30 | typedef __signed__ long long __s64; | 30 | typedef __signed__ long long __s64; |
31 | typedef unsigned long long __u64; | 31 | typedef unsigned long long __u64; |
32 | #endif | 32 | #endif |
diff --git a/include/asm-generic/pci-dma-compat.h b/include/asm-generic/pci-dma-compat.h index 25c10e96b2b7..37b3706226e7 100644 --- a/include/asm-generic/pci-dma-compat.h +++ b/include/asm-generic/pci-dma-compat.h | |||
@@ -99,9 +99,9 @@ pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sg, | |||
99 | } | 99 | } |
100 | 100 | ||
101 | static inline int | 101 | static inline int |
102 | pci_dma_mapping_error(dma_addr_t dma_addr) | 102 | pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr) |
103 | { | 103 | { |
104 | return dma_mapping_error(dma_addr); | 104 | return dma_mapping_error(&pdev->dev, dma_addr); |
105 | } | 105 | } |
106 | 106 | ||
107 | #endif | 107 | #endif |
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h new file mode 100644 index 000000000000..abcf34c2fdc7 --- /dev/null +++ b/include/asm-generic/syscall.h | |||
@@ -0,0 +1,141 @@ | |||
1 | /* | ||
2 | * Access to user system call parameters and results | ||
3 | * | ||
4 | * Copyright (C) 2008 Red Hat, Inc. All rights reserved. | ||
5 | * | ||
6 | * This copyrighted material is made available to anyone wishing to use, | ||
7 | * modify, copy, or redistribute it subject to the terms and conditions | ||
8 | * of the GNU General Public License v.2. | ||
9 | * | ||
10 | * This file is a stub providing documentation for what functions | ||
11 | * asm-ARCH/syscall.h files need to define. Most arch definitions | ||
12 | * will be simple inlines. | ||
13 | * | ||
14 | * All of these functions expect to be called with no locks, | ||
15 | * and only when the caller is sure that the task of interest | ||
16 | * cannot return to user mode while we are looking at it. | ||
17 | */ | ||
18 | |||
19 | #ifndef _ASM_SYSCALL_H | ||
20 | #define _ASM_SYSCALL_H 1 | ||
21 | |||
22 | struct task_struct; | ||
23 | struct pt_regs; | ||
24 | |||
25 | /** | ||
26 | * syscall_get_nr - find what system call a task is executing | ||
27 | * @task: task of interest, must be blocked | ||
28 | * @regs: task_pt_regs() of @task | ||
29 | * | ||
30 | * If @task is executing a system call or is at system call | ||
31 | * tracing about to attempt one, returns the system call number. | ||
32 | * If @task is not executing a system call, i.e. it's blocked | ||
33 | * inside the kernel for a fault or signal, returns -1. | ||
34 | * | ||
35 | * It's only valid to call this when @task is known to be blocked. | ||
36 | */ | ||
37 | long syscall_get_nr(struct task_struct *task, struct pt_regs *regs); | ||
38 | |||
39 | /** | ||
40 | * syscall_rollback - roll back registers after an aborted system call | ||
41 | * @task: task of interest, must be in system call exit tracing | ||
42 | * @regs: task_pt_regs() of @task | ||
43 | * | ||
44 | * It's only valid to call this when @task is stopped for system | ||
45 | * call exit tracing (due to TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT), | ||
46 | * after tracehook_report_syscall_entry() returned nonzero to prevent | ||
47 | * the system call from taking place. | ||
48 | * | ||
49 | * This rolls back the register state in @regs so it's as if the | ||
50 | * system call instruction was a no-op. The registers containing | ||
51 | * the system call number and arguments are as they were before the | ||
52 | * system call instruction. This may not be the same as what the | ||
53 | * register state looked like at system call entry tracing. | ||
54 | */ | ||
55 | void syscall_rollback(struct task_struct *task, struct pt_regs *regs); | ||
56 | |||
57 | /** | ||
58 | * syscall_get_error - check result of traced system call | ||
59 | * @task: task of interest, must be blocked | ||
60 | * @regs: task_pt_regs() of @task | ||
61 | * | ||
62 | * Returns 0 if the system call succeeded, or -ERRORCODE if it failed. | ||
63 | * | ||
64 | * It's only valid to call this when @task is stopped for tracing on exit | ||
65 | * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. | ||
66 | */ | ||
67 | long syscall_get_error(struct task_struct *task, struct pt_regs *regs); | ||
68 | |||
69 | /** | ||
70 | * syscall_get_return_value - get the return value of a traced system call | ||
71 | * @task: task of interest, must be blocked | ||
72 | * @regs: task_pt_regs() of @task | ||
73 | * | ||
74 | * Returns the return value of the successful system call. | ||
75 | * This value is meaningless if syscall_get_error() returned nonzero. | ||
76 | * | ||
77 | * It's only valid to call this when @task is stopped for tracing on exit | ||
78 | * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. | ||
79 | */ | ||
80 | long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs); | ||
81 | |||
82 | /** | ||
83 | * syscall_set_return_value - change the return value of a traced system call | ||
84 | * @task: task of interest, must be blocked | ||
85 | * @regs: task_pt_regs() of @task | ||
86 | * @error: negative error code, or zero to indicate success | ||
87 | * @val: user return value if @error is zero | ||
88 | * | ||
89 | * This changes the results of the system call that user mode will see. | ||
90 | * If @error is zero, the user sees a successful system call with a | ||
91 | * return value of @val. If @error is nonzero, it's a negated errno | ||
92 | * code; the user sees a failed system call with this errno code. | ||
93 | * | ||
94 | * It's only valid to call this when @task is stopped for tracing on exit | ||
95 | * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. | ||
96 | */ | ||
97 | void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, | ||
98 | int error, long val); | ||
99 | |||
100 | /** | ||
101 | * syscall_get_arguments - extract system call parameter values | ||
102 | * @task: task of interest, must be blocked | ||
103 | * @regs: task_pt_regs() of @task | ||
104 | * @i: argument index [0,5] | ||
105 | * @n: number of arguments; n+i must be [1,6]. | ||
106 | * @args: array filled with argument values | ||
107 | * | ||
108 | * Fetches @n arguments to the system call starting with the @i'th argument | ||
109 | * (from 0 through 5). Argument @i is stored in @args[0], and so on. | ||
110 | * An arch inline version is probably optimal when @i and @n are constants. | ||
111 | * | ||
112 | * It's only valid to call this when @task is stopped for tracing on | ||
113 | * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. | ||
114 | * It's invalid to call this with @i + @n > 6; we only support system calls | ||
115 | * taking up to 6 arguments. | ||
116 | */ | ||
117 | void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, | ||
118 | unsigned int i, unsigned int n, unsigned long *args); | ||
119 | |||
120 | /** | ||
121 | * syscall_set_arguments - change system call parameter value | ||
122 | * @task: task of interest, must be in system call entry tracing | ||
123 | * @regs: task_pt_regs() of @task | ||
124 | * @i: argument index [0,5] | ||
125 | * @n: number of arguments; n+i must be [1,6]. | ||
126 | * @args: array of argument values to store | ||
127 | * | ||
128 | * Changes @n arguments to the system call starting with the @i'th argument. | ||
129 | * @n'th argument to @val. Argument @i gets value @args[0], and so on. | ||
130 | * An arch inline version is probably optimal when @i and @n are constants. | ||
131 | * | ||
132 | * It's only valid to call this when @task is stopped for tracing on | ||
133 | * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. | ||
134 | * It's invalid to call this with @i + @n > 6; we only support system calls | ||
135 | * taking up to 6 arguments. | ||
136 | */ | ||
137 | void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, | ||
138 | unsigned int i, unsigned int n, | ||
139 | const unsigned long *args); | ||
140 | |||
141 | #endif /* _ASM_SYSCALL_H */ | ||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 729f6b0a60e9..6d88a923c945 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -221,6 +221,7 @@ | |||
221 | * during second ld run in second ld pass when generating System.map */ | 221 | * during second ld run in second ld pass when generating System.map */ |
222 | #define TEXT_TEXT \ | 222 | #define TEXT_TEXT \ |
223 | ALIGN_FUNCTION(); \ | 223 | ALIGN_FUNCTION(); \ |
224 | *(.text.hot) \ | ||
224 | *(.text) \ | 225 | *(.text) \ |
225 | *(.ref.text) \ | 226 | *(.ref.text) \ |
226 | *(.text.init.refok) \ | 227 | *(.text.init.refok) \ |
@@ -230,7 +231,8 @@ | |||
230 | CPU_KEEP(init.text) \ | 231 | CPU_KEEP(init.text) \ |
231 | CPU_KEEP(exit.text) \ | 232 | CPU_KEEP(exit.text) \ |
232 | MEM_KEEP(init.text) \ | 233 | MEM_KEEP(init.text) \ |
233 | MEM_KEEP(exit.text) | 234 | MEM_KEEP(exit.text) \ |
235 | *(.text.unlikely) | ||
234 | 236 | ||
235 | 237 | ||
236 | /* sched.text is aling to function alignment to secure we have same | 238 | /* sched.text is aling to function alignment to secure we have same |
@@ -359,6 +361,8 @@ | |||
359 | } | 361 | } |
360 | 362 | ||
361 | #define INITCALLS \ | 363 | #define INITCALLS \ |
364 | *(.initcallearly.init) \ | ||
365 | __early_initcall_end = .; \ | ||
362 | *(.initcall0.init) \ | 366 | *(.initcall0.init) \ |
363 | *(.initcall0s.init) \ | 367 | *(.initcall0s.init) \ |
364 | *(.initcall1.init) \ | 368 | *(.initcall1.init) \ |