📄 callout_debug_8260.s
字号:
# # Copyright 2007, QNX Software Systems. # # Licensed under the Apache License, Version 2.0 (the "License"). You # may not reproduce, modify or distribute this software except in # compliance with the License. You may obtain a copy of the License # at: http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTIES OF ANY KIND, either express or implied.# # This file may contain contributions from others, either as # contributors under the License or as licensors under other terms. # Please review this entire file for other proprietary rights or license # notices, as well as the QNX Development Suite License Guide at # http://licensing.qnx.com/license-guide/ for other information.# # An entry point for a hardware kernel callout.# It may be called by an interrupt handler.# This code MUST be position independant.# .include "callout.ah" .include "ppc/util.ah" .extern ptrTxBD .extern ptrRxBD .extern immr_paddr .extern cpm_offset p_txbdtbl: .long 24p_rxbdtbl: .long 24patch_debug_tx: stwu %r1,-32(%r1) mflr %r0 stw %r31,28(%r1) stw %r0,36(%r1) # get device port lwz %r8,DDI_BASE(%r7) mulli %r8,%r8,4 add %r6,%r6,%r8 # save TxBDtbl address add %r7,%r3,%r6 lis %r9,ptrTxBD@ha la %r9,ptrTxBD@l(%r9) add %r9,%r9,%r8 lwz %r8,0(%r9) stw %r8,0(%r7) # patch the routine to use the correct base add %r31,%r3,%r5 sth %r6,2(%r31) # Map in CPM memory mr %r8,%r4 loadwz %r4,immr_paddr loadwz %r3,cpm_offset add %r4,%r4,%r3 loadi %r3,0x14000 bl callout_io_map # Offset is virtual - physical loadwz %r4, immr_paddr loadwz %r7, cpm_offset add %r4, %r4, %r7 subf %r4, %r4, %r3 # Patch Virt-Phys offset sth %r4, 18(%r31) srwi %r4, %r4, 16 sth %r4, 14(%r31) # patch IMMR base sth %r3,10(%r31) srwi %r3,%r3,16 sth %r3,6(%r31) mr %r4,%r8 lwz %r0,36(%r1) mtlr %r0 lwz %r31,28(%r1) addi %r1,%r1,32 blrpatch_debug_rx: stwu %r1,-32(%r1) mflr %r0 stw %r31,28(%r1) stw %r0,36(%r1) # get device port lwz %r8,DDI_BASE(%r7) mulli %r8,%r8,4 add %r6,%r6,%r8 # save RxBDtbl address add %r7,%r3,%r6 lis %r9,ptrRxBD@ha la %r9,ptrRxBD@l(%r9) add %r9,%r9,%r8 lwz %r8,0(%r9) stw %r8,0(%r7) # patch the routine to use the correct base add %r31,%r3,%r5 sth %r6,2(%r31) # Map in CPM memory mr %r8,%r4 loadwz %r4,immr_paddr loadwz %r3,cpm_offset add %r4,%r4,%r3 loadi %r3,0x14000 bl callout_io_map # Offset is virtual - physical loadwz %r4, immr_paddr loadwz %r7, cpm_offset add %r4, %r4, %r7 subf %r4, %r4, %r3 # patch phys-virt offset sth %r4, 18(%r31) srwi %r4, %r4, 16 sth %r4, 14(%r31) # patch IMMR base sth %r3,10(%r31) srwi %r3,%r3,16 sth %r3,6(%r31) mr %r4,%r8 lwz %r0,36(%r1) mtlr %r0 lwz %r31,28(%r1) addi %r1,%r1,32 blr## void display_output(struct syspage_entry *sysp, char c)## Display debug messages from kdebug or the kernel.#CALLOUT_START display_char_8260cpm, p_txbdtbl, patch_debug_tx li %r5,0x1234 # get p_txbd offset address (patched) lis %r9,0x1234 # get IMMR base address (patched) ori %r9,%r9,0x5678 lis %r10,0x1234 # get virtual to physical translation ori %r10,%r10,0x5678 # Check and see if the cpu requires the address space bit cleared lhz %r11,SYSPAGE_PPC_KERINFO(%r3) add %r11,%r11,%r3 lwz %r11,KERINFO_TS_CLEAR(%r11) # Disable interrupt as well bitset %r11, %r11, PPC_MSR_EE mfmsr %r8 andc %r11, %r8, %r11 mtmsr %r11 isync add %r3, %r3, %r5 # p_txbd lwz %r11,0(%r3) # ptrBDHead lwz %r7,0(%r11) # ptrBD rlwinm %r9,%r9,0,0,15 addi %r9,%r9,PPC8260_IMMR_OFF_DPRAM1 add %r7,%r7,%r9 # Wait for the TxBuff ready1: lhz %r6,0(%r7) andi. %r5,%r6,PPC8260CPM_UART_TXBD_R bne 1b # Transmit lwz %r5,PPC8260CPM_BD_POINTER(%r7) # Convert phys addr to virtual add %r5, %r5, %r10 stb %r4,0(%r5) li %r4,1 sth %r4,PPC8260CPM_BD_COUNT(%r7) ori %r6,%r6,PPC8260CPM_UART_TXBD_R sth %r6,0(%r7) # Change BD counter andi. %r6,%r6,PPC8260CPM_UART_TXBD_W beq 1f addi %r7,%r11,PPC8260CPM_BD_SIZE b 2f1: addi %r7,%r7,PPC8260CPM_BD_SIZE2: sub %r7,%r7,%r9 #relative stw %r7,0(%r11) mtmsr %r8 blr CALLOUT_END display_char_8260cpm ## int poll_key( volatile struct syspage_entry *)## return a key value, or -1 if no key is available (for kdebug use)#CALLOUT_START poll_key_8260cpm, p_rxbdtbl, patch_debug_rx li %r5,0x1234 # get p_rxbd address offset (patched) lis %r9,0x1234 # get IMMR base address (patched) ori %r9,%r9,0x5678 lis %r10,0x1234 # get virtual to physical translation ori %r10,%r10,0x5678 # Check and see if the cpu requires the TS bit cleared lhz %r11,SYSPAGE_PPC_KERINFO(%r3) add %r11,%r11,%r3 lwz %r11,KERINFO_TS_CLEAR(%r11) # Also disable interrupt bitset %r11, %r11, PPC_MSR_EE mfmsr %r8 andc %r11, %r8, %r11 mtmsr %r11 isync add %r3, %r3, %r5 # p_rxbd lwz %r11,0(%r3) # ptrBDHead lwz %r7,0(%r11) # ptrBD rlwinm %r9,%r9,0,0,15 addi %r9,%r9,PPC8260_IMMR_OFF_DPRAM1 add %r7,%r7,%r9 # Anything available? lhz %r6,0(%r7) andi. %r5,%r6,PPC8260CPM_UART_RXBD_E beq 1f # Empty li %r3,-1 mtmsr %r8 blr1: # Receive lwz %r5,PPC8260CPM_BD_POINTER(%r7) # Convert physical addr to virtual add %r5, %r5, %r10 lbz %r4,0(%r5) ori %r6,%r6,PPC8260CPM_UART_RXBD_E sth %r6,0(%r7) # Change BD counter andi. %r6,%r6,PPC8260CPM_UART_RXBD_W beq 1f addi %r7,%r11,PPC8260CPM_BD_SIZE b 2f1: addi %r7,%r7,PPC8CPM_BD_SIZE2: sub %r7,%r7,%r9 #relative stw %r7,0(%r11) mr %r3,%r4 mtmsr %r8 blr CALLOUT_END poll_key_8260cpm ## int break_detect(volatile struct syspage_entry *)## return 1 if a break condition is detected, 0 otherwise#CALLOUT_START break_detect_8260cpm, p_rxbdtbl, patch_debug_rx li %r5,0x1234 # get p_rxbd address offset (patched) lis %r9,0x1234 # get IMMR base address (patched) ori %r9,%r9,0x5678 lis %r10,0x1234 # get virtual to physical translation ori %r10,%r10,0x5678 # Check and see if the cpu requires the TS bit cleared lhz %r11,SYSPAGE_PPC_KERINFO(%r3) add %r11,%r11,%r3 lwz %r11,KERINFO_TS_CLEAR(%r11) # Also disable interrupt bitset %r11, %r11, PPC_MSR_EE mfmsr %r8 andc %r11, %r8, %r11 mtmsr %r11 isync add %r3, %r3, %r5 # p_rxbd lwz %r11,0(%r3) # ptrBDHead lwz %r7,0(%r11) # ptrBD rlwinm %r9,%r9,0,0,15 addi %r9,%r9,PPC8260_IMMR_OFF_DPRAM1 add %r7,%r7,%r9 # Break? lhz %r6,0(%r7) andi. %r5,%r6,PPC8260CPM_UART_RXBD_BR bne 1f # No break li %r3,0 mtmsr %r8 blr1: # Clear the break bit andi. %r5,%r6,PPC8260CPM_UART_RXBD_W sth %r5,0(%r7) # Change BD counter andi. %r6,%r6,PPC8260CPM_UART_RXBD_W beq 1f addi %r7,%r11,PPC8260CPM_BD_SIZE b 2f1: addi %r7,%r7,PPC8260CPM_BD_SIZE2: sub %r7,%r7,%r9 #relative stw %r7,0(%r11) li %r3,1 mtmsr %r8 blr CALLOUT_END break_detect_8260cpm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -