Changeset 4f3e4f33 in rtems


Ignore:
Timestamp:
Feb 20, 2003, 9:32:07 PM (18 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
20b349f
Parents:
d19443c7
Message:

2003-02-20 Till Straumann <strauman@…>

PR 349/bsps

  • console/console.c, console/uart.c, console/uart.h: implement IOCTLs for the serial (UART) console to install/retrieve a BREAK-IRQ callback. The callback routine (if installed) is invoked from the UART ISR when a BREAK interrupt is detected. This can be used e.g. to enforce a "hotkey" reboot a la vxWorks Ctrl-X (although we use the serial line break condition) NOTE: The callback runs in ISR context.
Location:
c/src/lib/libbsp/powerpc/shared
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/powerpc/shared/ChangeLog

    rd19443c7 r4f3e4f33  
     12003-02-20      Till Straumann <strauman@slac.stanford.edu>
     2
     3        PR 349/bsps
     4        * console/console.c, console/uart.c, console/uart.h: implement
     5        IOCTLs for the serial (UART) console to install/retrieve a BREAK-IRQ
     6        callback.  The callback routine (if installed) is invoked from the
     7        UART ISR when a BREAK interrupt is detected.  This can be used
     8        e.g. to enforce a "hotkey" reboot a la vxWorks Ctrl-X (although we
     9        use the serial line break condition) NOTE: The callback runs in
     10        ISR context. 
     11
    1122003-01-20      Joel Sherrill <joel@OARcorp.com>
    213
  • c/src/lib/libbsp/powerpc/shared/Makefile.am

    rd19443c7 r4f3e4f33  
    66if need_shared
    77SUBDIRS = clock console include pci residual openpic irq vectors start \
    8     startup motorola bootloader
     8    startup motorola bootloader vme
    99endif
    1010
  • c/src/lib/libbsp/powerpc/shared/console/console.c

    rd19443c7 r4f3e4f33  
    258258 */
    259259rtems_device_driver
    260 console_control(rtems_device_major_number major,
    261                 rtems_device_minor_number minor,
    262                 void                      * arg
     260console_control(rtems_device_major_number       major,
     261                rtems_device_minor_number                       minor,
     262                void                                            *arg
    263263)
    264264{
     265/* does the BSP support break callbacks ? */
     266#if defined(BIOCSETBREAKCB) && defined(BIOCGETBREAKCB)
     267rtems_libio_ioctl_args_t        *ioa=arg;
     268        switch (ioa->command) {
     269                        case BIOCSETBREAKCB:
     270                                return BSP_uart_set_break_cb(minor, ioa);
     271                        case BIOCGETBREAKCB:
     272                                return BSP_uart_get_break_cb(minor, ioa);
     273                       
     274                        default:
     275                                break;
     276        }
     277#endif
    265278  return rtems_termios_ioctl (arg);
    266279}
  • c/src/lib/libbsp/powerpc/shared/console/polled_io.c

    rd19443c7 r4f3e4f33  
    889889 * But we need 64 bit values !
    890890 */
    891 int vsprintf(char *buf, const char *fmt, va_list args);
     891int k_vsprintf(char *buf, const char *fmt, va_list args);
    892892
    893893int printk(const char *fmt, ...) {
     
    898898       
    899899        va_start(args, fmt);
    900         i = vsprintf(buf, fmt, args);
     900        i = k_vsprintf(buf, fmt, args);
    901901        va_end(args);
    902902        puts(buf);
     
    989989}
    990990
    991 int vsprintf(char *buf, const char *fmt, va_list args)
     991int k_vsprintf(char *buf, const char *fmt, va_list args)
    992992{
    993993        int len;
  • c/src/lib/libbsp/powerpc/shared/console/reboot.c

    rd19443c7 r4f3e4f33  
    22
    33#include "console.inl"
     4#include <rtems/bspIo.h>
     5#include <libcpu/stackTrace.h>
    46
    57/*-------------------------------------------------------------------------+
     
    1214void rtemsReboot(void)
    1315{
     16  printk("Printing a stack trace for your convenience :-)\n");
     17  CPU_print_stack();
    1418  /* shutdown and reboot */
    1519  kbd_outb(0x4, 0xFE);      /* use keyboard controler to do the job... */
  • c/src/lib/libbsp/powerpc/shared/console/uart.c

    rd19443c7 r4f3e4f33  
    1212#include <bsp/uart.h>
    1313#include <rtems/libio.h>
     14#include <rtems/bspIo.h>
    1415#include <assert.h>
    1516
     
    2021struct uart_data
    2122{
    22   unsigned long ioBase;
    23   int hwFlow;
    24   int baud;
     23  unsigned long                 ioBase;
     24  int                                   hwFlow;
     25  int                                   baud;
     26  BSP_UartBreakCbRec    breakCallback;
    2527};
    2628
     
    7577}
    7678
     79#define UARTDEBUG
    7780#ifdef UARTDEBUG
    7881    static void
    79 uartError(int uart)
     82uartError(int uart, void *termiosPrivate)
    8083{
    8184  unsigned char uartStatus, dummy;
     85  BSP_UartBreakCbProc           h;
    8286
    8387  uartStatus = uread(uart, LSR);
     
    9094  if (uartStatus & FE)
    9195    printk("********* Framing Error  **********\n");
    92   if (uartStatus & BI)
    93     printk("********* Parity Error   **********\n");
     96  if (uartStatus & BI) {
     97    printk("********* BREAK INTERRUPT *********\n");
     98        if ((h=uart_data[uart].breakCallback.handler))
     99                h(uart,
     100                  (dummy<<8)|uartStatus,
     101                  termiosPrivate,
     102                  uart_data[uart].breakCallback.private);
     103
     104  }
    94105  if (uartStatus & ERFIFO)
    95106    printk("********* Error receive Fifo **********\n");
     
    97108}
    98109#else
    99 inline void uartError(int uart)
    100 {
    101   unsigned char uartStatus;
     110inline void uartError(int uart, void *termiosPrivate)
     111{
     112  unsigned char uartStatus,dummy;
     113  BSP_UartBreakCbProc           h;
    102114 
    103115  uartStatus = uread(uart, LSR);
    104   uartStatus = uread(uart, RBR);
     116  dummy          = uread(uart, RBR);
     117  if ((uartStatus & BI) && (h=uart_data[uart].breakCallback.handler))
     118                h(uart,
     119                  (dummy<<8)|uartStatus,
     120                  termiosPrivate,
     121                  uart_data[uart].breakCallback.private);
    105122}
    106123#endif
     
    645662        case RECEIVER_ERROR:
    646663          /* RX error: eat character */
    647            uartError(uart);
     664           uartError(uart, termios_ttyp_com[uart]);
    648665          break;
    649666        default:
     
    667684}
    668685
     686/* retrieve 'break' handler info */
     687int
     688BSP_uart_get_break_cb(int uart, rtems_libio_ioctl_args_t *arg)
     689{
     690BSP_UartBreakCb cb=arg->buffer;
     691unsigned long flags;
     692        SANITY_CHECK(uart);
     693        rtems_interrupt_disable(flags);
     694                *cb = uart_data[uart].breakCallback;
     695        rtems_interrupt_enable(flags);
     696        arg->ioctl_return=0;
     697        return RTEMS_SUCCESSFUL;
     698}
     699
     700/* install 'break' handler */
     701int
     702BSP_uart_set_break_cb(int uart, rtems_libio_ioctl_args_t *arg)
     703{
     704BSP_UartBreakCb cb=arg->buffer;
     705unsigned long flags;
     706        SANITY_CHECK(uart);
     707        rtems_interrupt_disable(flags);
     708                uart_data[uart].breakCallback = *cb;
     709        rtems_interrupt_enable(flags);
     710        arg->ioctl_return=0;
     711        return RTEMS_SUCCESSFUL;
     712}
  • c/src/lib/libbsp/powerpc/shared/console/uart.h

    rd19443c7 r4f3e4f33  
    1212
    1313#include <bsp/irq.h>
     14
     15#include <sys/ioctl.h>
     16#include <rtems/libio.h>
    1417
    1518void BSP_uart_init(int uart, int baud, int hwFlow);
     
    2932int  BSP_uart_install_isr(int uart, rtems_irq_hdl handler);
    3033int  BSP_uart_remove_isr(int uart, rtems_irq_hdl handler);
     34int  BSP_uart_get_break_cb(int uart, rtems_libio_ioctl_args_t *arg);
     35int  BSP_uart_set_break_cb(int uart, rtems_libio_ioctl_args_t *arg);
    3136
    3237extern unsigned BSP_poll_char_via_serial(void);
     
    3439extern int BSPConsolePort;
    3540extern int BSPBaseBaud;
     41
     42/* Special IOCTLS to install a lowlevel 'BREAK' handler */
     43
     44/* pass a BSP_UartBreakCb pointer to ioctl when retrieving
     45 * or installing break callback
     46 */
     47typedef void (*BSP_UartBreakCbProc)(int                 uartMinor,
     48                                                                        unsigned        uartRBRLSRStatus,
     49                                                                        void            *termiosPrivatePtr,
     50                                                                        void            *private);
     51
     52typedef struct BSP_UartBreakCbRec_ {
     53                BSP_UartBreakCbProc             handler;        /* NOTE NOTE this handler runs in INTERRUPT CONTEXT */
     54                void                                    *private;       /* closure pointer which is passed to the callback  */
     55} BSP_UartBreakCbRec, *BSP_UartBreakCb;
     56
     57#define BIOCGETBREAKCB  _IOR('b',1,sizeof(BSP_UartBreakCbRec))
     58#define BIOCSETBREAKCB  _IOW('b',2,sizeof(BSP_UartBreakCbRec))
     59
    3660/*
    3761 * Command values for BSP_uart_intr_ctrl(),
  • c/src/lib/libbsp/powerpc/shared/irq/irq.c

    rd19443c7 r4f3e4f33  
    1515#include <bsp.h>
    1616#include <bsp/irq.h>
     17#include <bsp/VME.h>
    1718#include <bsp/openpic.h>
    1819#include <rtems/score/thread.h>
     
    8788static void compute_i8259_masks_from_prio ()
    8889{
    89   unsigned int i;
    90   unsigned int j;
     90  int i;
     91  int j;
    9192  /*
    9293   * Always mask at least current interrupt to prevent re-entrance
    9394   */
    94   for (i=BSP_ISA_IRQ_LOWEST_OFFSET; i < BSP_ISA_IRQ_NUMBER; i++) {
     95  for (i=BSP_ISA_IRQ_LOWEST_OFFSET; i < BSP_ISA_IRQ_LOWEST_OFFSET + BSP_ISA_IRQ_NUMBER; i++) {
    9596    * ((unsigned short*) &irq_mask_or_tbl[i]) = (1 << i);
    96     for (j = BSP_ISA_IRQ_LOWEST_OFFSET; j < BSP_ISA_IRQ_NUMBER; j++) {
     97    for (j = BSP_ISA_IRQ_LOWEST_OFFSET; j < BSP_ISA_IRQ_LOWEST_OFFSET + BSP_ISA_IRQ_NUMBER; j++) {
    9798      /*
    9899       * Mask interrupts at i8259 level that have a lower priority
     
    262263    compute_i8259_masks_from_prio ();
    263264
    264     for (i=BSP_ISA_IRQ_LOWEST_OFFSET; i < BSP_ISA_IRQ_NUMBER; i++) {
     265    for (i=BSP_ISA_IRQ_LOWEST_OFFSET; i < BSP_ISA_IRQ_LOWEST_OFFSET + BSP_ISA_IRQ_NUMBER; i++) {
    265266      if (rtems_hdl_tbl[i].hdl != default_rtems_entry.hdl) {
    266267        BSP_irq_enable_at_i8259s (i);
     
    376377  }
    377378  else {
    378 #ifdef BSP_PCI_VME_BRIDGE_DOES_EOI
    379         /* leave it to the VME bridge to do EOI, so
    380          * it can re-enable the openpic while handling
    381          * VME interrupts (-> VME priorities in software)
     379#ifdef BSP_PCI_VME_DRIVER_DOES_EOI
     380        /* leave it to the VME bridge driver to do EOI, so
     381     * it can re-enable the openpic while handling
     382     * VME interrupts (-> VME priorities in software)
    382383         */
    383384        if (BSP_PCI_VME_BRIDGE_IRQ!=irq)
  • c/src/lib/libbsp/powerpc/shared/irq/irq_asm.S

    rd19443c7 r4f3e4f33  
    7474         */
    7575        stw     r0, GPR0_OFFSET(r1)
     76        /* PPC EABI: R2 is reserved (pointer to short data .sdata2) - we won't touch it
     77         * but we still save/restore it, just in case...
     78         */
    7679        stw     r2, GPR2_OFFSET(r1)
    7780        stw     r3, GPR3_OFFSET(r1)
    7881       
    7982        mfsrr0  r0
    80         mfsrr1  r2
     83        mfsrr1  r3
     84       
     85        stw     r0, SRR0_FRAME_OFFSET(r1)
     86        stw     r3, SRR1_FRAME_OFFSET(r1)
     87
    8188        mfmsr   r3
    82        
    83         stw     r0, SRR0_FRAME_OFFSET(r1)
    84         stw     r2, SRR1_FRAME_OFFSET(r1)
    8589        /*
    8690         * Enable data and instruction address translation, exception recovery
     
    138142        addis r15,0, _Thread_Dispatch_disable_level@ha
    139143        /*
    140          * Get current nesting level in R2
    141          */
    142         mfspr   r2, SPRG0
     144         * Get current nesting level in R3
     145         */
     146        mfspr   r3, SPRG0
    143147        /*
    144148         * Check if stack switch is necessary
    145149         */
    146         cmpwi   r2,0
     150        cmpwi   r3,0
    147151        bne     nested
    148152        mfspr   r1, SPRG1
     
    150154nested:
    151155        /*
    152          * Start Incrementing nesting level in R2
    153          */
    154         addi    r2,r2,1
     156         * Start Incrementing nesting level in R3
     157         */
     158        addi    r3,r3,1
    155159        /*
    156160         * Start Incrementing _Thread_Dispatch_disable_level R4 = _Thread_Dispatch_disable_level
     
    160164         * store new nesting level in SPRG0
    161165         */
    162         mtspr   SPRG0, r2
     166        mtspr   SPRG0, r3
    163167       
    164168        addi    r6, r6, 1
     
    184188         * then _Thread_Dispatch_disable_level > 1
    185189         */
    186         mfspr   r2, SPRG0
     190        mfspr   r4, SPRG0
    187191        /*
    188192         * start decrementing _Thread_Dispatch_disable_level
    189193         */
    190194        lwz     r3,_Thread_Dispatch_disable_level@l(r15)
    191         addi    r2, r2, -1      /* Continue decrementing nesting level */
     195        addi    r4, r4, -1      /* Continue decrementing nesting level */
    192196        addi    r3, r3, -1      /* Continue decrementing _Thread_Dispatch_disable_level */
    193         mtspr   SPRG0, r2       /* End decrementing nesting level */
     197        mtspr   SPRG0, r4       /* End decrementing nesting level */
    194198        stw     r3,_Thread_Dispatch_disable_level@l(r15) /* End decrementing _Thread_Dispatch_disable_level */
    195199        cmpwi   r3, 0
     
    223227        stmw    r16, GPR16_OFFSET(r1)
    224228        addi    r3, r1, 0x8
    225         /*
    226         * compute SP at exception entry
    227         */
    228         addi    r2, r1, EXCEPTION_FRAME_END
    229         /*
    230         * store it at the right place
    231         */
    232         stw     r2, GPR1_OFFSET(r1)
     229        /*
     230        * compute SP at exception entry
     231        */
     232        addi    r4, r1, EXCEPTION_FRAME_END
     233        /*
     234        * store it at the right place
     235        */
     236        stw     r4, GPR1_OFFSET(r1)
    233237        /*
    234238         * Call High Level signal handling code
     
    315319                 
    316320        lwz     r4, SRR1_FRAME_OFFSET(r1)
    317         lwz     r2, SRR0_FRAME_OFFSET(r1)
     321        lwz     r3, SRR0_FRAME_OFFSET(r1)
     322        lwz     r2, GPR2_OFFSET(r1)
     323        lwz     r0, GPR0_OFFSET(r1)
     324
     325        mtsrr1  r4
     326        mtsrr0  r3
     327        lwz     r4, GPR4_OFFSET(r1)
    318328        lwz     r3, GPR3_OFFSET(r1)
    319         lwz     r0, GPR0_OFFSET(r1)
    320 
    321         mtsrr1  r4
    322         mtsrr0  r2
    323         lwz     r4, GPR4_OFFSET(r1)
    324         lwz     r2, GPR2_OFFSET(r1)
    325329        addi    r1,r1, EXCEPTION_FRAME_END
    326330        SYNC
  • c/src/lib/libbsp/powerpc/shared/irq/irq_init.c

    rd19443c7 r4f3e4f33  
    238238  printk("Going to initialize raven interrupt controller (openpic compliant)\n");
    239239#endif       
    240   openpic_init(1, mcp750_openpic_initsenses, mcp750_openpic_initpolarities);
     240  openpic_init(1, mcp750_openpic_initpolarities, mcp750_openpic_initsenses);
    241241#ifdef TRACE_IRQ_INIT 
    242242  printk("Going to initialize the PCI/ISA bridge IRQ related setting (VIA 82C586)\n");
  • c/src/lib/libbsp/powerpc/shared/openpic/Makefile.am

    rd19443c7 r4f3e4f33  
    66C_FILES = openpic.c
    77
    8 include_bspdir = $(includedir)/bsp
    9 include_bsp_HEADERS = openpic.h
     8H_FILES = openpic.h
    109
    1110$(PROJECT_INCLUDE)/bsp:
  • c/src/lib/libbsp/powerpc/shared/startup/Makefile.am

    rd19443c7 r4f3e4f33  
    44
    55
    6 C_FILES = bspstart.c
     6C_FILES = bspstart.c pgtbl_setup.c pgtbl_activate.c
    77
    88noinst_DATA = linkcmds
    99
    10 EXTRA_DIST = bspstart.c linkcmds
     10EXTRA_DIST = bspstart.c linkcmds  pgtbl_setup.c pgtbl_activate.c
    1111
    1212include $(top_srcdir)/../../../../../automake/local.am
  • c/src/lib/libbsp/powerpc/shared/startup/bspstart.c

    rd19443c7 r4f3e4f33  
    2828#include <bsp/openpic.h>
    2929#include <bsp/irq.h>
     30#include <bsp/VME.h>
    3031#include <bsp.h>
    3132#include <libcpu/bat.h>
     33#include <libcpu/pte121.h>
    3234#include <libcpu/cpuIdent.h>
    3335#include <bsp/vectors.h>
     
    4244extern void set_L2CR(unsigned);
    4345extern void bsp_cleanup(void);
     46extern Triv121PgTbl BSP_pgtbl_setup();
     47extern void                     BSP_pgtbl_activate();
     48extern void                     BSP_vme_config();
     49
     50SPR_RW(SPR0)
     51SPR_RW(SPR1)
     52
    4453/*
    4554 * Copy of residuals passed by firmware
     
    174183  prep_t boardManufacturer;
    175184  motorolaBoard myBoard;
     185  Triv121PgTbl  pt=0;
    176186  /*
    177187   * Get CPU identification dynamically. Note that the get_ppc_cpu_type() function
     
    218228  *((unsigned32 *)intrStack) = 0;
    219229
    220   asm volatile ("mtspr  273, %0" : "=r" (intrStack) : "0" (intrStack));
    221   asm volatile ("mtspr  272, %0" : "=r" (intrNestingLevel) : "0" (intrNestingLevel));
     230  _write_SPR1((unsigned int)intrStack);
     231  _write_SPR0(intrNestingLevel);
    222232  /*
    223233   * Initialize default raw exception hanlders. See vectors/vectors_init.c
     
    232242   * compatible hardware
    233243   */
    234   setdbat(1, 0x80000000, 0x80000000, 0x10000000, IO_PAGE);
     244  setdbat(1, _IO_BASE, _IO_BASE, 0x10000000, IO_PAGE);
    235245  /*
    236246   * PCI devices memory area. Needed to access OPENPIC features
     
    238248   */
    239249  /* T. Straumann: give more PCI address space */
    240   setdbat(2, 0xc0000000, 0xc0000000, 0x10000000, IO_PAGE);
     250  setdbat(2, PCI_MEM_BASE, PCI_MEM_BASE, 0x10000000, IO_PAGE);
    241251  /*
    242252   * Must have acces to open pic PCI ACK registers
    243253   * provided by the RAVEN
     254   *
    244255   */
    245256  setdbat(3, 0xf0000000, 0xf0000000, 0x10000000, IO_PAGE);
     257
    246258  select_console(CONSOLE_LOG);
    247259
     
    305317  BSP_time_base_divisor                 = (residualCopy.VitalProductData.TimeBaseDivisor?
    306318                                           residualCopy.VitalProductData.TimeBaseDivisor : 4000);
     319
     320  /* Allocate and set up the page table mappings
     321   * This is only available on >604 CPUs.
     322   *
     323   * NOTE: This setup routine may modify the available memory
     324   *       size. It is essential to call it before
     325   *       calculating the workspace etc.
     326   */
     327  pt = BSP_pgtbl_setup(&BSP_mem_size);
     328
     329  if (!pt ||
     330          TRIV121_MAP_SUCCESS != triv121PgTblMap(
     331                                                                                pt,
     332                                                                                TRIV121_121_VSID,
     333                                                                                0xfeff0000,
     334                                                                                1,
     335                                                                                TRIV121_ATTR_IO_PAGE,
     336                                                                                TRIV121_PP_RW_PAGE
     337                                                                                )) {
     338        printk("WARNING: unable to setup page tables VME bridge must share PCI space\n");
     339  }
    307340 
    308341  /*
     
    336369   */
    337370  BSP_rtems_irq_mng_init(0);
     371
     372 
     373  /* Activate the page table mappings only after
     374   * initializing interrupts because the irq_mng_init()
     375   * routine needs to modify the text
     376   */           
     377  if (pt) {
     378#ifdef  SHOW_MORE_INIT_SETTINGS
     379    printk("Page table setup finished; will activate it NOW...\n");
     380#endif
     381    BSP_pgtbl_activate(pt);
     382        /* finally, switch off DBAT3 */
     383        setdbat(3, 0, 0, 0, 0);
     384  }
     385
     386  /*
     387   * Initialize VME bridge - needs working PCI
     388   * and IRQ subsystems...
     389   */
     390#ifdef SHOW_MORE_INIT_SETTINGS
     391  printk("Going to initialize VME bridge\n");
     392#endif
     393  /* VME initialization is in a separate file so apps which don't use
     394   * VME or want a different configuration may link against a customized
     395   * routine.
     396   */
     397  BSP_vme_config();
     398
    338399#ifdef SHOW_MORE_INIT_SETTINGS
    339400  printk("Exit from bspstart\n");
  • c/src/lib/libbsp/powerpc/shared/startup/linkcmds

    rd19443c7 r4f3e4f33  
    88MEMORY {
    99        VECTORS : ORIGIN = 0x0 ,  LENGTH = 0x3000
    10         CODE : ORIGIN = 0x3000 , LENGTH = 0x100000
     10        CODE : ORIGIN = 0x3000 , LENGTH = 0x400000
    1111}
    1212SECTIONS
     
    7676  .rodata1        : { *(.rodata1) }     > CODE
    7777  .eh_frame       : { *.(eh_frame)              } >CODE
     78  .sdata2         : { *(.sdata2) *(.gnu.linkonce.s2.*)  } >CODE
     79  .sbss2          : { *(.sbss2) *(.gnu.linkonce.sb2.*)  } >CODE
    7880  _etext = .;
    7981  PROVIDE (etext = .);
    80   .sdata2         : { *(.sdata2) *(.gnu.linkonce.s2.*)  } >CODE
    81   .sbss2          : { *(.sbss2) *(.gnu.linkonce.sb2.*)  } >CODE
    8282  /* Adjust the address for the data segment.  We want to adjust up to
    8383     the same address within the page on the next page up.  It would
  • c/src/lib/libbsp/powerpc/shared/vectors/vectors.S

    rd19443c7 r4f3e4f33  
    4141        stwu    r1, - (EXCEPTION_FRAME_END)(r1)
    4242        stw     r3, GPR3_OFFSET(r1)
     43        /* R2 should never change (EABI: pointer to .sdata2) - we
     44     * save it nevertheless..
     45         */
    4346        stw     r2, GPR2_OFFSET(r1)
    44         mflr    r2
    45         stw     r2, EXC_LR_OFFSET(r1)
     47        mflr    r3
     48        stw     r3, EXC_LR_OFFSET(r1)
    4649        bl      0f
    47500:      /*
     
    6568        stw     r3, EXCEPTION_NUMBER_OFFSET(r1)
    6669        stw     r0, GPR0_OFFSET(r1)
    67         mfsrr0  r2
    68         stw     r2, SRR0_FRAME_OFFSET(r1)
     70        mfsrr0  r3
     71        stw     r3, SRR0_FRAME_OFFSET(r1)
    6972        mfsrr1  r3
    7073        stw     r3, SRR1_FRAME_OFFSET(r1)
     
    9093        mfdar   r28
    9194        stw     r28,  EXC_DAR_OFFSET(r1)
    92         /*
    93         * compute SP at exception entry
    94         */
    95         addi    r2, r1, EXCEPTION_FRAME_END
    96         /*
    97         * store it at the right place
    98         */
    99         stw     r2, GPR1_OFFSET(r1)
     95        /*
     96        * compute SP at exception entry
     97        */
     98        addi    r3, r1, EXCEPTION_FRAME_END
     99        /*
     100        * store it at the right place
     101        */
     102        stw     r3, GPR1_OFFSET(r1)
    100103        /*
    101104         * Enable data and instruction address translation, exception nesting
  • c/src/lib/libbsp/powerpc/shared/vectors/vectors_init.c

    rd19443c7 r4f3e4f33  
    1717#include <bsp/vectors.h>
    1818#include <libcpu/raw_exception.h>
     19#include <libcpu/spr.h>
    1920#include <bsp.h>
    2021
     
    3435#define STACK_CLAMP 50  /* in case we have a corrupted bottom */
    3536
     37SPR_RO(LR)
     38
    3639void
    3740BSP_printStackTrace(BSP_Exception_frame* excPtr)
    3841{
    39 LRFrame f;
    40 int     i;
     42LRFrame f;
     43int             i;
     44LRFrame sp;
     45void    *lr;
    4146
    42         printk("Stack Trace: ");
    43         printk("  IP: 0x%08x, LR: 0x%08x\n",
    44                         excPtr->EXC_SRR0, excPtr->EXC_LR);
    45         for (f=(LRFrame)excPtr->GPR1, i=0; f->frameLink && i<STACK_CLAMP; f=f->frameLink) {
     47        printk("Stack Trace: \n  ");
     48        if (excPtr) {
     49                printk("IP: 0x%08x, ",excPtr->EXC_SRR0);
     50                sp=(LRFrame)excPtr->GPR1;
     51                lr=(void*)excPtr->EXC_LR;
     52        } else {
     53                /* there's no macro for this */
     54                __asm__ __volatile__("mr %0, 1":"=r"(sp));
     55                lr=(LRFrame)_read_LR();
     56        }
     57        printk("LR: 0x%08x\n",lr);
     58        for (f=(LRFrame)sp, i=0; f->frameLink && i<STACK_CLAMP; f=f->frameLink) {
    4659                printk("--^ 0x%08x", (long)(f->frameLink->lr));
    4760                if (!(++i%5))
Note: See TracChangeset for help on using the changeset viewer.