98 lines
2.1 KiB
C
98 lines
2.1 KiB
C
/*
|
|
* Copyright (C) yajin 2008 <yajinzhou@gmail.com >
|
|
*
|
|
* This file is part of the virtualmips distribution.
|
|
* See LICENSE file for terms of the license.
|
|
*/
|
|
#define _GNU_SOURCE
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <signal.h>
|
|
|
|
#include "utils.h"
|
|
#include "mips.h"
|
|
#include "device.h"
|
|
#include "vm.h"
|
|
#include "mips_exec.h"
|
|
#include "vp_timer.h"
|
|
#include "crc.h"
|
|
#include "net_io.h"
|
|
|
|
#define VERSION "0.06-retrobsd"
|
|
|
|
void signal_gen_handler (int sig)
|
|
{
|
|
switch (sig) {
|
|
case SIGHUP:
|
|
/* For future use */
|
|
break;
|
|
|
|
case SIGQUIT:
|
|
printf ("\n--- Stop simulation\n");
|
|
/*do not worry, exit will release all resource */
|
|
exit (EXIT_SUCCESS);
|
|
break;
|
|
|
|
case SIGINT:
|
|
/* In theory, this shouldn't happen thanks to VTTY settings */
|
|
break;
|
|
|
|
default:
|
|
fprintf (stderr, "Unhandled signal %d\n", sig);
|
|
}
|
|
}
|
|
|
|
/* Setups signals */
|
|
static void setup_signals (void)
|
|
{
|
|
struct sigaction act;
|
|
|
|
memset (&act, 0, sizeof (act));
|
|
act.sa_handler = signal_gen_handler;
|
|
act.sa_flags = SA_RESTART;
|
|
sigaction (SIGHUP, &act, NULL);
|
|
sigaction (SIGQUIT, &act, NULL);
|
|
sigaction (SIGINT, &act, NULL);
|
|
}
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
vm_instance_t *vm;
|
|
char *configure_filename = NULL;
|
|
|
|
printf ("\nVirtualMIPS (version %s)\n", VERSION);
|
|
printf ("Copyright (c) 2008 yajin, 2011-2015 vak.\n");
|
|
printf ("Build date: %s %s\n\n", __DATE__, __TIME__);
|
|
|
|
/* Initialize CRC functions */
|
|
crc_init ();
|
|
|
|
/* Initialize VTTY code */
|
|
vtty_init ();
|
|
|
|
/* Create the default instance */
|
|
if (argc > 1)
|
|
configure_filename = argv[1];
|
|
vm = create_instance (configure_filename);
|
|
if (!vm)
|
|
return EXIT_FAILURE;
|
|
|
|
/* Set seed for random value. */
|
|
srand ((int) time (0));
|
|
|
|
setup_signals ();
|
|
init_timers ();
|
|
if (init_instance (vm) < 0) {
|
|
fprintf (stderr, "Unable to initialize instance.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
/* We get here, because the cpu is not running now. */
|
|
vm_monitor (vm);
|
|
|
|
printf ("VM shut down\n");
|
|
return (0);
|
|
}
|