/*
 * FreeRTOS Kernel V10.0.0
 * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software. If you wish to use our Amazon
 * FreeRTOS name, please do so in a fair use way that does not cause confusion.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#include <stdlib.h>

#include <avr/interrupt.h>
#include "porthardware.h"
#include "FreeRTOS.h"
#include "task.h"

/*-----------------------------------------------------------
 * Implementation of functions defined in portable.h for the AVR port.
 *----------------------------------------------------------*/

/* Start tasks with interrupts enables. */
#define portFLAGS_INT_ENABLED               ((StackType_t) 0x80)

/*-----------------------------------------------------------*/

/* We require the address of the pxCurrentTCB variable, but don't want to know
any details of its type. */
typedef void RTOS_TCB_t;
extern volatile RTOS_TCB_t *volatile pxCurrentTCB;

/*-----------------------------------------------------------*/

/*
 * Macro to save all the general purpose registers, the save the stack pointer
 * into the TCB.
 *
 * The first thing we do is save the flags then disable interrupts.  This is to
 * guard our stack against having a context switch interrupt after we have already
 * pushed the registers onto the stack - causing the 32 registers to be on the
 * stack twice.
 *
 * r1 is set to zero as the compiler expects it to be thus, however some
 * of the math routines make use of R1.
 *
 * The interrupts will have been disabled during the call to portSAVE_CONTEXT()
 * so we need not worry about reading/writing to the stack pointer.
 */

#define portSAVE_CONTEXT() \
    asm volatile("push  r0                      \n\t" \
                 "in    r0, __SREG__            \n\t" \
                 "cli                           \n\t" \
                 "push  r0                      \n\t" \
                 "in    r0, __RAMPZ__           \n\t" \
                 "push  r0                      \n\t" \
                 "push  r1                      \n\t" \
                 "clr   r1                      \n\t" \
                 "push  r2                      \n\t" \
                 "push  r3                      \n\t" \
                 "push  r4                      \n\t" \
                 "push  r5                      \n\t" \
                 "push  r6                      \n\t" \
                 "push  r7                      \n\t" \
                 "push  r8                      \n\t" \
                 "push  r9                      \n\t" \
                 "push  r10                     \n\t" \
                 "push  r11                     \n\t" \
                 "push  r12                     \n\t" \
                 "push  r13                     \n\t" \
                 "push  r14                     \n\t" \
                 "push  r15                     \n\t" \
                 "push  r16                     \n\t" \
                 "push  r17                     \n\t" \
                 "push  r18                     \n\t" \
                 "push  r19                     \n\t" \
                 "push  r20                     \n\t" \
                 "push  r21                     \n\t" \
                 "push  r22                     \n\t" \
                 "push  r23                     \n\t" \
                 "push  r24                     \n\t" \
                 "push  r25                     \n\t" \
                 "push  r26                     \n\t" \
                 "push  r27                     \n\t" \
                 "push  r28                     \n\t" \
                 "push  r29                     \n\t" \
                 "push  r30                     \n\t" \
                 "push  r31                     \n\t" \
                 "lds   r26, pxCurrentTCB       \n\t" \
                 "lds   r27, pxCurrentTCB + 1   \n\t" \
                 "in    r0, __SP_L__            \n\t" \
                 "st    x+, r0                  \n\t" \
                 "in    r0, __SP_H__            \n\t" \
                 "st    x+, r0                  \n\t");

/*
 * Opposite to portSAVE_CONTEXT().  Interrupts will have been disabled during
 * the context save so we can write to the stack pointer.
 */

#define portRESTORE_CONTEXT() \
    asm volatile("lds   r26, pxCurrentTCB       \n\t" \
                 "lds   r27, pxCurrentTCB + 1   \n\t" \
                 "ld    r28, x+                 \n\t" \
                 "out   __SP_L__, r28           \n\t" \
                 "ld    r29, x+                 \n\t" \
                 "out   __SP_H__, r29           \n\t" \
                 "pop   r31                     \n\t" \
                 "pop   r30                     \n\t" \
                 "pop   r29                     \n\t" \
                 "pop   r28                     \n\t" \
                 "pop   r27                     \n\t" \
                 "pop   r26                     \n\t" \
                 "pop   r25                     \n\t" \
                 "pop   r24                     \n\t" \
                 "pop   r23                     \n\t" \
                 "pop   r22                     \n\t" \
                 "pop   r21                     \n\t" \
                 "pop   r20                     \n\t" \
                 "pop   r19                     \n\t" \
                 "pop   r18                     \n\t" \
                 "pop   r17                     \n\t" \
                 "pop   r16                     \n\t" \
                 "pop   r15                     \n\t" \
                 "pop   r14                     \n\t" \
                 "pop   r13                     \n\t" \
                 "pop   r12                     \n\t" \
                 "pop   r11                     \n\t" \
                 "pop   r10                     \n\t" \
                 "pop   r9                      \n\t" \
                 "pop   r8                      \n\t" \
                 "pop   r7                      \n\t" \
                 "pop   r6                      \n\t" \
                 "pop   r5                      \n\t" \
                 "pop   r4                      \n\t" \
                 "pop   r3                      \n\t" \
                 "pop   r2                      \n\t" \
                 "pop   r1                      \n\t" \
                 "pop   r0                      \n\t" \
                 "out   __RAMPZ__, r0           \n\t" \
                 "pop   r0                      \n\t" \
                 "out   __SREG__, r0            \n\t" \
                 "pop   r0                      \n\t");

