diff options
author | Bernhard Walle <bwalle@suse.de> | 2008-01-30 07:30:32 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:30:32 -0500 |
commit | c9cce83dd1d59f52e2c8f8c7d265ba4854c40785 (patch) | |
tree | 0d6801b5c069e573ee06464c567e838a6764f424 | |
parent | 9773db2a301b089bb95907eec5ad1a2ef7fb4099 (diff) |
x86: remove extern declarations for code, data, bss resources
This patch removes the extern struct resource declarations for
data_resource, code_resource and bss_resource on x86 and declares that
three structures as static as done on other architectures like IA64.
On i386, these structures are moved to setup_32.c (from e820_32.c) because
that's code that is not specific to e820 and also required on EFI systems.
That makes the "extern" reference superfluous.
On x86_64, data_resource, code_resource and bss_resource are passed to
e820_reserve_resources() as arguments just as done on i386 and IA64. That
also avoids the "extern" reference and it's possible to make it static.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/e820_32.c | 110 | ||||
-rw-r--r-- | arch/x86/kernel/e820_64.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/setup_32.c | 106 | ||||
-rw-r--r-- | arch/x86/kernel/setup_64.c | 8 | ||||
-rw-r--r-- | include/asm-x86/e820_32.h | 6 | ||||
-rw-r--r-- | include/asm-x86/e820_64.h | 5 | ||||
-rw-r--r-- | include/linux/ioport.h | 2 |
7 files changed, 127 insertions, 121 deletions
diff --git a/arch/x86/kernel/e820_32.c b/arch/x86/kernel/e820_32.c index 18f500d185a..87cadc86d5e 100644 --- a/arch/x86/kernel/e820_32.c +++ b/arch/x86/kernel/e820_32.c | |||
@@ -37,26 +37,6 @@ unsigned long pci_mem_start = 0x10000000; | |||
37 | EXPORT_SYMBOL(pci_mem_start); | 37 | EXPORT_SYMBOL(pci_mem_start); |
38 | #endif | 38 | #endif |
39 | extern int user_defined_memmap; | 39 | extern int user_defined_memmap; |
40 | struct resource data_resource = { | ||
41 | .name = "Kernel data", | ||
42 | .start = 0, | ||
43 | .end = 0, | ||
44 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
45 | }; | ||
46 | |||
47 | struct resource code_resource = { | ||
48 | .name = "Kernel code", | ||
49 | .start = 0, | ||
50 | .end = 0, | ||
51 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
52 | }; | ||
53 | |||
54 | struct resource bss_resource = { | ||
55 | .name = "Kernel bss", | ||
56 | .start = 0, | ||
57 | .end = 0, | ||
58 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
59 | }; | ||
60 | 40 | ||
61 | static struct resource system_rom_resource = { | 41 | static struct resource system_rom_resource = { |
62 | .name = "System ROM", | 42 | .name = "System ROM", |
@@ -111,60 +91,6 @@ static struct resource video_rom_resource = { | |||
111 | .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM | 91 | .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM |
112 | }; | 92 | }; |
113 | 93 | ||
114 | static struct resource video_ram_resource = { | ||
115 | .name = "Video RAM area", | ||
116 | .start = 0xa0000, | ||
117 | .end = 0xbffff, | ||
118 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
119 | }; | ||
120 | |||
121 | static struct resource standard_io_resources[] = { { | ||
122 | .name = "dma1", | ||
123 | .start = 0x0000, | ||
124 | .end = 0x001f, | ||
125 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
126 | }, { | ||
127 | .name = "pic1", | ||
128 | .start = 0x0020, | ||
129 | .end = 0x0021, | ||
130 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
131 | }, { | ||
132 | .name = "timer0", | ||
133 | .start = 0x0040, | ||
134 | .end = 0x0043, | ||
135 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
136 | }, { | ||
137 | .name = "timer1", | ||
138 | .start = 0x0050, | ||
139 | .end = 0x0053, | ||
140 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
141 | }, { | ||
142 | .name = "keyboard", | ||
143 | .start = 0x0060, | ||
144 | .end = 0x006f, | ||
145 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
146 | }, { | ||
147 | .name = "dma page reg", | ||
148 | .start = 0x0080, | ||
149 | .end = 0x008f, | ||
150 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
151 | }, { | ||
152 | .name = "pic2", | ||
153 | .start = 0x00a0, | ||
154 | .end = 0x00a1, | ||
155 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
156 | }, { | ||
157 | .name = "dma2", | ||
158 | .start = 0x00c0, | ||
159 | .end = 0x00df, | ||
160 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
161 | }, { | ||
162 | .name = "fpu", | ||
163 | .start = 0x00f0, | ||
164 | .end = 0x00ff, | ||
165 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
166 | } }; | ||
167 | |||
168 | #define ROMSIGNATURE 0xaa55 | 94 | #define ROMSIGNATURE 0xaa55 |
169 | 95 | ||
170 | static int __init romsignature(const unsigned char *rom) | 96 | static int __init romsignature(const unsigned char *rom) |
@@ -260,10 +186,9 @@ static void __init probe_roms(void) | |||
260 | * Request address space for all standard RAM and ROM resources | 186 | * Request address space for all standard RAM and ROM resources |
261 | * and also for regions reported as reserved by the e820. | 187 | * and also for regions reported as reserved by the e820. |
262 | */ | 188 | */ |
263 | static void __init | 189 | void __init legacy_init_iomem_resources(struct resource *code_resource, |
264 | legacy_init_iomem_resources(struct resource *code_resource, | 190 | struct resource *data_resource, |
265 | struct resource *data_resource, | 191 | struct resource *bss_resource) |
266 | struct resource *bss_resource) | ||
267 | { | 192 | { |
268 | int i; | 193 | int i; |
269 | 194 | ||
@@ -305,35 +230,6 @@ legacy_init_iomem_resources(struct resource *code_resource, | |||
305 | } | 230 | } |
306 | } | 231 | } |
307 | 232 | ||
308 | /* | ||
309 | * Request address space for all standard resources | ||
310 | * | ||
311 | * This is called just before pcibios_init(), which is also a | ||
312 | * subsys_initcall, but is linked in later (in arch/i386/pci/common.c). | ||
313 | */ | ||
314 | static int __init request_standard_resources(void) | ||
315 | { | ||
316 | int i; | ||
317 | |||
318 | printk("Setting up standard PCI resources\n"); | ||
319 | if (efi_enabled) | ||
320 | efi_initialize_iomem_resources(&code_resource, | ||
321 | &data_resource, &bss_resource); | ||
322 | else | ||
323 | legacy_init_iomem_resources(&code_resource, | ||
324 | &data_resource, &bss_resource); | ||
325 | |||
326 | /* EFI systems may still have VGA */ | ||
327 | request_resource(&iomem_resource, &video_ram_resource); | ||
328 | |||
329 | /* request I/O space for devices used on all i[345]86 PCs */ | ||
330 | for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++) | ||
331 | request_resource(&ioport_resource, &standard_io_resources[i]); | ||
332 | return 0; | ||
333 | } | ||
334 | |||
335 | subsys_initcall(request_standard_resources); | ||
336 | |||
337 | #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION) | 233 | #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION) |
338 | /** | 234 | /** |
339 | * e820_mark_nosave_regions - Find the ranges of physical addresses that do not | 235 | * e820_mark_nosave_regions - Find the ranges of physical addresses that do not |
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c index 11a3d65db0c..15123689624 100644 --- a/arch/x86/kernel/e820_64.c +++ b/arch/x86/kernel/e820_64.c | |||
@@ -47,8 +47,6 @@ unsigned long end_pfn_map; | |||
47 | */ | 47 | */ |
48 | static unsigned long __initdata end_user_pfn = MAXMEM>>PAGE_SHIFT; | 48 | static unsigned long __initdata end_user_pfn = MAXMEM>>PAGE_SHIFT; |
49 | 49 | ||
50 | extern struct resource code_resource, data_resource, bss_resource; | ||
51 | |||
52 | /* Check for some hardcoded bad areas that early boot is not allowed to touch */ | 50 | /* Check for some hardcoded bad areas that early boot is not allowed to touch */ |
53 | static inline int bad_addr(unsigned long *addrp, unsigned long size) | 51 | static inline int bad_addr(unsigned long *addrp, unsigned long size) |
54 | { | 52 | { |
@@ -213,7 +211,8 @@ unsigned long __init e820_end_of_ram(void) | |||
213 | /* | 211 | /* |
214 | * Mark e820 reserved areas as busy for the resource manager. | 212 | * Mark e820 reserved areas as busy for the resource manager. |
215 | */ | 213 | */ |
216 | void __init e820_reserve_resources(void) | 214 | void __init e820_reserve_resources(struct resource *code_resource, |
215 | struct resource *data_resource, struct resource *bss_resource) | ||
217 | { | 216 | { |
218 | int i; | 217 | int i; |
219 | for (i = 0; i < e820.nr_map; i++) { | 218 | for (i = 0; i < e820.nr_map; i++) { |
@@ -235,9 +234,9 @@ void __init e820_reserve_resources(void) | |||
235 | * so we try it repeatedly and let the resource manager | 234 | * so we try it repeatedly and let the resource manager |
236 | * test it. | 235 | * test it. |
237 | */ | 236 | */ |
238 | request_resource(res, &code_resource); | 237 | request_resource(res, code_resource); |
239 | request_resource(res, &data_resource); | 238 | request_resource(res, data_resource); |
240 | request_resource(res, &bss_resource); | 239 | request_resource(res, bss_resource); |
241 | #ifdef CONFIG_KEXEC | 240 | #ifdef CONFIG_KEXEC |
242 | if (crashk_res.start != crashk_res.end) | 241 | if (crashk_res.start != crashk_res.end) |
243 | request_resource(res, &crashk_res); | 242 | request_resource(res, &crashk_res); |
diff --git a/arch/x86/kernel/setup_32.c b/arch/x86/kernel/setup_32.c index 236d30b264d..32edf70d6b0 100644 --- a/arch/x86/kernel/setup_32.c +++ b/arch/x86/kernel/setup_32.c | |||
@@ -73,9 +73,80 @@ int disable_pse __cpuinitdata = 0; | |||
73 | /* | 73 | /* |
74 | * Machine setup.. | 74 | * Machine setup.. |
75 | */ | 75 | */ |
76 | extern struct resource code_resource; | 76 | static struct resource data_resource = { |
77 | extern struct resource data_resource; | 77 | .name = "Kernel data", |
78 | extern struct resource bss_resource; | 78 | .start = 0, |
79 | .end = 0, | ||
80 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
81 | }; | ||
82 | |||
83 | static struct resource code_resource = { | ||
84 | .name = "Kernel code", | ||
85 | .start = 0, | ||
86 | .end = 0, | ||
87 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
88 | }; | ||
89 | |||
90 | static struct resource bss_resource = { | ||
91 | .name = "Kernel bss", | ||
92 | .start = 0, | ||
93 | .end = 0, | ||
94 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
95 | }; | ||
96 | |||
97 | static struct resource video_ram_resource = { | ||
98 | .name = "Video RAM area", | ||
99 | .start = 0xa0000, | ||
100 | .end = 0xbffff, | ||
101 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
102 | }; | ||
103 | |||
104 | static struct resource standard_io_resources[] = { { | ||
105 | .name = "dma1", | ||
106 | .start = 0x0000, | ||
107 | .end = 0x001f, | ||
108 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
109 | }, { | ||
110 | .name = "pic1", | ||
111 | .start = 0x0020, | ||
112 | .end = 0x0021, | ||
113 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
114 | }, { | ||
115 | .name = "timer0", | ||
116 | .start = 0x0040, | ||
117 | .end = 0x0043, | ||
118 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
119 | }, { | ||
120 | .name = "timer1", | ||
121 | .start = 0x0050, | ||
122 | .end = 0x0053, | ||
123 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
124 | }, { | ||
125 | .name = "keyboard", | ||
126 | .start = 0x0060, | ||
127 | .end = 0x006f, | ||
128 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
129 | }, { | ||
130 | .name = "dma page reg", | ||
131 | .start = 0x0080, | ||
132 | .end = 0x008f, | ||
133 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
134 | }, { | ||
135 | .name = "pic2", | ||
136 | .start = 0x00a0, | ||
137 | .end = 0x00a1, | ||
138 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
139 | }, { | ||
140 | .name = "dma2", | ||
141 | .start = 0x00c0, | ||
142 | .end = 0x00df, | ||
143 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
144 | }, { | ||
145 | .name = "fpu", | ||
146 | .start = 0x00f0, | ||
147 | .end = 0x00ff, | ||
148 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | ||
149 | } }; | ||
79 | 150 | ||
80 | /* cpu data as detected by the assembly code in head.S */ | 151 | /* cpu data as detected by the assembly code in head.S */ |
81 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; | 152 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 }; |
@@ -693,3 +764,32 @@ void __init setup_arch(char **cmdline_p) | |||
693 | #endif | 764 | #endif |
694 | #endif | 765 | #endif |
695 | } | 766 | } |
767 | |||
768 | /* | ||
769 | * Request address space for all standard resources | ||
770 | * | ||
771 | * This is called just before pcibios_init(), which is also a | ||
772 | * subsys_initcall, but is linked in later (in arch/i386/pci/common.c). | ||
773 | */ | ||
774 | static int __init request_standard_resources(void) | ||
775 | { | ||
776 | int i; | ||
777 | |||
778 | printk(KERN_INFO "Setting up standard PCI resources\n"); | ||
779 | if (efi_enabled) | ||
780 | efi_initialize_iomem_resources(&code_resource, | ||
781 | &data_resource, &bss_resource); | ||
782 | else | ||
783 | legacy_init_iomem_resources(&code_resource, | ||
784 | &data_resource, &bss_resource); | ||
785 | |||
786 | /* EFI systems may still have VGA */ | ||
787 | request_resource(&iomem_resource, &video_ram_resource); | ||
788 | |||
789 | /* request I/O space for devices used on all i[345]86 PCs */ | ||
790 | for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++) | ||
791 | request_resource(&ioport_resource, &standard_io_resources[i]); | ||
792 | return 0; | ||
793 | } | ||
794 | |||
795 | subsys_initcall(request_standard_resources); | ||
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index bcb5f3aaa09..1acb435a058 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -123,19 +123,19 @@ struct resource standard_io_resources[] = { | |||
123 | 123 | ||
124 | #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM) | 124 | #define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM) |
125 | 125 | ||
126 | struct resource data_resource = { | 126 | static struct resource data_resource = { |
127 | .name = "Kernel data", | 127 | .name = "Kernel data", |
128 | .start = 0, | 128 | .start = 0, |
129 | .end = 0, | 129 | .end = 0, |
130 | .flags = IORESOURCE_RAM, | 130 | .flags = IORESOURCE_RAM, |
131 | }; | 131 | }; |
132 | struct resource code_resource = { | 132 | static struct resource code_resource = { |
133 | .name = "Kernel code", | 133 | .name = "Kernel code", |
134 | .start = 0, | 134 | .start = 0, |
135 | .end = 0, | 135 | .end = 0, |
136 | .flags = IORESOURCE_RAM, | 136 | .flags = IORESOURCE_RAM, |
137 | }; | 137 | }; |
138 | struct resource bss_resource = { | 138 | static struct resource bss_resource = { |
139 | .name = "Kernel bss", | 139 | .name = "Kernel bss", |
140 | .start = 0, | 140 | .start = 0, |
141 | .end = 0, | 141 | .end = 0, |
@@ -438,7 +438,7 @@ void __init setup_arch(char **cmdline_p) | |||
438 | /* | 438 | /* |
439 | * We trust e820 completely. No explicit ROM probing in memory. | 439 | * We trust e820 completely. No explicit ROM probing in memory. |
440 | */ | 440 | */ |
441 | e820_reserve_resources(); | 441 | e820_reserve_resources(&code_resource, &data_resource, &bss_resource); |
442 | e820_mark_nosave_regions(); | 442 | e820_mark_nosave_regions(); |
443 | 443 | ||
444 | { | 444 | { |
diff --git a/include/asm-x86/e820_32.h b/include/asm-x86/e820_32.h index 03f60c690c8..ae5ea19623f 100644 --- a/include/asm-x86/e820_32.h +++ b/include/asm-x86/e820_32.h | |||
@@ -12,6 +12,8 @@ | |||
12 | #ifndef __E820_HEADER | 12 | #ifndef __E820_HEADER |
13 | #define __E820_HEADER | 13 | #define __E820_HEADER |
14 | 14 | ||
15 | #include <linux/ioport.h> | ||
16 | |||
15 | #define HIGH_MEMORY (1024*1024) | 17 | #define HIGH_MEMORY (1024*1024) |
16 | 18 | ||
17 | #ifndef __ASSEMBLY__ | 19 | #ifndef __ASSEMBLY__ |
@@ -26,6 +28,9 @@ extern void register_bootmem_low_pages(unsigned long max_low_pfn); | |||
26 | extern void e820_register_memory(void); | 28 | extern void e820_register_memory(void); |
27 | extern void limit_regions(unsigned long long size); | 29 | extern void limit_regions(unsigned long long size); |
28 | extern void print_memory_map(char *who); | 30 | extern void print_memory_map(char *who); |
31 | extern void legacy_init_iomem_resources(struct resource *code_resource, | ||
32 | struct resource *data_resource, | ||
33 | struct resource *bss_resource); | ||
29 | 34 | ||
30 | #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION) | 35 | #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION) |
31 | extern void e820_mark_nosave_regions(void); | 36 | extern void e820_mark_nosave_regions(void); |
@@ -35,5 +40,6 @@ static inline void e820_mark_nosave_regions(void) | |||
35 | } | 40 | } |
36 | #endif | 41 | #endif |
37 | 42 | ||
43 | |||
38 | #endif/*!__ASSEMBLY__*/ | 44 | #endif/*!__ASSEMBLY__*/ |
39 | #endif/*__E820_HEADER*/ | 45 | #endif/*__E820_HEADER*/ |
diff --git a/include/asm-x86/e820_64.h b/include/asm-x86/e820_64.h index e535e6044e2..1c7ba880417 100644 --- a/include/asm-x86/e820_64.h +++ b/include/asm-x86/e820_64.h | |||
@@ -11,6 +11,8 @@ | |||
11 | #ifndef __E820_HEADER | 11 | #ifndef __E820_HEADER |
12 | #define __E820_HEADER | 12 | #define __E820_HEADER |
13 | 13 | ||
14 | #include <linux/ioport.h> | ||
15 | |||
14 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
15 | extern unsigned long find_e820_area(unsigned long start, unsigned long end, | 17 | extern unsigned long find_e820_area(unsigned long start, unsigned long end, |
16 | unsigned size); | 18 | unsigned size); |
@@ -19,7 +21,8 @@ extern void add_memory_region(unsigned long start, unsigned long size, | |||
19 | extern void setup_memory_region(void); | 21 | extern void setup_memory_region(void); |
20 | extern void contig_e820_setup(void); | 22 | extern void contig_e820_setup(void); |
21 | extern unsigned long e820_end_of_ram(void); | 23 | extern unsigned long e820_end_of_ram(void); |
22 | extern void e820_reserve_resources(void); | 24 | extern void e820_reserve_resources(struct resource *code_resource, |
25 | struct resource *data_resource, struct resource *bss_resource); | ||
23 | extern void e820_mark_nosave_regions(void); | 26 | extern void e820_mark_nosave_regions(void); |
24 | extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type); | 27 | extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type); |
25 | extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type); | 28 | extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type); |
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 6187a8567bc..605d237364d 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #ifndef _LINUX_IOPORT_H | 8 | #ifndef _LINUX_IOPORT_H |
9 | #define _LINUX_IOPORT_H | 9 | #define _LINUX_IOPORT_H |
10 | 10 | ||
11 | #ifndef __ASSEMBLY__ | ||
11 | #include <linux/compiler.h> | 12 | #include <linux/compiler.h> |
12 | #include <linux/types.h> | 13 | #include <linux/types.h> |
13 | /* | 14 | /* |
@@ -153,4 +154,5 @@ extern struct resource * __devm_request_region(struct device *dev, | |||
153 | extern void __devm_release_region(struct device *dev, struct resource *parent, | 154 | extern void __devm_release_region(struct device *dev, struct resource *parent, |
154 | resource_size_t start, resource_size_t n); | 155 | resource_size_t start, resource_size_t n); |
155 | 156 | ||
157 | #endif /* __ASSEMBLY__ */ | ||
156 | #endif /* _LINUX_IOPORT_H */ | 158 | #endif /* _LINUX_IOPORT_H */ |