1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#include <stdio.h>
14#include <camkes.h>
15#include <simple/simple.h>
16#include <rumprun/custom_simple.h>
17#include <sel4/sel4_arch/constants.h>
18
19/* TODO: This function isn't prototyped anywhere */
20void camkes_make_simple(simple_t *simple);
21
22static simple_t camkes_simple;
23static custom_simple_t custom_simple;
24
25/*- set rump_config = configuration[me.name].get('rump_config') -*/
26/*- set eth_irq_config = rump_config.get('eth_irq_interface') -*/
27/*- set eth_irq_number = rump_config.get('eth_irq_number') -*/
28/*- if eth_irq_config != "" -*/
29void /*? eth_irq_config ?*/_handle(void) {
30    rump_irq_handle(BIT(/*? eth_irq_number ?*/), 0);
31}
32/*- endif -*/
33
34uint64_t /*? rump_config.get('timer_interface') ?*/_tsc_frequency() WEAK;
35
36const char format_string[] = "{,,%s\"cmdline\": \"%s\",,},,";
37const char network_format_string[] = "\"net\" :  {,,\"if\":\"wm0\",, \"type\":\"inet\",,\"method\":\"dhcp\",,},,";
38int run(void) {
39    char * network_string = "";
40    if (rump_config.rump_net == 1) {
41        network_string = network_format_string;
42    }
43    int cmdline_len = strlen(format_string) + strlen(network_string) + strlen(rump_config.cmdline) + 1;
44    custom_simple.cmdline = malloc(cmdline_len);
45    ZF_LOGF_IF(custom_simple.cmdline == NULL, "Failed to allocate cmdline memory of size: %d", cmdline_len);
46    snprintf(custom_simple.cmdline, cmdline_len, format_string, network_string, rump_config.cmdline);
47
48    camkes_make_simple(&camkes_simple);
49
50    custom_simple.priority = rump_priority;
51    custom_simple.rumprun_memory_size = /*? rump_config.get('rumprun_memory_size') ?*/;
52    custom_simple.simple = &camkes_simple;
53    custom_simple.camkes = true;
54    custom_simple.timer_config.timer = TIMER_INTERFACE;
55/*- set timer_config_interface = rump_config.get('timer_interface') -*/
56    custom_simple.timer_config.timer_ntfn = /*? timer_config_interface ?*/_notification();
57    custom_simple.timer_config.interface.oneshot_relative = /*? timer_config_interface ?*/_oneshot_relative;
58    custom_simple.timer_config.interface.time = /*? timer_config_interface ?*/_time;
59    custom_simple.timer_config.tsc_freq = /*? timer_config_interface ?*/_tsc_frequency();
60
61/*- set serial_config_interface = rump_config.get('serial_interface') -*/
62    custom_simple.serial_config.serial = SERIAL_INTERFACE;
63    custom_simple.serial_config.putchar = /*? serial_config_interface ?*/_putchar;
64
65/*- set pci_config_interface = rump_config.get('pci_config_interface') -*/
66/*- if pci_config_interface != "" -*/
67    /* Set the PCI configuration interface if one is present */
68    custom_simple.pci_config_config.pci_config = PCI_CONFIG_INTERFACE;
69    custom_simple.pci_config_config.pci_config_read32 = /*? pci_config_interface ?*/_read32;
70    custom_simple.pci_config_config.pci_config_write32 = /*? pci_config_interface ?*/_write32;
71    custom_simple.ethernet_intr_config.eth_irq_acknowledge = /*? eth_irq_config ?*/_acknowledge;
72/*- endif -*/
73
74    /* Start rumprun instance */
75    init_rumprun(&custom_simple);
76
77    return 0;
78 }
79