/*
 * 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