/*-----------------------------------------------------------*/

/*
 * Perform hardware setup to enable ticks from timer.
 */
static void prvSetupTimerInterrupt(void);
/*-----------------------------------------------------------*/

/*
 * See header file for description.
 */
StackType_t *pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters)
{
    uint16_t usAddress;

    /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */

    /* Place a few bytes of known values on the bottom of the stack.
    This is just useful for debugging. Uncomment if needed. */
    // *pxTopOfStack = 0x11;
    // pxTopOfStack--;
    // *pxTopOfStack = 0x22;
    // pxTopOfStack--;
    // *pxTopOfStack = 0x33; 
    // pxTopOfStack--;

    /* The start of the task code will be popped off the stack last, so place
    it on first. */
    usAddress     = (uint16_t)pxCode;
    *pxTopOfStack = (StackType_t)(usAddress & (uint16_t)0x00ff);
    pxTopOfStack--;

    usAddress >>= 8;
    *pxTopOfStack = (StackType_t)(usAddress & (uint16_t)0x00ff);
    pxTopOfStack--;

    /* Next simulate the stack as if after a call to portSAVE_CONTEXT().
    portSAVE_CONTEXT places the flags on the stack immediately after r0
    to ensure the interrupts get disabled as soon as possible, and so ensuring
    the stack use is minimal should a context switch interrupt occur. */
    *pxTopOfStack = (StackType_t)0x00; /* R0 */
    pxTopOfStack--;
    *pxTopOfStack = portFLAGS_INT_ENABLED;
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) 0x00;	/* RAMPZ */
    pxTopOfStack--;
    
    /* Now the remaining registers.   The compiler expects R1 to be 0. */
    *pxTopOfStack = (StackType_t)0x00; /* R1 */

    /* Leave R2 - R23 untouched */
    pxTopOfStack -= 23;

    /* Place the parameter on the stack in the expected location. */
    usAddress     = (uint16_t)pvParameters;
    *pxTopOfStack = (StackType_t)(usAddress & (uint16_t)0x00ff);
    pxTopOfStack--;

    usAddress >>= 8;
    *pxTopOfStack = (StackType_t)(usAddress & (uint16_t)0x00ff);

    /* Leave register R26 - R31 untouched */
    pxTopOfStack -= 7;

    /*lint +e950 +e611 +e923 */

    return pxTopOfStack;
}
/*-----------------------------------------------------------*/

BaseType_t xPortStartScheduler(void)
{
    /* Setup the hardware to generate the tick. */
    prvSetupTimerInterrupt();

    /* Restore the context of the first task that is going to run. */
    portRESTORE_CONTEXT();

    /* Simulate a function call end as generated by the compiler.  We will now
    jump to the start of the task the context of which we have just restored. */
    asm volatile("ret");

    /* Should not get here. */
    return pdTRUE;
}
/*-----------------------------------------------------------*/

void vPortEndScheduler(void)
{
    /* vPortEndScheduler is not implemented in this port. */
}
/*-----------------------------------------------------------*/

/*
 * Manual context switch.  The first thing we do is save the registers so we
 * can use a naked attribute.
 */
void vPortYield(void) __attribute__((naked));
void vPortYield(void)
{
    portSAVE_CONTEXT();
    vTaskSwitchContext();
    portRESTORE_CONTEXT();
    asm volatile("ret");
}
/*-----------------------------------------------------------*/

/*
 * Manual context switch callable from ISRs. The first thing
 * we do is save the registers so we can use a naked attribute.
 */
void vPortYieldFromISR(void) __attribute__((naked));
void vPortYieldFromISR(void)
{
    portSAVE_CONTEXT();
    vTaskSwitchContext();
    portRESTORE_CONTEXT();
    asm volatile("reti");
}
/*-----------------------------------------------------------*/

/*
 * Context switch function used by the tick.  This must be identical to
 * vPortYield() from the call to vTaskSwitchContext() onwards.  The only
 * difference from vPortYield() is the tick count is incremented as the
 * call comes from the tick ISR.
 */
void vPortYieldFromTick(void) __attribute__((naked));
void vPortYieldFromTick(void)
{
    portSAVE_CONTEXT();
    if (xTaskIncrementTick() != pdFALSE) {
        vTaskSwitchContext();
    }

    portRESTORE_CONTEXT();

    asm volatile("reti");
}
/*-----------------------------------------------------------*/

/*
 * Setup timer to generate a tick interrupt.
 */
static void prvSetupTimerInterrupt(void)
{
    TICK_init();
}
/*-----------------------------------------------------------*/

#if configUSE_PREEMPTION == 1

/*
 * Tick ISR for preemptive scheduler.  We can use a naked attribute as
 * the context is saved at the start of vPortYieldFromTick().  The tick
 * count is incremented after the context is saved.
 */
ISR(TICK_INT_vect, ISR_NAKED)
{
    /* Clear tick interrupt flag. */
    CLR_INT(INT_FLAGS, INT_MASK);

    vPortYieldFromTick();

    asm volatile("reti");
}
#else

/*
 * Tick ISR for the cooperative scheduler.  All this does is increment the
 * tick count.  We don't need to switch context, this can only be done by
 * manual calls to taskYIELD();
 */
ISR(TICK_INT_vect)
{
    /* Clear tick interrupt flag. */
    INT_FLAGS = INT_MASK;
    xTaskIncrementTick();
}
#endif
