/*
 * 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"                                                                                  \
	             "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	__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--;

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