From 9d507d4d4b1a39677da09aebd8b1e7fb4e348aea Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 4 Jan 2007 18:05:56 +0000 Subject: [PATCH] 2007-01-04 Kazu Hirata Merge from newlib-csl-20060320-branch: 2006-12-22 Nathan Sidwell libgloss/ * m68k/Makefile.in (CF_ISRS): Remove now shared routines. * m68k/cf-crt0.S (__reset): Define here. * m68k/cf-isrs.c: Share some ISRS. Add aliases for each IRQ slot. * m68k/cf-isv.S: Move to .interrupt_vector section. Make each slot a unique routine. * m68k/cf.sc: Adjust for .interrupt_vector section. libgloss/ * m68k/Makefile.in (m5273c3): Rename to ... (m5272c3): ... here to fix typo. (m5249c3): New. (CF_BOARDS): Add it. --- libgloss/ChangeLog | 19 ++++ libgloss/m68k/Makefile.in | 17 ++-- libgloss/m68k/cf-crt0.S | 12 +++ libgloss/m68k/cf-isrs.c | 192 ++++++++++++++++---------------------- libgloss/m68k/cf-isv.S | 127 +++++++++++++++++-------- libgloss/m68k/cf.sc | 3 +- 6 files changed, 209 insertions(+), 161 deletions(-) diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index 04245047a..60af1edab 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,22 @@ +2007-01-04 Kazu Hirata + + Merge from newlib-csl-20060320-branch: + 2006-12-22 Nathan Sidwell + + libgloss/ + * m68k/Makefile.in (CF_ISRS): Remove now shared routines. + * m68k/cf-crt0.S (__reset): Define here. + * m68k/cf-isrs.c: Share some ISRS. Add aliases for each IRQ slot. + * m68k/cf-isv.S: Move to .interrupt_vector section. Make each + slot a unique routine. + * m68k/cf.sc: Adjust for .interrupt_vector section. + + libgloss/ + * m68k/Makefile.in (m5273c3): Rename to ... + (m5272c3): ... here to fix typo. + (m5249c3): New. + (CF_BOARDS): Add it. + 2006-01-03 Kazu Hirata * arm/Makefile (RDPMON_OBJS): Add _exit.o and _kill.o. diff --git a/libgloss/m68k/Makefile.in b/libgloss/m68k/Makefile.in index 175a67106..f1ca1c492 100644 --- a/libgloss/m68k/Makefile.in +++ b/libgloss/m68k/Makefile.in @@ -123,28 +123,25 @@ CF_CRT0S= cf-hosted-crt0.o cf-unhosted-crt0.o CF_BSP= libcf.a CF_OBJS= cf-isv.o cf-crt1.o cf-hosted.o getpid.o kill.o cf-sbrk.o \ cf-exit.o $(patsubst %,cf-%.o,${CF_ISRS}) -CF_ISRS= other_interrupt reset access_error address_error \ +CF_ISRS= other_interrupt access_error address_error \ illegal_instruction divide_by_zero privilege_violation \ - trace unimplemented_line_a_opcode unimplemented_line_f_opcode \ - non_pc_breakpoint_debug_interrupt pc_breakpoint_debug_interrupt \ - format_error spurious_interrupt fp_branch_unordered \ - fp_inexact_result fp_divide_by_zero fp_underflow fp_operand_error \ - fp_overflow fp_input_not_a_number fp_input_denormalized_number \ - unsupported_instruction \ - $(addprefix trap,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) + trace unimplemented_opcode breakpoint_debug_interrupt \ + format_error spurious_interrupt fp_interrupt \ + unsupported_instruction trap_interrupt # RAM ROM m5208evb := 1024M 16M 0M 2M m5213evb := 512M 32K 0M 256K m52235evb := 512M 32K 0M 256K m5235evb := 0M 16M 0xFFE00000 2M -m5273c3 := 0M 4M 0xFFE00000 2M +m5249c3 := 0M 4M 0xFFE00000 2M +m5272c3 := 0M 4M 0xFFE00000 2M m5275evb := 0M 16M 0xFFE00000 2M m5282evb := 0M 16M 0xFFE00000 2M m5329evb := 1024M 32M 0M 2M m5485evb := 0M 64M 1024M 16M -CF_BOARDS := m5208evb m5213evb m52235evb m5235evb m5272c3 m5275evb \ +CF_BOARDS := m5208evb m5213evb m52235evb m5235evb m5249c3 m5272c3 m5275evb \ m5282evb m5329evb m5485evb CF_RAM_SCRIPTS := $(patsubst %,%-ram.ld,$(CF_BOARDS)) CF_ROM_SCRIPTS := $(patsubst %,%-rom.ld,$(CF_BOARDS)) diff --git a/libgloss/m68k/cf-crt0.S b/libgloss/m68k/cf-crt0.S index 51a6aa700..f86b789c3 100644 --- a/libgloss/m68k/cf-crt0.S +++ b/libgloss/m68k/cf-crt0.S @@ -20,6 +20,17 @@ .extern __heap_end .weak __heap_end .extern __start1 + + /* __reset should cause a HALT in a hosted executable and + fall into __start for an unhosted executable. The user is + free to override this with their own declaration. */ + .globl __reset + .weak __reset +__reset: +#if HOSTED + HALT +#endif + .globl __start __start: /* Initialize stack */ @@ -42,3 +53,4 @@ __start: move.l d1,sp@- move.l fp,sp@- /* Dummy return address */ jmp __start1 + diff --git a/libgloss/m68k/cf-isrs.c b/libgloss/m68k/cf-isrs.c index e9846e237..34dcf2caa 100644 --- a/libgloss/m68k/cf-isrs.c +++ b/libgloss/m68k/cf-isrs.c @@ -33,157 +33,131 @@ void __attribute__((interrupt_handler)) NAME (void) \ struct eat_trailing_semicolon #if defined (L_other_interrupt) -ISR_DEFINE (__other_interrupt); -#endif - -#if defined (L_reset) -ISR_DEFINE (__reset); +static ISR_DEFINE (__other_interrupt); +#define ALIAS __other_interrupt +#define PREFIX interrupt +#define ALIASES A(6) A(7) \ + A(15) A(16) A(17) A(18) A(19) A(20) A(21) A(22) A(23) \ + A(25) A(26) A(27) A(28) A(29) A(30) A(31) \ + A(56) A(57) A(58) A(59) A(60) A(62) A(63) \ + A(64) A(65) A(66) A(67) A(68) A(69) A(70) A(71) \ + A(72) A(73) A(74) A(75) A(76) A(77) A(78) A(79) \ + A(80) A(81) A(82) A(83) A(84) A(85) A(86) A(87) \ + A(88) A(89) A(90) A(91) A(92) A(93) A(94) A(95) \ + A(96) A(97) A(98) A(99) A(100) A(101) A(102) A(103) \ + A(104) A(105) A(106) A(107) A(108) A(109) A(110) A(111) \ + A(112) A(113) A(114) A(115) A(116) A(117) A(118) A(119) \ + A(120) A(121) A(122) A(123) A(124) A(125) A(126) A(127) \ + A(128) A(129) A(130) A(131) A(132) A(133) A(134) A(135) \ + A(136) A(137) A(138) A(139) A(140) A(141) A(142) A(143) \ + A(144) A(145) A(146) A(147) A(148) A(149) A(150) A(151) \ + A(152) A(153) A(154) A(155) A(156) A(157) A(158) A(159) \ + A(160) A(161) A(162) A(163) A(164) A(165) A(166) A(167) \ + A(168) A(169) A(170) A(171) A(172) A(173) A(174) A(175) \ + A(176) A(177) A(178) A(179) A(180) A(181) A(182) A(183) \ + A(184) A(185) A(186) A(187) A(188) A(189) A(190) A(191) \ + A(192) A(193) A(194) A(195) A(196) A(197) A(198) A(199) \ + A(200) A(201) A(202) A(203) A(204) A(205) A(206) A(207) \ + A(208) A(209) A(210) A(211) A(212) A(213) A(214) A(215) \ + A(216) A(217) A(218) A(219) A(220) A(221) A(222) A(223) \ + A(224) A(225) A(226) A(227) A(228) A(229) A(230) A(231) \ + A(232) A(233) A(234) A(235) A(236) A(237) A(238) A(239) \ + A(240) A(241) A(242) A(243) A(244) A(245) A(246) A(247) \ + A(248) A(249) A(250) A(251) A(252) A(253) A(254) A(255) #endif #if defined (L_access_error) ISR_DEFINE (__access_error); +#define DEFINED __access_error #endif #if defined (L_address_error) ISR_DEFINE (__address_error); +#define DEFINED __address_error #endif #if defined (L_illegal_instruction) ISR_DEFINE (__illegal_instruction); +#define DEFINED __illegal_instruction #endif #if defined (L_divide_by_zero) ISR_DEFINE (__divide_by_zero); +#define DEFINED __divide_by_zero #endif #if defined (L_privilege_violation) ISR_DEFINE (__privilege_violation); +#define DEFINED __privilege_violation #endif #if defined (L_trace) ISR_DEFINE (__trace); +#define DEFINED __trace #endif -#if defined (L_unimplemented_line_a_opcode) -ISR_DEFINE (__unimplemented_line_a_opcode); +#if defined (L_unimplemented_opcode) +static ISR_DEFINE (__unimplemented_opcode); +#define ALIAS __unimplemented_opcode +#define PREFIX unimplemented_ +#define SUFFIX _opcode +#define ALIASES A(line_a) A(line_f) #endif -#if defined (L_unimplemented_line_f_opcode) -ISR_DEFINE (__unimplemented_line_f_opcode); -#endif - -#if defined (L_non_pc_breakpoint_debug_interrupt) -ISR_DEFINE (__non_pc_breakpoint_debug_interrupt); -#endif - -#if defined (L_pc_breakpoint_debug_interrupt) -ISR_DEFINE (__pc_breakpoint_debug_interrupt); +#if defined (L_breakpoint_debug_interrupt) +static ISR_DEFINE (__breakpoint_debug_interrupt); +#define ALIAS __breakpoint_debug_interrupt +#define SUFFIX _breakpoint_debug_interrupt +#define ALIASES A(non_pc) A(pc) #endif #if defined (L_format_error) ISR_DEFINE (__format_error); +#define DEFINED __format_error #endif #if defined (L_spurious_interrupt) ISR_DEFINE (__spurious_interrupt); +#define DEFINED __spurious_interrupt #endif -#if defined (L_trap0) -ISR_DEFINE (__trap0); +#if defined (L_trap_interrupt) +static ISR_DEFINE (__trap_interrupt); +#define ALIAS __trap_interrupt +#define PREFIX trap +#define ALIASES A(0) A(1) A(2) A(3) A(4) A(5) A(6) A(7) \ + A(8) A(9) A(10) A(11) A(12) A(13) A(14) A(15) #endif -#if defined (L_trap1) -ISR_DEFINE (__trap1); -#endif - -#if defined (L_trap2) -ISR_DEFINE (__trap2); -#endif - -#if defined (L_trap3) -ISR_DEFINE (__trap3); -#endif - -#if defined (L_trap4) -ISR_DEFINE (__trap4); -#endif - -#if defined (L_trap5) -ISR_DEFINE (__trap5); -#endif - -#if defined (L_trap6) -ISR_DEFINE (__trap6); -#endif - -#if defined (L_trap7) -ISR_DEFINE (__trap7); -#endif - -#if defined (L_trap8) -ISR_DEFINE (__trap8); -#endif - -#if defined (L_trap9) -ISR_DEFINE (__trap9); -#endif - -#if defined (L_trap10) -ISR_DEFINE (__trap10); -#endif - -#if defined (L_trap11) -ISR_DEFINE (__trap11); -#endif - -#if defined (L_trap12) -ISR_DEFINE (__trap12); -#endif - -#if defined (L_trap13) -ISR_DEFINE (__trap13); -#endif - -#if defined (L_trap14) -ISR_DEFINE (__trap14); -#endif - -#if defined (L_trap15) -ISR_DEFINE (__trap15); -#endif - -#if defined (L_fp_branch_unordered) -ISR_DEFINE (__fp_branch_unordered); -#endif - -#if defined (L_fp_inexact_result) -ISR_DEFINE (__fp_inexact_result); -#endif - -#if defined (L_fp_divide_by_zero) -ISR_DEFINE (__fp_divide_by_zero); -#endif - -#if defined (L_fp_underflow) -ISR_DEFINE (__fp_underflow); -#endif - -#if defined (L_fp_operand_error) -ISR_DEFINE (__fp_operand_error); -#endif - -#if defined (L_fp_overflow) -ISR_DEFINE (__fp_overflow); -#endif - -#if defined (L_fp_input_not_a_number) -ISR_DEFINE (__fp_input_not_a_number); -#endif - -#if defined (L_fp_input_denormalized_number) -ISR_DEFINE (__fp_input_denormalized_number); +#if defined (L_fp_interrupt) +static ISR_DEFINE (__fp_interrupt); +#define ALIAS __fp_interrupt +#define PREFIX fp_ +#define ALIASES A(branch_unordered) A(inexact_result) A(divide_by_zero) \ + A(underflow) A(operand_error) A(overflow) A(input_not_a_number) \ + A(input_denormalized_number) #endif #if defined (L_unsupported_instruction) ISR_DEFINE (__unsupported_instruction); +#define DEFINED __unsupported_instruction #endif + +#if defined(ALIAS) +#ifndef PREFIX +#define PREFIX +#endif +#ifndef SUFFIX +#define SUFFIX +#endif +#define STRING_(a) #a +#define STRING(a) STRING_(a) +#define PASTE4_(a,b,c,d) a##b##c##d +#define PASTE4(a,b,c,d) PASTE4_(a,b,c,d) +#define A(N) \ + void __attribute__((weak, alias(STRING(ALIAS)))) PASTE4(__,PREFIX,N,SUFFIX) (void); +ALIASES +#elif !defined(DEFINED) +#error "No interrupt routine requested" +#endif + diff --git a/libgloss/m68k/cf-isv.S b/libgloss/m68k/cf-isv.S index 392f8da3e..e8b912a3b 100644 --- a/libgloss/m68k/cf-isv.S +++ b/libgloss/m68k/cf-isv.S @@ -13,63 +13,108 @@ * they apply. */ - .text + .macro SLOT,n,prefix=,suffix= + .long __\prefix\n\suffix + .endm + + .macro ISR n + SLOT \n,interrupt, + .endm + + .macro TRAP n + SLOT \n,trap, + .endm + + .macro FP n + SLOT \n,fp_, + .endm + + .macro UNIMP_OPCODE n + SLOT \n,unimplemented_,_opcode + .endm + + .macro BREAKPOINT_DEBUG n + SLOT \n,,_breakpoint_debug_interrupt + .endm + + .section .interrupt_vector,"a" .globl __interrupt_vector __interrupt_vector: + .long __stack /* 0 */ .long __reset /* 1 */ .long __access_error /* 2 */ .long __address_error /* 3 */ .long __illegal_instruction /* 4 */ .long __divide_by_zero /* 5 */ - .long __other_interrupt /* 6 */ - .long __other_interrupt /* 7 */ + ISR 6 + ISR 7 .long __privilege_violation /* 8 */ .long __trace /* 9 */ - .long __unimplemented_line_a_opcode /* 10 */ - .long __unimplemented_line_f_opcode /* 11 */ - .long __non_pc_breakpoint_debug_interrupt /* 12 */ - .long __pc_breakpoint_debug_interrupt /* 13 */ + UNIMP_OPCODE line_a /* 10 */ + UNIMP_OPCODE line_f /* 11 */ + BREAKPOINT_DEBUG non_pc /* 12 */ + BREAKPOINT_DEBUG pc /* 13 */ .long __format_error /* 14 */ - .rept 24 - 15 - .long __other_interrupt /* [15,24) */ + .irp N,15,16,17,18,19,20,21,22,23 + ISR \N /* [15,24) */ .endr .long __spurious_interrupt /* 24 */ - .rept 32 - 25 - .long __other_interrupt /* [25,32) */ + .irp N,25,26,27,28,29,30,31 + ISR \N /* [25,32) */ .endr - .long __trap0 /* 32 */ - .long __trap1 /* 33 */ - .long __trap2 /* 34 */ - .long __trap3 /* 35 */ - .long __trap4 /* 36 */ - .long __trap5 /* 37 */ - .long __trap6 /* 38 */ - .long __trap7 /* 39 */ - .long __trap8 /* 40 */ - .long __trap9 /* 41 */ - .long __trap10 /* 42 */ - .long __trap11 /* 43 */ - .long __trap12 /* 44 */ - .long __trap13 /* 45 */ - .long __trap14 /* 46 */ - .long __trap15 /* 47 */ - .long __fp_branch_unordered /* 48 */ - .long __fp_inexact_result /* 49 */ - .long __fp_divide_by_zero /* 50 */ - .long __fp_underflow /* 51 */ - .long __fp_operand_error /* 52 */ - .long __fp_overflow /* 53 */ - .long __fp_input_not_a_number /* 54 */ - .long __fp_input_denormalized_number /* 55 */ - .rept 61 - 56 - .long __other_interrupt /* [56,61) */ + .irp N,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + TRAP \N /* [32,48) */ + .endr + FP branch_unordered /* 48 */ + FP inexact_result /* 49 */ + FP divide_by_zero /* 50 */ + FP underflow /* 51 */ + FP operand_error /* 52 */ + FP overflow /* 53 */ + FP input_not_a_number /* 54 */ + FP input_denormalized_number /* 55 */ + .irp N,56,57,58,59,60 + ISR \N /* [56,61) */ .endr .long __unsupported_instruction /* 61 */ - .rept 64 - 62 - .long __other_interrupt /* [62,64) */ + .irp N,62,63 + ISR \N /* [62,64) */ .endr - .rept 256-64 - .long __other_interrupt /* [64,256) */ + .irp N,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 + ISR \N /* [64,80) */ + .endr + .irp N,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95 + ISR \N /* [80,96) */ + .endr + .irp N,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 + ISR \N /* [96,112) */ + .endr + .irp N,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 + ISR \N /* [112,128) */ + .endr + .irp N,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143 + ISR \N /* [128,144) */ + .endr + .irp N,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 + ISR \N /* [144,160) */ + .endr + .irp N,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175 + ISR \N /* [160,176) */ + .endr + .irp N,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191 + ISR \N /* [176,192) */ + .endr + .irp N,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207 + ISR \N /* [192,208) */ + .endr + .irp N,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 + ISR \N /* [208,224) */ + .endr + .irp N,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 + ISR \N /* [224,240) */ + .endr + .irp N,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 + ISR \N /* [240,256) */ .endr diff --git a/libgloss/m68k/cf.sc b/libgloss/m68k/cf.sc index 097dc1fe0..5a3563af2 100644 --- a/libgloss/m68k/cf.sc +++ b/libgloss/m68k/cf.sc @@ -29,7 +29,8 @@ SECTIONS .text : { CREATE_OBJECT_SYMBOLS - KEEP (*cf-isv.o(.text)) + *(.interrupt_vector) + cf-${IO}-crt0.o(.text) *(.text .text.*) *(.gnu.linkonce.t.*)