| ############################################################################### |
| # |
| # 16550 serial Rx interrupt handler for gdbstub I/O |
| # |
| # Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. |
| # Written by David Howells (dhowells@redhat.com) |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public Licence |
| # as published by the Free Software Foundation; either version |
| # 2 of the Licence, or (at your option) any later version. |
| # |
| ############################################################################### |
| #include <linux/sys.h> |
| #include <linux/linkage.h> |
| #include <asm/smp.h> |
| #include <asm/cpu-regs.h> |
| #include <asm/thread_info.h> |
| #include <asm/frame.inc> |
| #include <asm/intctl-regs.h> |
| #include <asm/irqflags.h> |
| #include <unit/serial.h> |
| |
| .text |
| |
| ############################################################################### |
| # |
| # GDB stub serial receive interrupt entry point |
| # - intended to run at interrupt priority 0 |
| # |
| ############################################################################### |
| .globl gdbstub_io_rx_handler |
| .type gdbstub_io_rx_handler,@function |
| gdbstub_io_rx_handler: |
| movm [d2,d3,a2,a3],(sp) |
| |
| #if 1 |
| movbu (GDBPORT_SERIAL_IIR),d2 |
| #endif |
| |
| mov (gdbstub_rx_inp),a3 |
| gdbstub_io_rx_more: |
| mov a3,a2 |
| add 2,a3 |
| and 0x00000fff,a3 |
| mov (gdbstub_rx_outp),d3 |
| cmp a3,d3 |
| beq gdbstub_io_rx_overflow |
| |
| movbu (GDBPORT_SERIAL_LSR),d3 |
| btst UART_LSR_DR,d3 |
| beq gdbstub_io_rx_done |
| movbu (GDBPORT_SERIAL_RX),d2 |
| movbu d3,(gdbstub_rx_buffer+1,a2) |
| movbu d2,(gdbstub_rx_buffer,a2) |
| mov a3,(gdbstub_rx_inp) |
| bra gdbstub_io_rx_more |
| |
| gdbstub_io_rx_done: |
| mov GxICR_DETECT,d2 |
| movbu d2,(XIRQxICR(GDBPORT_SERIAL_IRQ)) # ACK the interrupt |
| movhu (XIRQxICR(GDBPORT_SERIAL_IRQ)),d2 # flush |
| movm (sp),[d2,d3,a2,a3] |
| bset 0x01,(gdbstub_busy) |
| beq gdbstub_io_rx_enter |
| rti |
| |
| gdbstub_io_rx_overflow: |
| bset 0x01,(gdbstub_rx_overflow) |
| bra gdbstub_io_rx_done |
| |
| gdbstub_io_rx_enter: |
| LOCAL_CHANGE_INTR_MASK_LEVEL(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL+1)) |
| add -4,sp |
| SAVE_ALL |
| |
| mov 0xffffffff,d0 |
| mov d0,(REG_ORIG_D0,fp) |
| mov 0x280,d1 |
| |
| mov fp,d0 |
| call gdbstub_rx_irq[],0 # gdbstub_rx_irq(regs,excep) |
| |
| LOCAL_CLI |
| bclr 0x01,(gdbstub_busy) |
| |
| .globl gdbstub_return |
| gdbstub_return: |
| RESTORE_ALL |
| |
| .size gdbstub_io_rx_handler,.-gdbstub_io_rx_handler |