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" \ |
); |