OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/trunk/rtos/freertos-6.1.1/Source/portable
    from Rev 572 to Rev 621
    Reverse comparison

Rev 572 → Rev 621

/GCC/OpenRISC/port.c
63,6 → 63,10
/* Processor constants. */
#include "port_spr_defs.h"
 
/* Jump buffer */
#include <setjmp.h>
static jmp_buf jmpbuf;
 
/* Tick Timer Interrupt handler */
void vTickHandler( void );
 
172,14 → 176,19
 
portBASE_TYPE xPortStartScheduler( void )
{
/* Start the timer that generates the tick ISR. Interrupts are disabled
here already. */
prvSetupTimerInterrupt();
if(setjmp((void *)jmpbuf) == 0) {
/* Start the timer that generates the tick ISR. Interrupts are disabled
here already. */
prvSetupTimerInterrupt();
 
/* Start the first task. */
portRESTORE_CONTEXT();
/* Should not get here! */
/* Start the first task. */
portRESTORE_CONTEXT();
/* Should not get here! */
} else {
/* Retrun by vPortEndScheduler */
}
 
return 0;
}
 
186,6 → 195,7
void vPortEndScheduler( void )
{
mtspr(SPR_SR, mfspr(SPR_SR) & (~SPR_SR_TEE)); // Tick stop
longjmp((void *)jmpbuf, 1); // return to xPortStartScheduler
}
 
