diff options
author | Patrick Georgi <pgeorgi@google.com> | 2018-06-29 16:52:28 +0200 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-07-13 05:09:33 -0700 |
commit | 3099f182b5fb03ac6f05e0d15eb81b9438d252aa (patch) | |
tree | 57602e5d439ef6850fbdbfff894036fd5ccbd26d /core | |
parent | 72b83f6b6c89da81248d76c25d2f7ba3066b6acf (diff) | |
download | chrome-ec-3099f182b5fb03ac6f05e0d15eb81b9438d252aa.tar.gz |
cortex-m: Generate vector table in C
Different versions of the linker behave differently when mixing object
built with lto enabled (desirable for code size reduction) and disabled
(assembler code), especially when they refer to each other symbols:
The file evaluation order of the linker becomes important as it
eliminates dead code at various points in time, and LTO code referring
to non-LTO code or vice versa, is not visible at early runs.
Sadly, just changing the order on the command line isn't sufficient:
What works for gcc8 breaks gcc6 (and may behave different in even more
ways on gcc4 or other versions).
Therefore, implement the vector table in C, so it's compiled in LTO
mode, just like the code it refers to.
BUG=b:65441143
BRANCH=none
TEST=with this change coral EC is functional when built with the gcc 8.1
based coreboot toolchain.
Change-Id: I9b75f6558f0357e18000ff1161096c8f9c94a8ac
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-on: https://chromium-review.googlesource.com/1120333
Commit-Ready: Patrick Georgi <pgeorgi@chromium.org>
Tested-by: Patrick Georgi <pgeorgi@chromium.org>
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/cortex-m/build.mk | 2 | ||||
-rw-r--r-- | core/cortex-m/ec.lds.S | 2 | ||||
-rw-r--r-- | core/cortex-m/init.S | 317 | ||||
-rw-r--r-- | core/cortex-m/vecttable.c | 382 |
4 files changed, 384 insertions, 319 deletions
diff --git a/core/cortex-m/build.mk b/core/cortex-m/build.mk index 59114b20a8..b07a2914de 100644 --- a/core/cortex-m/build.mk +++ b/core/cortex-m/build.mk @@ -22,7 +22,7 @@ CFLAGS_CPU+=-flto LDFLAGS_EXTRA+=-flto endif -core-y=cpu.o init.o ldivmod.o llsr.o uldivmod.o +core-y=cpu.o init.o ldivmod.o llsr.o uldivmod.o vecttable.o core-$(CONFIG_ARMV7M_CACHE)+=cache.o core-$(CONFIG_COMMON_PANIC_OUTPUT)+=panic.o core-$(CONFIG_COMMON_RUNTIME)+=switch.o task.o diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S index b6882d7214..e4b15e4d15 100644 --- a/core/cortex-m/ec.lds.S +++ b/core/cortex-m/ec.lds.S @@ -78,7 +78,7 @@ SECTIONS #if defined(SECTION_IS_RW) && defined(CONFIG_RW_HEAD_ROOM) . = . + CONFIG_RW_HEAD_ROOM; #endif - STRINGIFY(OUTDIR/core/CORE/init.o) (.text.vecttable) + *(.text.vecttable) . = ALIGN(4); __image_data_offset = .; KEEP(*(.rodata.ver)) diff --git a/core/cortex-m/init.S b/core/cortex-m/init.S index bd8d19a638..de869c61e7 100644 --- a/core/cortex-m/init.S +++ b/core/cortex-m/init.S @@ -7,294 +7,6 @@ #include "config.h" -.section .text.vecttable - -.macro vector name -.long \name\()_handler -.weak \name\()_handler -.set \name\()_handler, default_handler -.endm - -.macro vector_irq number -.if \number < CONFIG_IRQ_COUNT -vector irq_\()\number -.endif -.endm - -/* Exceptions vector */ -vectors: -.long stack_end @ initial stack pointer -.long reset @ reset handler -vector nmi @ NMI handler -vector hard_fault @ HardFault handler -vector mpu_fault @ MPU fault handler -vector bus_fault @ Bus fault handler -vector usage_fault @ Usage fault handler -.long 0 @ reserved -.long 0 @ reserved -.long 0 @ reserved -.long 0 @ reserved -.long svc_helper_handler @ SWI -vector debug @ Debug handler -.long 0 @ reserved -vector pendsv @ PendSV handler -vector sys_tick @ SysTick handler -vector_irq 0 @ IRQ 0 handler -vector_irq 1 @ IRQ 1 handler -vector_irq 2 @ IRQ 2 handler -vector_irq 3 @ IRQ 3 handler -vector_irq 4 @ IRQ 4 handler -vector_irq 5 @ IRQ 5 handler -vector_irq 6 @ IRQ 6 handler -vector_irq 7 @ IRQ 7 handler -vector_irq 8 @ IRQ 8 handler -vector_irq 9 @ IRQ 9 handler -vector_irq 10 @ IRQ 10 handler -vector_irq 11 @ IRQ 11 handler -vector_irq 12 @ IRQ 12 handler -vector_irq 13 @ IRQ 13 handler -vector_irq 14 @ IRQ 14 handler -vector_irq 15 @ IRQ 15 handler -vector_irq 16 @ IRQ 16 handler -vector_irq 17 @ IRQ 17 handler -vector_irq 18 @ IRQ 18 handler -vector_irq 19 @ IRQ 19 handler -vector_irq 20 @ IRQ 20 handler -vector_irq 21 @ IRQ 21 handler -vector_irq 22 @ IRQ 22 handler -vector_irq 23 @ IRQ 23 handler -vector_irq 24 @ IRQ 24 handler -vector_irq 25 @ IRQ 25 handler -vector_irq 26 @ IRQ 26 handler -vector_irq 27 @ IRQ 27 handler -vector_irq 28 @ IRQ 28 handler -vector_irq 29 @ IRQ 29 handler -vector_irq 30 @ IRQ 30 handler -vector_irq 31 @ IRQ 31 handler -vector_irq 32 @ IRQ 32 handler -vector_irq 33 @ IRQ 33 handler -vector_irq 34 @ IRQ 34 handler -vector_irq 35 @ IRQ 35 handler -vector_irq 36 @ IRQ 36 handler -vector_irq 37 @ IRQ 37 handler -vector_irq 38 @ IRQ 38 handler -vector_irq 39 @ IRQ 39 handler -vector_irq 40 @ IRQ 40 handler -vector_irq 41 @ IRQ 41 handler -vector_irq 42 @ IRQ 42 handler -vector_irq 43 @ IRQ 43 handler -vector_irq 44 @ IRQ 44 handler -vector_irq 45 @ IRQ 45 handler -vector_irq 46 @ IRQ 46 handler -vector_irq 47 @ IRQ 47 handler -vector_irq 48 @ IRQ 48 handler -vector_irq 49 @ IRQ 49 handler -vector_irq 50 @ IRQ 50 handler -vector_irq 51 @ IRQ 51 handler -vector_irq 52 @ IRQ 52 handler -vector_irq 53 @ IRQ 53 handler -vector_irq 54 @ IRQ 54 handler -vector_irq 55 @ IRQ 55 handler -vector_irq 56 @ IRQ 56 handler -vector_irq 57 @ IRQ 57 handler -vector_irq 58 @ IRQ 58 handler -vector_irq 59 @ IRQ 59 handler -vector_irq 60 @ IRQ 60 handler -vector_irq 61 @ IRQ 61 handler -vector_irq 62 @ IRQ 62 handler -vector_irq 63 @ IRQ 63 handler -vector_irq 64 @ IRQ 64 handler -vector_irq 65 @ IRQ 65 handler -vector_irq 66 @ IRQ 66 handler -vector_irq 67 @ IRQ 67 handler -vector_irq 68 @ IRQ 68 handler -vector_irq 69 @ IRQ 69 handler -vector_irq 70 @ IRQ 70 handler -vector_irq 71 @ IRQ 71 handler -vector_irq 72 @ IRQ 72 handler -vector_irq 73 @ IRQ 73 handler -vector_irq 74 @ IRQ 74 handler -vector_irq 75 @ IRQ 75 handler -vector_irq 76 @ IRQ 76 handler -vector_irq 77 @ IRQ 77 handler -vector_irq 78 @ IRQ 78 handler -vector_irq 79 @ IRQ 79 handler -vector_irq 80 @ IRQ 80 handler -vector_irq 81 @ IRQ 81 handler -vector_irq 82 @ IRQ 82 handler -vector_irq 83 @ IRQ 83 handler -vector_irq 84 @ IRQ 84 handler -vector_irq 85 @ IRQ 85 handler -vector_irq 86 @ IRQ 86 handler -vector_irq 87 @ IRQ 87 handler -vector_irq 88 @ IRQ 88 handler -vector_irq 89 @ IRQ 89 handler -vector_irq 90 @ IRQ 90 handler -vector_irq 91 @ IRQ 91 handler -vector_irq 92 @ IRQ 92 handler -vector_irq 93 @ IRQ 93 handler -vector_irq 94 @ IRQ 94 handler -vector_irq 95 @ IRQ 95 handler -vector_irq 96 @ IRQ 96 handler -vector_irq 97 @ IRQ 97 handler -vector_irq 98 @ IRQ 98 handler -vector_irq 99 @ IRQ 99 handler -vector_irq 100 @ IRQ 100 handler -vector_irq 101 @ IRQ 101 handler -vector_irq 102 @ IRQ 102 handler -vector_irq 103 @ IRQ 103 handler -vector_irq 104 @ IRQ 104 handler -vector_irq 105 @ IRQ 105 handler -vector_irq 106 @ IRQ 106 handler -vector_irq 107 @ IRQ 107 handler -vector_irq 108 @ IRQ 108 handler -vector_irq 109 @ IRQ 109 handler -vector_irq 110 @ IRQ 110 handler -vector_irq 111 @ IRQ 111 handler -vector_irq 112 @ IRQ 112 handler -vector_irq 113 @ IRQ 113 handler -vector_irq 114 @ IRQ 114 handler -vector_irq 115 @ IRQ 115 handler -vector_irq 116 @ IRQ 116 handler -vector_irq 117 @ IRQ 117 handler -vector_irq 118 @ IRQ 118 handler -vector_irq 119 @ IRQ 119 handler -vector_irq 120 @ IRQ 120 handler -vector_irq 121 @ IRQ 121 handler -vector_irq 122 @ IRQ 122 handler -vector_irq 123 @ IRQ 123 handler -vector_irq 124 @ IRQ 124 handler -vector_irq 125 @ IRQ 125 handler -vector_irq 126 @ IRQ 126 handler -vector_irq 127 @ IRQ 127 handler -vector_irq 128 @ IRQ 128 handler -vector_irq 129 @ IRQ 129 handler -vector_irq 130 @ IRQ 130 handler -vector_irq 131 @ IRQ 131 handler -vector_irq 132 @ IRQ 132 handler -vector_irq 133 @ IRQ 133 handler -vector_irq 134 @ IRQ 134 handler -vector_irq 135 @ IRQ 135 handler -vector_irq 136 @ IRQ 136 handler -vector_irq 137 @ IRQ 137 handler -vector_irq 138 @ IRQ 138 handler -vector_irq 139 @ IRQ 139 handler -vector_irq 140 @ IRQ 140 handler -vector_irq 141 @ IRQ 141 handler -vector_irq 142 @ IRQ 142 handler -vector_irq 143 @ IRQ 143 handler -vector_irq 144 @ IRQ 144 handler -vector_irq 145 @ IRQ 145 handler -vector_irq 146 @ IRQ 146 handler -vector_irq 147 @ IRQ 147 handler -vector_irq 148 @ IRQ 148 handler -vector_irq 149 @ IRQ 149 handler -vector_irq 150 @ IRQ 150 handler -vector_irq 151 @ IRQ 151 handler -vector_irq 152 @ IRQ 152 handler -vector_irq 153 @ IRQ 153 handler -vector_irq 154 @ IRQ 154 handler -vector_irq 155 @ IRQ 155 handler -vector_irq 156 @ IRQ 156 handler -vector_irq 157 @ IRQ 157 handler -vector_irq 158 @ IRQ 158 handler -vector_irq 159 @ IRQ 159 handler -vector_irq 160 @ IRQ 160 handler -vector_irq 161 @ IRQ 161 handler -vector_irq 162 @ IRQ 162 handler -vector_irq 163 @ IRQ 163 handler -vector_irq 164 @ IRQ 164 handler -vector_irq 165 @ IRQ 165 handler -vector_irq 166 @ IRQ 166 handler -vector_irq 167 @ IRQ 167 handler -vector_irq 168 @ IRQ 168 handler -vector_irq 169 @ IRQ 169 handler -vector_irq 170 @ IRQ 170 handler -vector_irq 171 @ IRQ 171 handler -vector_irq 172 @ IRQ 172 handler -vector_irq 173 @ IRQ 173 handler -vector_irq 174 @ IRQ 174 handler -vector_irq 175 @ IRQ 175 handler -vector_irq 176 @ IRQ 176 handler -vector_irq 177 @ IRQ 177 handler -vector_irq 178 @ IRQ 178 handler -vector_irq 179 @ IRQ 179 handler -vector_irq 180 @ IRQ 180 handler -vector_irq 181 @ IRQ 181 handler -vector_irq 182 @ IRQ 182 handler -vector_irq 183 @ IRQ 183 handler -vector_irq 184 @ IRQ 184 handler -vector_irq 185 @ IRQ 185 handler -vector_irq 186 @ IRQ 186 handler -vector_irq 187 @ IRQ 187 handler -vector_irq 188 @ IRQ 188 handler -vector_irq 189 @ IRQ 189 handler -vector_irq 190 @ IRQ 190 handler -vector_irq 191 @ IRQ 191 handler -vector_irq 192 @ IRQ 192 handler -vector_irq 193 @ IRQ 193 handler -vector_irq 194 @ IRQ 194 handler -vector_irq 195 @ IRQ 195 handler -vector_irq 196 @ IRQ 196 handler -vector_irq 197 @ IRQ 197 handler -vector_irq 198 @ IRQ 198 handler -vector_irq 199 @ IRQ 199 handler -vector_irq 200 @ IRQ 200 handler -vector_irq 201 @ IRQ 201 handler -vector_irq 202 @ IRQ 202 handler -vector_irq 203 @ IRQ 203 handler -vector_irq 204 @ IRQ 204 handler -vector_irq 205 @ IRQ 205 handler -vector_irq 206 @ IRQ 206 handler -vector_irq 207 @ IRQ 207 handler -vector_irq 208 @ IRQ 208 handler -vector_irq 209 @ IRQ 209 handler -vector_irq 210 @ IRQ 210 handler -vector_irq 211 @ IRQ 211 handler -vector_irq 212 @ IRQ 212 handler -vector_irq 213 @ IRQ 213 handler -vector_irq 214 @ IRQ 214 handler -vector_irq 215 @ IRQ 215 handler -vector_irq 216 @ IRQ 216 handler -vector_irq 217 @ IRQ 217 handler -vector_irq 218 @ IRQ 218 handler -vector_irq 219 @ IRQ 219 handler -vector_irq 220 @ IRQ 220 handler -vector_irq 221 @ IRQ 221 handler -vector_irq 222 @ IRQ 222 handler -vector_irq 223 @ IRQ 223 handler -vector_irq 224 @ IRQ 224 handler -vector_irq 225 @ IRQ 225 handler -vector_irq 226 @ IRQ 226 handler -vector_irq 227 @ IRQ 227 handler -vector_irq 228 @ IRQ 228 handler -vector_irq 229 @ IRQ 229 handler -vector_irq 230 @ IRQ 230 handler -vector_irq 231 @ IRQ 231 handler -vector_irq 232 @ IRQ 232 handler -vector_irq 233 @ IRQ 233 handler -vector_irq 234 @ IRQ 234 handler -vector_irq 235 @ IRQ 235 handler -vector_irq 236 @ IRQ 236 handler -vector_irq 237 @ IRQ 237 handler -vector_irq 238 @ IRQ 238 handler -vector_irq 239 @ IRQ 239 handler -vector_irq 240 @ IRQ 240 handler -vector_irq 241 @ IRQ 241 handler -vector_irq 242 @ IRQ 242 handler -vector_irq 243 @ IRQ 243 handler -vector_irq 244 @ IRQ 244 handler -vector_irq 245 @ IRQ 245 handler -vector_irq 246 @ IRQ 246 handler -vector_irq 247 @ IRQ 247 handler -vector_irq 248 @ IRQ 248 handler -vector_irq 249 @ IRQ 249 handler -vector_irq 250 @ IRQ 250 handler -vector_irq 251 @ IRQ 251 handler -vector_irq 252 @ IRQ 252 handler -vector_irq 253 @ IRQ 253 handler -vector_irq 254 @ IRQ 254 handler - .text .syntax unified .code 16 @@ -379,35 +91,6 @@ data_loop: fini_loop: b fini_loop -/* Default exception handler */ -.thumb_func -default_handler: - b exception_panic - -/* - * SVC handler helper - * - * Work around issue where a late exception can corrupt r0 to r3, - * see section 2.7 (svc) of Cortex-M3 Application Note 179: - * http://infocenter.arm.com/help/topic/com.arm.doc.dai0179b/AppsNote179.pdf - * - * This approach differs slightly from the one in the document, - * it only loads r0 (desched) and r1 (resched) for svc_handler. - */ -.thumb_func -svc_helper_handler: - tst lr, #4 /* see if called from supervisor mode */ - mrs r2, msp /* get the correct stack pointer into r2 */ - it ne - mrsne r2, psp - ldr r1, [r2, #4] /* get regs from stack frame */ - ldr r0, [r2] - b svc_handler /* call svc_handler */ - -/* Call default_handler if svc_handler is not found (task.c is not built) */ -.weak svc_handler -.set svc_handler, default_handler - .align 2 _bss_start: .long __bss_start diff --git a/core/cortex-m/vecttable.c b/core/cortex-m/vecttable.c new file mode 100644 index 0000000000..7db4a0eeca --- /dev/null +++ b/core/cortex-m/vecttable.c @@ -0,0 +1,382 @@ +/* Copyright (c) 2018 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Cortex-M CPU vector table + */ + +#ifndef ___INIT +#define ___INIT +#include "config.h" +#include <task.h> +#endif + +typedef void (*func)(void); + +#ifndef PASS +#define PASS 1 +#endif + +#if PASS == 1 +/* Default exception handler */ +void __attribute__((used,naked)) default_handler(void); +void default_handler() +{ + asm( + ".thumb_func\n" + " b exception_panic" + ); +} + +#define table(x) x + +#define weak_with_default __attribute__((used,weak,alias("default_handler"))) + +#define vec(name) extern void weak_with_default name ## _handler(void); +#define irq(num) vec(irq_ ## num) + +#define item(name) extern void name(void); +#define null + +extern void stack_end(void); /* not technically correct, it's just a pointer */ +extern void reset(void); + +#pragma GCC diagnostic push +#if __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wattribute-alias" +#endif +/* Call default_handler if svc_handler is not found (task.c is not built) */ +void weak_with_default svc_handler(int desched, task_id_t resched); +#pragma GCC diagnostic pop + +/* + * SVC handler helper + * + * Work around issue where a late exception can corrupt r0 to r3, + * see section 2.7 (svc) of Cortex-M3 Application Note 179: + * http://infocenter.arm.com/help/topic/com.arm.doc.dai0179b/AppsNote179.pdf + * + * This approach differs slightly from the one in the document, + * it only loads r0 (desched) and r1 (resched) for svc_handler. + */ +void __attribute__((used,naked)) svc_helper_handler(void); +void svc_helper_handler() +{ + asm( + ".thumb_func\n" + " tst lr, #4 /* see if called from supervisor mode */\n" + " mrs r2, msp /* get the correct stack pointer into r2 */\n" + " it ne\n" + " mrsne r2, psp\n" + " ldr r1, [r2, #4] /* get regs from stack frame */\n" + " ldr r0, [r2]\n" + " b %0 /* call svc_handler */\n" + : + : "i"(svc_handler) + ); +} + +#endif /* PASS 1 */ + +#if PASS == 2 +#undef table +#undef vec +#undef irq +#undef item +#undef null + +/* number of elements before the first irq vector */ +#define IRQ_OFFSET 16 +/* element in the table that is null: extra IRQs are routed there, + * then finally overwritten + */ +#define IRQ_UNUSED_OFFSET 8 + +#define table(x) func vectors[] __attribute__((section(".text.vecttable,\"a\" @"))) = { x [IRQ_UNUSED_OFFSET] = null }; + +#define vec(name) name ## _handler, +#define irq(num) [num < CONFIG_IRQ_COUNT ? num + IRQ_OFFSET : IRQ_UNUSED_OFFSET] = vec(irq_ ## num) + +#define item(name) name, +#define null (void*)0, +#endif /* PASS 2 */ + +table( + item(stack_end) + item(reset) + vec(nmi) + vec(hard_fault) + vec(mpu_fault) + vec(bus_fault) + vec(usage_fault) + null + null + null + null + item(svc_helper_handler) + vec(debug) + null + vec(pendsv) + vec(sys_tick) + irq(0) + irq(1) + irq(2) + irq(3) + irq(4) + irq(5) + irq(6) + irq(7) + irq(8) + irq(9) + irq(10) + irq(11) + irq(12) + irq(13) + irq(14) + irq(15) + irq(16) + irq(17) + irq(18) + irq(19) + irq(20) + irq(21) + irq(22) + irq(23) + irq(24) + irq(25) + irq(26) + irq(27) + irq(28) + irq(29) + irq(30) + irq(31) + irq(32) + irq(33) + irq(34) + irq(35) + irq(36) + irq(37) + irq(38) + irq(39) + irq(40) + irq(41) + irq(42) + irq(43) + irq(44) + irq(45) + irq(46) + irq(47) + irq(48) + irq(49) + irq(50) + irq(51) + irq(52) + irq(53) + irq(54) + irq(55) + irq(56) + irq(57) + irq(58) + irq(59) + irq(60) + irq(61) + irq(62) + irq(63) + irq(64) + irq(65) + irq(66) + irq(67) + irq(68) + irq(69) + irq(70) + irq(71) + irq(72) + irq(73) + irq(74) + irq(75) + irq(76) + irq(77) + irq(78) + irq(79) + irq(80) + irq(81) + irq(82) + irq(83) + irq(84) + irq(85) + irq(86) + irq(87) + irq(88) + irq(89) + irq(90) + irq(91) + irq(92) + irq(93) + irq(94) + irq(95) + irq(96) + irq(97) + irq(98) + irq(99) + irq(100) + irq(101) + irq(102) + irq(103) + irq(104) + irq(105) + irq(106) + irq(107) + irq(108) + irq(109) + irq(110) + irq(111) + irq(112) + irq(113) + irq(114) + irq(115) + irq(116) + irq(117) + irq(118) + irq(119) + irq(120) + irq(121) + irq(122) + irq(123) + irq(124) + irq(125) + irq(126) + irq(127) + irq(128) + irq(129) + irq(130) + irq(131) + irq(132) + irq(133) + irq(134) + irq(135) + irq(136) + irq(137) + irq(138) + irq(139) + irq(140) + irq(141) + irq(142) + irq(143) + irq(144) + irq(145) + irq(146) + irq(147) + irq(148) + irq(149) + irq(150) + irq(151) + irq(152) + irq(153) + irq(154) + irq(155) + irq(156) + irq(157) + irq(158) + irq(159) + irq(160) + irq(161) + irq(162) + irq(163) + irq(164) + irq(165) + irq(166) + irq(167) + irq(168) + irq(169) + irq(170) + irq(171) + irq(172) + irq(173) + irq(174) + irq(175) + irq(176) + irq(177) + irq(178) + irq(179) + irq(180) + irq(181) + irq(182) + irq(183) + irq(184) + irq(185) + irq(186) + irq(187) + irq(188) + irq(189) + irq(190) + irq(191) + irq(192) + irq(193) + irq(194) + irq(195) + irq(196) + irq(197) + irq(198) + irq(199) + irq(200) + irq(201) + irq(202) + irq(203) + irq(204) + irq(205) + irq(206) + irq(207) + irq(208) + irq(209) + irq(210) + irq(211) + irq(212) + irq(213) + irq(214) + irq(215) + irq(216) + irq(217) + irq(218) + irq(219) + irq(220) + irq(221) + irq(222) + irq(223) + irq(224) + irq(225) + irq(226) + irq(227) + irq(228) + irq(229) + irq(230) + irq(231) + irq(232) + irq(233) + irq(234) + irq(235) + irq(236) + irq(237) + irq(238) + irq(239) + irq(240) + irq(241) + irq(242) + irq(243) + irq(244) + irq(245) + irq(246) + irq(247) + irq(248) + irq(249) + irq(250) + irq(251) + irq(252) + irq(253) + irq(254) +) + +#if PASS == 1 +#undef PASS +#define PASS 2 +#include "vecttable.c" +#endif |