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