/*
211,6 → 221,10
mtspr(SPR_SR, mfspr(SPR_SR) | SPR_SR_TEE);
}
 
/*
* naked attribute is ignored or32-elf-gcc 4.5.1-or32-1.0rc1
* use assemble routines in portasm.S
*/
#if 0
void vTickHandler( void )
{
/GCC/OpenRISC/portasm.S
30,11 → 30,76
l.jr r9
.size vPortEnableInterrupts, .-vPortEnableInterrupts
 
.text
.global vTickHandler
.type vTickHandler, %function
vTickHandler:
# portSAVE_CONTEXT
 
.macro portSAVE_REGISTER
l.addi r1, r1, -116
l.sw 0x00(r1), r3
l.sw 0x04(r1), r4
l.sw 0x08(r1), r5
l.sw 0x0c(r1), r6
l.sw 0x10(r1), r7
l.sw 0x14(r1), r8
l.sw 0x18(r1), r9
l.sw 0x1c(r1), r10
l.sw 0x20(r1), r11
l.sw 0x24(r1), r12
l.sw 0x28(r1), r13
l.sw 0x2c(r1), r14
l.sw 0x30(r1), r15
l.sw 0x34(r1), r16
l.sw 0x38(r1), r17
l.sw 0x3c(r1), r18
l.sw 0x40(r1), r19
l.sw 0x44(r1), r20
l.sw 0x48(r1), r21
l.sw 0x4c(r1), r22
l.sw 0x50(r1), r23
l.sw 0x54(r1), r24
l.sw 0x58(r1), r25
l.sw 0x5c(r1), r26
l.sw 0x60(r1), r27
l.sw 0x64(r1), r28
l.sw 0x68(r1), r29
l.sw 0x6c(r1), r30
l.sw 0x70(r1), r31
.endm
 
 
.macro portRESTORE_REGISTER
l.lwz r3 , 0x00(r1)
l.lwz r4 , 0x04(r1)
l.lwz r5 , 0x08(r1)
l.lwz r6 , 0x0c(r1)
l.lwz r7 , 0x10(r1)
l.lwz r8 , 0x14(r1)
l.lwz r9 , 0x18(r1)
l.lwz r10, 0x1c(r1)
l.lwz r11, 0x20(r1)
l.lwz r12, 0x24(r1)
l.lwz r13, 0x28(r1)
l.lwz r14, 0x2c(r1)
l.lwz r15, 0x30(r1)
l.lwz r16, 0x34(r1)
l.lwz r17, 0x38(r1)
l.lwz r18, 0x3c(r1)
l.lwz r19, 0x40(r1)
l.lwz r20, 0x44(r1)
l.lwz r21, 0x48(r1)
l.lwz r22, 0x4c(r1)
l.lwz r23, 0x50(r1)
l.lwz r24, 0x54(r1)
l.lwz r25, 0x58(r1)
l.lwz r26, 0x5c(r1)
l.lwz r27, 0x60(r1)
l.lwz r28, 0x64(r1)
l.lwz r29, 0x68(r1)
l.lwz r30, 0x6c(r1)
l.lwz r31, 0x70(r1)
l.addi r1, r1, 116
.endm
 
 
.macro portSAVE_CONTEXT
.global pxCurrentTCB
# make rooms in stack
l.addi r1, r1, -128
43,8 → 108,8
l.sw 0x0C(r1), r4
l.sw 0x10(r1), r5
# save SPR_ESR_BASE(0), SPR_EPCR_BASE(0)
l.mfspr r3, r0, (0<<11) + 64
l.mfspr r4, r0, (0<<11) + 32
l.mfspr r3, r0, SPR_ESR_BASE
l.mfspr r4, r0, SPR_EPCR_BASE
l.sw 0x78(r1), r3
l.sw 0x7C(r1), r4
l.sw 0x00(r1), r9
84,24 → 149,10
l.lwz r3, 0x08(r1)
l.lwz r4, 0x0C(r1)
l.lwz r5, 0x10(r1)
l.mfspr r3, r0, SPR_TTMR
l.movhi r4, hi(SPR_TTMR_IP)
l.ori r4, r4, lo(SPR_TTMR_IP)
l.xori r4, r4, 0xffffffff
l.and r3, r3, r4 # clear tick timer interrupt
l.mtspr r0, r3, SPR_TTMR
.endm
 
l.jal vTaskIncrementTick
l.nop
.if configUSE_PREEMPTION == 0
# do nothing
.else
l.jal vTaskSwitchContext
l.nop
.endif
# portRESTORE_CONTEXT
 
.macro portRESTORE_CONTEXT
l.movhi r3, hi(pxCurrentTCB)
l.ori r3, r3, lo(pxCurrentTCB)
l.lwz r3, 0x0(r3)
137,8 → 188,8
# restore SPR_ESR_BASE(0), SPR_EPCR_BASE(0)
l.lwz r3, 0x78(r1)
l.lwz r4, 0x7C(r1)
l.mtspr r0, r3, (0<<11) + 64
l.mtspr r0, r4, (0<<11) + 32
l.mtspr r0, r3, SPR_ESR_BASE
l.mtspr r0, r4, SPR_EPCR_BASE
# restore clobber register
l.lwz r3, 0x08(r1)
l.lwz r4, 0x0C(r1)
146,115 → 197,101
l.addi r1, r1, 128
l.rfe
l.nop
.endm
 
.size vTickHandler, .-vTickHandler
 
.text
.global vPortTickHandler
.type vPortTickHandler, %function
vPortTickHandler:
portSAVE_CONTEXT
l.mfspr r3, r0, SPR_TTMR
l.movhi r4, hi(SPR_TTMR_IP)
l.ori r4, r4, lo(SPR_TTMR_IP)
l.xori r4, r4, 0xffffffff
l.and r3, r3, r4 # clear tick timer interrupt
l.mtspr r0, r3, SPR_TTMR
 
l.jal vTaskIncrementTick
l.nop
.if configUSE_PREEMPTION == 0
# do nothing
.else
l.jal vTaskSwitchContext
l.nop
.endif
 
portRESTORE_CONTEXT
.size vPortTickHandler, .-vPortTickHandler
 
 
.text
.global PortCC
.type PortCC, %function
PortCC:
# portSAVE_CONTEXT
.global pxCurrentTCB
l.lwz r11, 0x0(r1)
l.addi r1, r1, 4
# make rooms in stack
l.addi r1, r1, -128
# early save r3-r5, these are clobber register
l.sw 0x08(r1), r3
l.sw 0x0C(r1), r4
l.sw 0x10(r1), r5
# save SPR_ESR_BASE(0), SPR_EPCR_BASE(0)
l.mfspr r3, r0, (0<<11) + 64
l.mfspr r4, r0, (0<<11) + 32
l.sw 0x78(r1), r3
l.sw 0x7C(r1), r4
l.sw 0x00(r1), r9
# Save Context
l.sw 0x04(r1), r2
l.sw 0x14(r1), r6
l.sw 0x18(r1), r7
l.sw 0x1C(r1), r8
l.sw 0x20(r1), r10
l.sw 0x24(r1), r11
l.sw 0x28(r1), r12
l.sw 0x2C(r1), r13
l.sw 0x30(r1), r14
l.sw 0x34(r1), r15
l.sw 0x38(r1), r16
l.sw 0x3C(r1), r17
l.sw 0x40(r1), r18
l.sw 0x44(r1), r19
l.sw 0x48(r1), r20
l.sw 0x4C(r1), r21
l.sw 0x50(r1), r22
l.sw 0x54(r1), r23
l.sw 0x58(r1), r24
l.sw 0x5C(r1), r25
l.sw 0x60(r1), r26
l.sw 0x64(r1), r27
l.sw 0x68(r1), r28
l.sw 0x6C(r1), r29
l.sw 0x70(r1), r30
l.sw 0x74(r1), r31
# Save the top of stack in TCB
l.movhi r3, hi(pxCurrentTCB)
l.ori r3, r3, lo(pxCurrentTCB)
l.lwz r3, 0x0(r3)
l.sw 0x0(r3), r1
# restore clobber register
l.lwz r3, 0x08(r1)
l.lwz r4, 0x0C(r1)
l.lwz r5, 0x10(r1)
.global vPortSystemCall
.type vPortSystemCall, %function
vPortSystemCall:
l.sfeqi r11, 0xFCC
l.bf 1f
l.nop
l.sw -120(r1), r11
l.lwz r11, -4(r1)
portSAVE_REGISTER
 
l.jal syscall_except
l.lwz r3, -4(r1)
 
portRESTORE_REGISTER
l.rfe
l.nop
 
1:
l.sw -132(r1), r11
l.lwz r11, -4(r1)
portSAVE_CONTEXT
l.jal syscall_except
l.lwz r3, -4(r1)
portRESTORE_CONTEXT
.size vPortSystemCall, .-vPortSystemCall
 
 
.text
.global vPortExtIntHandler
.type vPortExtIntHandler, %function
vPortExtIntHandler:
portSAVE_CONTEXT
 
l.jal int_main
l.nop
 
.if configUSE_PREEMPTION == 0
# do nothing
.else
l.jal vTaskSwitchContext
l.nop
.endif
# portRESTORE_CONTEXT
l.movhi r3, hi(pxCurrentTCB)
l.ori r3, r3, lo(pxCurrentTCB)
l.lwz r3, 0x0(r3)
l.lwz r1, 0x0(r3)
# restore context
l.lwz r9, 0x00(r1)
l.lwz r2, 0x04(r1)
l.lwz r6, 0x14(r1)
l.lwz r7, 0x18(r1)
l.lwz r8, 0x1C(r1)
l.lwz r10, 0x20(r1)
l.lwz r11, 0x24(r1)
l.lwz r12, 0x28(r1)
l.lwz r13, 0x2C(r1)
l.lwz r14, 0x30(r1)
l.lwz r15, 0x34(r1)
l.lwz r16, 0x38(r1)
l.lwz r17, 0x3C(r1)
l.lwz r18, 0x40(r1)
l.lwz r19, 0x44(r1)
l.lwz r20, 0x48(r1)
l.lwz r21, 0x4C(r1)
l.lwz r22, 0x50(r1)
l.lwz r23, 0x54(r1)
l.lwz r24, 0x58(r1)
l.lwz r25, 0x5C(r1)
l.lwz r26, 0x60(r1)
l.lwz r27, 0x64(r1)
l.lwz r28, 0x68(r1)
l.lwz r29, 0x6C(r1)
l.lwz r30, 0x70(r1)
l.lwz r31, 0x74(r1)
# restore SPR_ESR_BASE(0), SPR_EPCR_BASE(0)
l.lwz r3, 0x78(r1)
l.lwz r4, 0x7C(r1)
l.mtspr r0, r3, (0<<11) + 64
l.mtspr r0, r4, (0<<11) + 32
# restore clobber register
l.lwz r3, 0x08(r1)
l.lwz r4, 0x0C(r1)
l.lwz r5, 0x10(r1)
l.addi r1, r1, 128
l.rfe
l.nop
portRESTORE_CONTEXT
.size vPortExtIntHandler, .-vPortExtIntHandler
 
.size PortCC, .-PortCC
 
.text
.global vPortMiscIntHandler
.type vPortMiscIntHandler, %function
vPortMiscIntHandler:
portSAVE_CONTEXT
 
l.jal misc_int_handler
l.lwz r3, -4(r1)
 
.if configUSE_PREEMPTION == 0
# do nothing
.else
l.jal vTaskSwitchContext
l.nop
.endif
portRESTORE_CONTEXT
.size vPortMiscIntHandler, .-vPortMiscIntHandler
/GCC/OpenRISC/portmacro.h
85,8 → 85,7
 
#define portYIELD_FROM_ISR() vTaskSwitchContext()
#define portYIELD() { \
__asm__ __volatile__ ( "l.addi r1, r1, -4" ); \
__asm__ __volatile__ ( "l.sw 0x0(r1), r11" ); \
__asm__ __volatile__ ( "l.sw -4(r1), r11" ); \
__asm__ __volatile__ ( "l.addi r11, r0, 0x0FCC" ); \
__asm__ __volatile__ ( "l.sys 0x0FCC" ); \
__asm__ __volatile__ ( "l.nop " ); \
115,8 → 114,7
// Critical section handling.
// switch supervisormode, disable tick interrupt and all external interrupt, switch back usermode
#define portENTER_CRITICAL() { \
__asm__ __volatile__ ( "l.addi r1, r1, -4" ); \
__asm__ __volatile__ ( "l.sw 0x0(r1), r11" ); \
__asm__ __volatile__ ( "l.sw -4(r1), r11" ); \
__asm__ __volatile__ ( "l.addi r11, r0, 0x0FCE" ); \
__asm__ __volatile__ ( "l.sys 0x0FCE" ); \
__asm__ __volatile__ ( "l.nop " ); \
124,8 → 122,7
 
// switch supervisormode, enable tick interrupt and all external interrupt, switch back usermode
#define portEXIT_CRITICAL() { \
__asm__ __volatile__ ( "l.addi r1, r1, -4" ); \
__asm__ __volatile__ ( "l.sw 0x0(r1), r11" ); \
__asm__ __volatile__ ( "l.sw -4(r1), r11" ); \
__asm__ __volatile__ ( "l.addi r11, r0, 0x0FCF" ); \
__asm__ __volatile__ ( "l.sys 0x0FCF" ); \
__asm__ __volatile__ ( "l.nop " ); \
144,7 → 141,7
asm volatile ( \
" .global pxCurrentTCB \n\t" \
" # make rooms in stack \n\t" \
" l.addi r1, r1, -132 \n\t" \
" l.addi r1, r1, -128 \n\t" \
" # early save r3-r5, these are clobber register\n\t" \
" l.sw 0x08(r1), r3 \n\t" \
" l.sw 0x0C(r1), r4 \n\t" \
240,6 → 237,7
" l.lwz r3, 0x08(r1) \n\t" \
" l.lwz r4, 0x0C(r1) \n\t" \
" l.lwz r5, 0x10(r1) \n\t" \
" l.addi r1, r1, 128 \n\t" \
" l.rfe \n\t" \
" l.nop \n\t" \
);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.