From 41bdcd16b8e2c4200634443f7a2b6e9be11e8d99 Mon Sep 17 00:00:00 2001 From: Dimitry Kloper Date: Mon, 28 Dec 2015 00:46:24 +0200 Subject: [PATCH] Change notation of PCH and PCL registers into PC0 and PC1 This is for forthcoming Atmega2560 support. The Atmega2560 has 24-bit PC thus, PCH and PCL would become PCH, PCM and PCL (M for Middle). The problem that in this notation PCM is equivalent to former PCH. This makes compatable porting kind of difficult, at least for my taste. Instead PCH becomes PC0 and PCL becomes PC1 (think of the index as order of bytes pushed to stack when call is performed, PC0 as MSB goes first, PC1 goes to stack second, and for 24-bit PC, PC2 as LDB goes last). --- arch/avr/include/avr/irq.h | 8 ++--- arch/avr/src/at90usb/at90usb_exceptions.S | 4 +-- arch/avr/src/atmega/atmega_exceptions.S | 4 +-- arch/avr/src/avr/excptmacros.h | 38 +++++++++++------------ arch/avr/src/avr/up_dumpstate.c | 2 +- arch/avr/src/avr/up_initialstate.c | 4 +-- arch/avr/src/avr/up_schedulesigaction.c | 16 +++++----- arch/avr/src/avr/up_sigdeliver.c | 4 +-- 8 files changed, 40 insertions(+), 40 deletions(-) diff --git a/arch/avr/include/avr/irq.h b/arch/avr/include/avr/irq.h index b946be3ef5..65abae2012 100644 --- a/arch/avr/include/avr/irq.h +++ b/arch/avr/include/avr/irq.h @@ -91,8 +91,8 @@ /* The program counter is automatically pushed when the interrupt occurs */ -#define REG_PCH 35 /* PC */ -#define REG_PCL 36 +#define REG_PC0 35 /* PC */ +#define REG_PC1 36 /**************************************************************************** * Public Types @@ -112,8 +112,8 @@ struct xcptcontext /* These are saved copies of PC and SR used during signal processing.*/ - uint8_t saved_pcl; - uint8_t saved_pch; + uint8_t saved_pc1; + uint8_t saved_pc0; uint8_t saved_sreg; #endif diff --git a/arch/avr/src/at90usb/at90usb_exceptions.S b/arch/avr/src/at90usb/at90usb_exceptions.S index cb51c1616c..542ad7f74f 100755 --- a/arch/avr/src/at90usb/at90usb_exceptions.S +++ b/arch/avr/src/at90usb/at90usb_exceptions.S @@ -112,8 +112,8 @@ * On Entry: * The return PC and the saved r24 is on the stack, r24 now contains the IRQ number * - * PCL - * PCH + * PC1 + * PC0 * R0 * --- <- SP * diff --git a/arch/avr/src/atmega/atmega_exceptions.S b/arch/avr/src/atmega/atmega_exceptions.S index d8a37271a9..b594ffc74c 100755 --- a/arch/avr/src/atmega/atmega_exceptions.S +++ b/arch/avr/src/atmega/atmega_exceptions.S @@ -201,8 +201,8 @@ * On Entry: * The return PC and the saved r24 is on the stack, r24 now contains the IRQ number * - * PCL - * PCH + * PC1 + * PC0 * R0 * --- <- SP * diff --git a/arch/avr/src/avr/excptmacros.h b/arch/avr/src/avr/excptmacros.h index 1abc14273d..a4674bbe85 100644 --- a/arch/avr/src/avr/excptmacros.h +++ b/arch/avr/src/avr/excptmacros.h @@ -99,16 +99,16 @@ * sp - Points to the top of the stack. The PC is already on the stack. * Only the stack is available for storage * - * PCL - * PCH + * PC1 + * PC0 * --- <- SP * * At completion: * Stack pointer is incremented by one, the saved r24 is on the stack, r24 now contains the * IRQ number * - * PCL - * PCH + * PC1 + * PC0 * R0 * --- <- SP * @@ -134,8 +134,8 @@ * sp - Points to the top of the stack * Only the stack is available for storage * - * PCL - * PCH + * PC1 + * PC0 * R24 * --- <- SP * @@ -333,10 +333,10 @@ .macro USER_SAVE - /* Pop the return address from the stack (PCH then PCL). R18:19 are Call-used */ + /* Pop the return address from the stack (PC0 then PC1). R18:19 are Call-used */ - pop r19 /* r19=PCH */ - pop r18 /* r18=PCL */ + pop r19 /* r19=PC0 */ + pop r18 /* r18=PC1 */ /* Save the current stack pointer as it would be after the return(SPH then SPL). */ @@ -399,8 +399,8 @@ /* Save the return address that we have saved in r18:19*/ - st x+, r19 /* r19=PCH */ - st x+, r18 /* r18=PCL */ + st x+, r19 /* r19=PC0 */ + st x+, r18 /* r18=PC1 */ .endm /******************************************************************************************** @@ -428,8 +428,8 @@ * Y [r28:29] */ - movw r28, r26 /* Get a pointer to the PCH/PCL storage location */ - adiw r28, REG_PCH + movw r28, r26 /* Get a pointer to the PC0/PC1 storage location */ + adiw r28, REG_PC0 /* Fetch and set the new stack pointer */ @@ -441,21 +441,21 @@ /* Fetch the return address and save it at the bottom of the new stack so * that we can iret to switch contexts. The new stack is now: * - * PCL - * PCH + * PC1 + * PC0 * --- <- SP */ - ld r25, y+ /* Load PCH (r25) then PCL (r24) */ + ld r25, y+ /* Load PC0 (r25) then PC1 (r24) */ ld r24, y+ - push r24 /* Push PCH and PCL on the stack (PCL then PCH) */ + push r24 /* Push PC0 and PC1 on the stack (PC1 then PC0) */ push r25 /* Then get value of X [r26:r27]. Save X on the new stack where we can * recover it later. The new stack is now: * - * PCL - * PCH + * PC1 + * PC0 * R26 * R27 * --- <- SP diff --git a/arch/avr/src/avr/up_dumpstate.c b/arch/avr/src/avr/up_dumpstate.c index 97b9d1d409..383734323f 100644 --- a/arch/avr/src/avr/up_dumpstate.c +++ b/arch/avr/src/avr/up_dumpstate.c @@ -152,7 +152,7 @@ static inline void up_registerdump(void) current_regs[REG_R30], current_regs[REG_R31]); lldbg("PC: %02x%02x SP: %02x%02x SREG: %02x\n", - current_regs[REG_PCH], current_regs[REG_PCL], + current_regs[REG_PC0], current_regs[REG_PC1], current_regs[REG_SPH], current_regs[REG_SPL], current_regs[REG_SREG]); } diff --git a/arch/avr/src/avr/up_initialstate.c b/arch/avr/src/avr/up_initialstate.c index 8672e6da75..3fbfc55798 100644 --- a/arch/avr/src/avr/up_initialstate.c +++ b/arch/avr/src/avr/up_initialstate.c @@ -96,8 +96,8 @@ void up_initial_state(struct tcb_s *tcb) /* Save the task entry point */ - xcp->regs[REG_PCH] = (uint8_t)((uint16_t)tcb->start >> 8); - xcp->regs[REG_PCL] = (uint8_t)((uint16_t)tcb->start & 0xff); + xcp->regs[REG_PC0] = (uint8_t)((uint16_t)tcb->start >> 8); + xcp->regs[REG_PC1] = (uint8_t)((uint16_t)tcb->start & 0xff); /* Enable or disable interrupts, based on user configuration */ diff --git a/arch/avr/src/avr/up_schedulesigaction.c b/arch/avr/src/avr/up_schedulesigaction.c index 4bafc7f1b2..78386076f6 100644 --- a/arch/avr/src/avr/up_schedulesigaction.c +++ b/arch/avr/src/avr/up_schedulesigaction.c @@ -154,16 +154,16 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ tcb->xcp.sigdeliver = sigdeliver; - tcb->xcp.saved_pcl = current_regs[REG_PCL]; - tcb->xcp.saved_pch = current_regs[REG_PCH]; + tcb->xcp.saved_pc1 = current_regs[REG_PCL]; + tcb->xcp.saved_pc0 = current_regs[REG_PCH]; tcb->xcp.saved_sreg = current_regs[REG_SREG]; /* Then set up to vector to the trampoline with interrupts * disabled */ - current_regs[REG_PCL] = (uint16_t)up_sigdeliver & 0xff; - current_regs[REG_PCH] = (uint16_t)up_sigdeliver >> 8; + current_regs[REG_PC1] = (uint16_t)up_sigdeliver & 0xff; + current_regs[REG_PC0] = (uint16_t)up_sigdeliver >> 8; current_regs[REG_SREG] &= ~(1 << SREG_I); /* And make sure that the saved context in the TCB @@ -188,16 +188,16 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ tcb->xcp.sigdeliver = sigdeliver; - tcb->xcp.saved_pcl = tcb->xcp.regs[REG_PCL]; - tcb->xcp.saved_pch = tcb->xcp.regs[REG_PCH]; + tcb->xcp.saved_pc1 = tcb->xcp.regs[REG_PCL]; + tcb->xcp.saved_pc0 = tcb->xcp.regs[REG_PCH]; tcb->xcp.saved_sreg = tcb->xcp.regs[REG_SREG]; /* Then set up to vector to the trampoline with interrupts * disabled */ - tcb->xcp.regs[REG_PCL] = (uint16_t)up_sigdeliver & 0xff; - tcb->xcp.regs[REG_PCH] = (uint16_t)up_sigdeliver >> 8; + tcb->xcp.regs[REG_PC1] = (uint16_t)up_sigdeliver & 0xff; + tcb->xcp.regs[REG_PC0] = (uint16_t)up_sigdeliver >> 8; tcb->xcp.regs[REG_SREG] &= ~(1 << SREG_I); } } diff --git a/arch/avr/src/avr/up_sigdeliver.c b/arch/avr/src/avr/up_sigdeliver.c index 0db6a03344..1901cf420b 100644 --- a/arch/avr/src/avr/up_sigdeliver.c +++ b/arch/avr/src/avr/up_sigdeliver.c @@ -101,8 +101,8 @@ void up_sigdeliver(void) /* Save the real return state on the stack. */ up_copystate(regs, rtcb->xcp.regs); - regs[REG_PCL] = rtcb->xcp.saved_pcl; - regs[REG_PCH] = rtcb->xcp.saved_pch; + regs[REG_PC1] = rtcb->xcp.saved_pcl; + regs[REG_PC0] = rtcb->xcp.saved_pch; regs[REG_SREG] = rtcb->xcp.saved_sreg; /* Get a local copy of the sigdeliver function pointer. We do this so that