/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* Entry point of unit test executable */

#include "console.h"
#include "flash.h"
#include "hooks.h"
#include "host_task.h"
#include "keyboard_scan.h"
#include "stack_trace.h"
#include "system.h"
#include "task.h"
#include "test_util.h"
#include "timer.h"
#include "uart.h"

/* Console output macros */
#define CPUTS(outstr) cputs(CC_SYSTEM, outstr)
#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)

const char *__prog_name;

const char *__get_prog_name(void)
{
	return __prog_name;
}

int main(int argc, char **argv)
{
	__prog_name = argv[0];

	/*
	 * In order to properly service IRQs before task switching is enabled,
	 * we must set up our signal handler for the main thread.
	 */
	task_register_interrupt();

	task_register_tracedump();

	register_test_end_hook();

	flash_pre_init();
	system_pre_init();
	system_common_pre_init();

	test_init();

	timer_init();
#ifdef HAS_TASK_KEYSCAN
	keyboard_scan_init();
#endif
	uart_init();

	if (system_jumped_to_this_image()) {
		CPRINTS("Emulator initialized after sysjump");
	} else {
		CPUTS("\n\n--- Emulator initialized after reboot ---\n");
		CPUTS("[Reset cause: ");
		system_print_reset_flags();
		CPUTS("]\n");
	}

	task_start();

	return 0;
}
