f03d3bfef003a84e729f5caec438b41360a3b5cb
[barrelfish] / usr / kaluga / main.c
1 /**
2  * \file
3  * \brief Device manager for Barrelfish.
4  *
5  * Interacts with the SKB / PCI to start cores, drivers etc.
6  *
7  */
8
9 /*
10  * Copyright (c) 2007-2010, ETH Zurich.
11  * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
12  * All rights reserved.
13  *
14  * This file is distributed under the terms in the attached LICENSE file.
15  * If you do not find this file, copies can be found by writing to:
16  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
17  */
18
19 #include <stdlib.h>
20 #include <stdbool.h>
21 #include <stdio.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <errors/errno.h>
25
26 #include <barrelfish/barrelfish.h>
27 #include <barrelfish/cpu_arch.h>
28 #include <barrelfish/nameservice_client.h>
29
30 #include <if/monitor_defs.h>
31
32 #include <vfs/vfs.h>
33 #include <pci/pci.h> // for pci_addr
34 #include <octopus/octopus.h>
35 #include <thc/thc.h>
36
37 #include <trace/trace.h>
38
39 #include "kaluga.h"
40
41
42 coreid_t my_core_id = 0;  // Core ID
43 uint32_t my_arch_id = 0;  // APIC ID
44 struct pci_address eth0 = {0xff, 0xff, 0xff};
45 size_t cpu_count = 0;
46
47 static void add_start_function_overrides(void)
48 {
49     set_start_function("e1000n", start_networking);
50     set_start_function("rtl8029", start_networking);
51     set_start_function("corectrl", start_boot_driver);
52 #ifdef __ARM_ARCH_7A__
53     set_start_function("driverdomain", newstyle_start_function);
54 #endif
55 }
56
57 static void parse_arguments(int argc, char** argv, char ** add_device_db_file, size_t *cpu_count)
58 {
59     for (int i = 1; i < argc; i++) {
60         if (strncmp(argv[i], "apicid=", 7) == 0) {
61             my_arch_id = strtol(argv[i] + 7, NULL, 10);
62         } else if (strncmp(argv[i], "eth0=", 5) == 0) {
63             int parsed = sscanf(argv[i], "eth0=%" SCNu8 ":%" SCNu8 ":%" SCNu8,
64                                 &eth0.bus, &eth0.device, &eth0.function);
65             printf("Kaluga using eth0=%u:%u:%u as network device\n", eth0.bus,
66                          eth0.device, eth0.function);
67             if (parsed != 3) {
68                 eth0.bus = 0xff;
69                 eth0.device = 0xff;
70                 eth0.function = 0xff;
71             }
72         } else if (strcmp(argv[i], "boot") == 0) {
73             // ignored
74         } else if (strncmp(argv[i],"add_device_db=", strlen("add_device_db=")) == 0){
75            *add_device_db_file = argv[i] + strlen("add_device_db=");
76            printf("Kaluga using additional device_db file: %s.\n", *add_device_db_file);
77         } else if (strncmp(argv[i], "cpu_count=", strlen("cpu_count=")) == 0) {
78             sscanf(argv[i], "cpu_count=%zu", cpu_count);
79         }
80     }
81 }
82
83 static inline errval_t wait_for_pci(void)
84 {
85     iref_t iref;
86     return nameservice_blocking_lookup("pci_discovery_done", &iref);
87 }
88
89 int main(int argc, char** argv)
90 {
91     vfs_init();
92     init_environ();
93
94     errval_t err;
95
96     my_core_id = disp_get_core_id();
97     char * add_device_db_file = NULL;
98     parse_arguments(argc, argv, &add_device_db_file, &cpu_count);
99
100     err = oct_init();
101     if (err_is_fail(err)) {
102         USER_PANIC_ERR(err, "Initialize octopus service.");
103     }
104
105     KALUGA_DEBUG("Kaluga: parse boot modules...\n");
106
107     ddomain_controller_init();
108
109     err = init_boot_modules();
110     if (err_is_fail(err)) {
111         USER_PANIC_ERR(err, "Parse boot modules.");
112     }
113     add_start_function_overrides();
114
115     err = arch_startup(add_device_db_file);
116     if (err_is_fail(err)) {
117         USER_PANIC_ERR(err, "arch startup");
118     }
119
120     THCFinish();
121     return EXIT_SUCCESS;
122 }