| ############################################################################### | |
| # | |
| # 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 |