From 1a328955345754131f06ebbec6896d5a6c10a09c Mon Sep 17 00:00:00 2001 From: Thomas Doerfler Date: Fri, 2 Oct 2009 13:39:12 +0000 Subject: * Makefile.am, irq/irq_config.h, irq/irq_init.c, irq/irq.h: add basic IRQ support (for decrementer) * start/start.S, startup/cmain.c, startup/linkcmds: add support for sdata* sections * startup/bsppanic.c: some cleanup --- c/src/lib/libbsp/powerpc/qemuppc/ChangeLog | 9 +++ c/src/lib/libbsp/powerpc/qemuppc/Makefile.am | 24 +++++-- c/src/lib/libbsp/powerpc/qemuppc/irq/irq-config.h | 78 ++++++++++++++++++++++ c/src/lib/libbsp/powerpc/qemuppc/irq/irq.h | 1 + c/src/lib/libbsp/powerpc/qemuppc/irq/irq_init.c | 63 +++++++++++++++++ c/src/lib/libbsp/powerpc/qemuppc/preinstall.am | 28 ++++++-- c/src/lib/libbsp/powerpc/qemuppc/start/start.S | 9 +++ .../lib/libbsp/powerpc/qemuppc/startup/bsppanic.c | 9 ++- c/src/lib/libbsp/powerpc/qemuppc/startup/cmain.c | 8 ++- c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds | 42 ++++++++++-- 10 files changed, 251 insertions(+), 20 deletions(-) create mode 100644 c/src/lib/libbsp/powerpc/qemuppc/irq/irq-config.h create mode 100644 c/src/lib/libbsp/powerpc/qemuppc/irq/irq_init.c (limited to 'c') diff --git a/c/src/lib/libbsp/powerpc/qemuppc/ChangeLog b/c/src/lib/libbsp/powerpc/qemuppc/ChangeLog index b7b03c0a39..027411455c 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/ChangeLog +++ b/c/src/lib/libbsp/powerpc/qemuppc/ChangeLog @@ -1,3 +1,12 @@ +2009-10-02 Thomas Doerfler + * Makefile.am, irq/irq_config.h, irq/irq_init.c, irq/irq.h: + add basic IRQ support (for decrementer) + + * start/start.S, startup/cmain.c, startup/linkcmds: add support + for sdata* sections + + * startup/bsppanic.c: some cleanup + 2009-09-30 Joel Sherrill * include/bsp.h: BSP does not have much memory. Limited to BIOS space. diff --git a/c/src/lib/libbsp/powerpc/qemuppc/Makefile.am b/c/src/lib/libbsp/powerpc/qemuppc/Makefile.am index 15f0097cc5..4bb0496fc6 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/Makefile.am +++ b/c/src/lib/libbsp/powerpc/qemuppc/Makefile.am @@ -13,7 +13,6 @@ dist_project_lib_DATA = bsp_specs include_HEADERS = include/bsp.h include_HEADERS += ../../shared/include/tm27.h -include_bsp_HEADERS = irq/irq.h nodist_include_HEADERS = include/bspopts.h nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h @@ -31,21 +30,38 @@ project_lib_DATA += rtems_crti.$(OBJEXT) dist_project_lib_DATA += startup/linkcmds +# startup startup_SOURCES = ../../shared/bspclean.c ../../shared/bsplibc.c \ ../../shared/bsppredriverhook.c ../../shared/bsppretaskinghook.c \ ../../shared/bspgetworkarea.c ../../shared/bsppost.c \ - ../../shared/bspstart.c ../../shared/bootcard.c ../../shared/sbrk.c \ + ../../shared/bootcard.c ../../shared/sbrk.c \ ../../shared/gnatinstallhandler.c \ - startup/cmain.c startup/bsppanic.c + startup/cmain.c startup/bspstart.c startup/bsppanic.c +# pclock clock_SOURCES = ../../shared/clock_driver_simidle.c +# console console_SOURCES = ../../shared/console-polled.c console/console-io.c +#timer timer_SOURCES = ../../shared/timerstub.c +# irq +include_bsp_HEADERS = irq/irq.h \ + ../../shared/include/irq-generic.h \ + irq/irq-config.h + +irq_SOURCES = irq/irq_init.c \ + ../../shared/src/irq-generic.c \ + ../../shared/src/irq-legacy.c + noinst_LIBRARIES += libbsp.a libbsp_a_SOURCES = $(startup_SOURCES) $(clock_SOURCES) $(console_SOURCES) \ - $(timer_SOURCES) + $(timer_SOURCES) $(irq_SOURCES) # ../../../libcpu/@RTEMS_CPU@/mpc6xx/clock.rel +include_bsp_HEADERS += ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/vectors.h \ + ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/irq_supp.h \ + ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/ppc_exc_bspsupp.h + libbsp_a_LIBADD = ../../../libcpu/@RTEMS_CPU@/shared/cpuIdent.rel \ ../../../libcpu/@RTEMS_CPU@/shared/stack.rel \ diff --git a/c/src/lib/libbsp/powerpc/qemuppc/irq/irq-config.h b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq-config.h new file mode 100644 index 0000000000..a7b8bac1e7 --- /dev/null +++ b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq-config.h @@ -0,0 +1,78 @@ +/** + * @file + * + * @ingroup bsp_interrupt + * + * @brief BSP interrupt support configuration. + */ + +/* + * Copyright (c) 2008 + * Embedded Brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * rtems@embedded-brains.de + * + * The license and distribution terms for this file may be found in the file + * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE. + */ + +#ifndef LIBBSP_POWERPC_QEMUPPC_IRQ_CONFIG_H +#define LIBBSP_POWERPC_QEMUPPC_IRQ_CONFIG_H + +#include + +#include + +/** + * @addtogroup bsp_interrupt + * + * @{ + */ + +/** + * @brief Minimum vector number. + */ +#define BSP_INTERRUPT_VECTOR_MIN BSP_LOWEST_OFFSET + +/** + * @brief Maximum vector number. + */ +#define BSP_INTERRUPT_VECTOR_MAX BSP_MAX_OFFSET + +/** + * @brief Enables the index table. + * + * If you enable the index table, you have to define a size for the handler + * table (@ref BSP_INTERRUPT_HANDLER_TABLE_SIZE) and must provide an integer + * type capable to index the complete handler table (@ref + * bsp_interrupt_handler_index_type). + */ +#undef BSP_INTERRUPT_USE_INDEX_TABLE + +/** + * @brief Disables usage of the heap. + * + * If you define this, you have to define @ref BSP_INTERRUPT_USE_INDEX_TABLE as + * well. + */ +#undef BSP_INTERRUPT_NO_HEAP_USAGE + +#ifdef BSP_INTERRUPT_USE_INDEX_TABLE + +/** + * @brief Size of the handler table. + */ +#define BSP_INTERRUPT_HANDLER_TABLE_SIZE 63 + +/** + * @brief Integer type capable to index the complete handler table. + */ +typedef uint8_t bsp_interrupt_handler_index_type; + +#endif /* BSP_INTERRUPT_USE_INDEX_TABLE */ + +/** @} */ + +#endif /* LIBBSP_POWERPC_QEMUPPC_IRQ_CONFIG_H */ diff --git a/c/src/lib/libbsp/powerpc/qemuppc/irq/irq.h b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq.h index b0cb104528..9325d8a339 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/irq/irq.h +++ b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq.h @@ -36,6 +36,7 @@ * PCI IRQ handlers related definitions * CAUTION : BSP_PCI_IRQ_LOWEST_OFFSET should be equal to OPENPIC_VEC_SOURCE */ +/* FIXME: do we need PCI interrrupts here ? */ #define BSP_PCI_IRQ_NUMBER (16) #define BSP_PCI_IRQ_LOWEST_OFFSET (0) #define BSP_PCI_IRQ_MAX_OFFSET (BSP_PCI_IRQ_LOWEST_OFFSET + BSP_PCI_IRQ_NUMBER - 1) diff --git a/c/src/lib/libbsp/powerpc/qemuppc/irq/irq_init.c b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq_init.c new file mode 100644 index 0000000000..d1cc1e0520 --- /dev/null +++ b/c/src/lib/libbsp/powerpc/qemuppc/irq/irq_init.c @@ -0,0 +1,63 @@ +/*===============================================================*\ +| Project: RTEMS generic MPC83xx BSP | ++-----------------------------------------------------------------+ +| Copyright (c) 2007 | +| Embedded Brains GmbH | +| Obere Lagerstr. 30 | +| D-82178 Puchheim | +| Germany | +| rtems@embedded-brains.de | ++-----------------------------------------------------------------+ +| The license and distribution terms for this file may be | +| found in the file LICENSE in this distribution or at | +| | +| http://www.rtems.com/license/LICENSE. | +| | ++-----------------------------------------------------------------+ +| this file integrates the IPIC irq controller | +\*===============================================================*/ + +#include + +#include +#include + +#include +#include +#include +#include + +int qemuppc_exception_handler( BSP_Exception_frame *frame, unsigned exception_number) +{ + BSP_panic("Unexpected interrupt occured"); + return 0; +} + +/* + * functions to enable/disable a source at the ipic + */ +rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number irqnum) +{ + /* FIXME: do something */ + return RTEMS_SUCCESSFUL; +} + +rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number irqnum) +{ + /* FIXME: do something */ + return RTEMS_SUCCESSFUL; +} + +rtems_status_code bsp_interrupt_facility_initialize(void) +{ + /* Install exception handler */ + if (ppc_exc_set_handler( ASM_EXT_VECTOR, qemuppc_exception_handler)) { + return RTEMS_IO_ERROR; + } + +} + +void bsp_interrupt_handler_default( rtems_vector_number vector) +{ + printk( "Spurious interrupt: 0x%08x\n", vector); +} diff --git a/c/src/lib/libbsp/powerpc/qemuppc/preinstall.am b/c/src/lib/libbsp/powerpc/qemuppc/preinstall.am index 1ac6e03fed..1216527715 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/preinstall.am +++ b/c/src/lib/libbsp/powerpc/qemuppc/preinstall.am @@ -45,10 +45,6 @@ $(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirs $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h -$(PROJECT_INCLUDE)/bsp/irq.h: irq/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h - $(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h @@ -73,3 +69,27 @@ $(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds +$(PROJECT_INCLUDE)/bsp/irq.h: irq/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h + +$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h + +$(PROJECT_INCLUDE)/bsp/irq-config.h: irq/irq-config.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-config.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-config.h + +$(PROJECT_INCLUDE)/bsp/vectors.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/vectors.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/vectors.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/vectors.h + +$(PROJECT_INCLUDE)/bsp/irq_supp.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/irq_supp.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq_supp.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq_supp.h + +$(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/ppc_exc_bspsupp.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h + diff --git a/c/src/lib/libbsp/powerpc/qemuppc/start/start.S b/c/src/lib/libbsp/powerpc/qemuppc/start/start.S index 90fdf1e5fa..e9946c4df4 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/start/start.S +++ b/c/src/lib/libbsp/powerpc/qemuppc/start/start.S @@ -7,6 +7,15 @@ _start: ori %r1,%r1,_stack@l li %r3,8192 mtmsr %r3 + + /* Read-only small data */ + lis %r2, _SDA2_BASE_@h + ori %r2, %r2,_SDA2_BASE_@l + + /* Read-write small data */ + lis %r13, _SDA_BASE_@h + ori %r13, %r13,_SDA_BASE_@l + bl cmain .size _start, . - _start diff --git a/c/src/lib/libbsp/powerpc/qemuppc/startup/bsppanic.c b/c/src/lib/libbsp/powerpc/qemuppc/startup/bsppanic.c index ec0abde1c0..4a9827f6e4 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/startup/bsppanic.c +++ b/c/src/lib/libbsp/powerpc/qemuppc/startup/bsppanic.c @@ -1,11 +1,14 @@ +#include +#include + void BSP_panic(char *s) { -/* printk("%s PANIC %s\n",_RTEMS_version, s); - rebootQuestion(); -*/ + while(1){}; } void _BSP_Fatal_error(unsigned int v) { + printk("%s PANIC ERROR %x\n",_RTEMS_version, v); + while(1){}; } diff --git a/c/src/lib/libbsp/powerpc/qemuppc/startup/cmain.c b/c/src/lib/libbsp/powerpc/qemuppc/startup/cmain.c index b470028eff..961d3823a2 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/startup/cmain.c +++ b/c/src/lib/libbsp/powerpc/qemuppc/startup/cmain.c @@ -29,6 +29,7 @@ __bzero (unsigned char *d, int len) extern unsigned char __sdata2_load[], __sdata2_start[], __sdata2_end[]; extern unsigned char __data_load[], __data_start[], __data_end[]; +extern unsigned char __sdata_load[], __sdata_start[], __sdata_end[]; extern unsigned char __sbss2_start[], __sbss2_end[]; extern unsigned char __sbss_start[], __sbss_end[]; extern unsigned char __bss_start[], __bss_end[]; @@ -38,13 +39,16 @@ extern void boot_card(void *); void cmain (void) { - printk( "hello #1\n"); + /* + * init variable sections + */ __memcpy (__sdata2_start, __sdata2_load, __sdata2_end - __sdata2_start); + __memcpy (__sdata_start, __sdata_load, __sdata_end - __sdata_start); __memcpy (__data_start, __data_load, __data_end - __data_start); __bzero (__sbss2_start, __sbss2_end - __sbss2_start); __bzero (__sbss_start, __sbss_end - __sbss_start); __bzero (__bss_start, __bss_end - __bss_start); - printk( "hello #2\n"); + printk( "hello #\n"); boot_card(0); printk( "end of BSP\n"); __outb (0x92, 0x01); diff --git a/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds b/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds index 8a5007615c..6787e3f1a3 100644 --- a/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds +++ b/c/src/lib/libbsp/powerpc/qemuppc/startup/linkcmds @@ -14,6 +14,8 @@ RamBase = DEFINED(RamBase) ? RamBase : 0x0; RamSize = DEFINED(RamSize) ? RamSize : 4M; HeapSize = DEFINED(HeapSize) ? HeapSize : 0; +bsp_section_align = 32; + SECTIONS { /* Read-only sections, merged into text segment: */ @@ -43,6 +45,7 @@ SECTIONS /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) + . = ALIGN (bsp_section_align); __text_end = .; } >ROM =0 .init : @@ -77,7 +80,7 @@ SECTIONS { *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) - . = ALIGN(4); + . = ALIGN (bsp_section_align); __rodata_end = .; } >ROM =0 @@ -88,14 +91,14 @@ SECTIONS __sdata2_start = .; PROVIDE (_SDA2_BASE_ = 32768); *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) - . = ALIGN(4); + . = ALIGN (bsp_section_align); __sdata2_end = .; } >RAM .sbss2 : { __sbss2_start = .; *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) - . = ALIGN(4); + . = ALIGN (bsp_section_align); __sbss2_end = .; } >RAM __data_load = __sdata2_load + SIZEOF (.sdata2); @@ -106,20 +109,38 @@ SECTIONS KEEP (*(.gnu.linkonce.d.*personality*)) SORT(CONSTRUCTORS) *(.data1) - PROVIDE (_SDA_BASE_ = 32768); - *(.sdata .sdata.* .gnu.linkonce.s.*) - . = ALIGN(4); + . = ALIGN (bsp_section_align); __data_end = .; } >RAM + __sdata_load = __data_load + SIZEOF (.data); + .sdata : AT(__sdata_load) { + __sdata_start = .; + PROVIDE (_SDA_BASE_ = 32768); + *(.sdata .sdata.* .gnu.linkonce.s.*) + + . = ALIGN (bsp_section_align); + + _edata = .; + __sdata_end = .; + PROVIDE (edata = .); + + /* + * BSP: End of data section + */ + bsp_section_data_end = .; + } > RAM + PROVIDE (__EXCEPT_START__ = .); .gcc_except_table : { *(.gcc_except_table*) } >RAM PROVIDE (__EXCEPT_END__ = .); + .sbss : { __sbss_start = .; *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) + . = ALIGN (bsp_section_align); __sbss_end = .; } >RAM .bss : @@ -128,7 +149,7 @@ SECTIONS *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) - . = ALIGN(4); + . = ALIGN (bsp_section_align); __bss_end = .; /* Allocate the main stack area. Make sure it starts 16bytes aligned @@ -137,6 +158,13 @@ SECTIONS _end = _stack; } >RAM + /* + * BSP: Interrupt stack + */ + bsp_interrupt_stack_start = _end; + bsp_interrupt_stack_end = bsp_interrupt_stack_start + 32k; + bsp_interrupt_stack_size = bsp_interrupt_stack_end - bsp_interrupt_stack_start; + WorkAreaBase = .; . = RamBase + RamSize; -- cgit v1.2.3