IRQ: added irq source capability and make the inthandler setup use it
[barrelfish] / hake / Config.hs.template
1 --------------------------------------------------------------------------
2 -- Copyright (c) 2007-2010, 2012, 2013, 2015 ETH Zurich.
3 -- Copyright (c) 2014, HP Labs.
4 -- All rights reserved.
5 --
6 -- This file is distributed under the terms in the attached LICENSE file.
7 -- If you do not find this file, copies can be found by writing to:
8 -- ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
9 -- Attn: Systems Group.
10 --
11 -- Configuration options for Hake
12 -- 
13 --------------------------------------------------------------------------
14
15 module Config where
16
17 import HakeTypes
18 import Data.Char
19 import qualified Args
20 import Data.List
21 import Data.Maybe
22 import System.FilePath
23 import Tools (findTool, ToolDetails, toolPath, toolPrefix)
24 import qualified Tools
25
26 -- Set by hake.sh
27 toolroot         :: Maybe FilePath
28 arm_toolspec     :: Maybe (Maybe FilePath -> ToolDetails)
29 aarch64_toolspec :: Maybe (Maybe FilePath -> ToolDetails)
30 thumb_toolspec   :: Maybe (Maybe FilePath -> ToolDetails)
31 armeb_toolspec   :: Maybe (Maybe FilePath -> ToolDetails)
32 x86_toolspec     :: Maybe (Maybe FilePath -> ToolDetails)
33 k1om_toolspec    :: Maybe (Maybe FilePath -> ToolDetails)
34
35 -- Default toolchains
36 arm_tools     = fromMaybe Tools.arm_system
37                           arm_toolspec
38                 toolroot
39 aarch64_tools = fromMaybe Tools.arm_netos_linaro_aarch64_2014_11
40                           aarch64_toolspec
41                 toolroot
42 thumb_tools   = fromMaybe Tools.arm_netos_arm_2015q2
43                           thumb_toolspec
44                 toolroot
45 armeb_tools   = fromMaybe Tools.arm_netos_linaro_be_2015_02
46                           armeb_toolspec
47                 toolroot
48 x86_tools     = fromMaybe Tools.x86_system
49                           x86_toolspec
50                 toolroot
51 k1om_tools    = fromMaybe Tools.k1om_netos_mpss_3_4
52                           k1om_toolspec
53                 toolroot
54
55 -- ARM toolchain
56 arm_gnu_tool = findTool (toolPath arm_tools) (toolPrefix arm_tools)
57 arm_cc       = arm_gnu_tool "gcc"
58 arm_objcopy  = arm_gnu_tool "objcopy"
59 arm_objdump  = arm_gnu_tool "objdump"
60 arm_ar       = arm_gnu_tool "ar"
61 arm_ranlib   = arm_gnu_tool "ranlib"
62 arm_cxx      = arm_gnu_tool "g++"
63
64 -- ARM AArch64
65 aarch64_gnu_tool = findTool (toolPath aarch64_tools) (toolPrefix aarch64_tools)
66 aarch64_cc       = aarch64_gnu_tool "gcc"
67 aarch64_objcopy  = aarch64_gnu_tool "objcopy"
68 aarch64_objdump  = aarch64_gnu_tool "objdump"
69 aarch64_ar       = aarch64_gnu_tool "ar"
70 aarch64_ranlib   = aarch64_gnu_tool "ranlib"
71 aarch64_cxx      = aarch64_gnu_tool "g++"
72
73 -- ARM thumb (e.g. -M profile) toolchain
74 thumb_gnu_tool = findTool (toolPath thumb_tools) (toolPrefix thumb_tools)
75 thumb_cc       = thumb_gnu_tool "gcc"
76 thumb_objcopy  = thumb_gnu_tool "objcopy"
77 thumb_objdump  = thumb_gnu_tool "objdump"
78 thumb_ar       = thumb_gnu_tool "ar"
79 thumb_ranlib   = thumb_gnu_tool "ranlib"
80 thumb_cxx      = thumb_gnu_tool "g++"
81
82 -- ARM big-endian (e.g. XScale) toolchain
83 armeb_gnu_tool = findTool (toolPath armeb_tools) (toolPrefix armeb_tools)
84 armeb_cc       = armeb_gnu_tool "gcc"
85 armeb_objcopy  = armeb_gnu_tool "objcopy"
86 armeb_objdump  = armeb_gnu_tool "objdump"
87 armeb_ar       = armeb_gnu_tool "ar"
88 armeb_ranlib   = armeb_gnu_tool "ranlib"
89 armeb_cxx      = armeb_gnu_tool "g++"
90
91 -- X86 (32/64) toolchain
92 x86_gnu_tool = findTool (toolPath x86_tools) (toolPrefix x86_tools)
93 x86_cc       = x86_gnu_tool "gcc"
94 x86_objcopy  = x86_gnu_tool "objcopy"
95 x86_objdump  = x86_gnu_tool "objdump"
96 x86_ar       = x86_gnu_tool "ar"
97 x86_ranlib   = x86_gnu_tool "ranlib"
98 x86_cxx      = x86_gnu_tool "g++"
99
100 -- Xeon Phi toolchain
101 k1om_gnu_tool = findTool (toolPath k1om_tools) (toolPrefix k1om_tools)
102 k1om_cc      = k1om_gnu_tool "gcc"
103 k1om_objcopy = k1om_gnu_tool "objcopy"
104 k1om_objdump = k1om_gnu_tool "objdump"
105 k1om_ar      = k1om_gnu_tool "ar"
106 k1om_ranlib  = k1om_gnu_tool "ranlib"
107 k1om_cxx     = k1om_gnu_tool "g++"
108
109 -- Miscellaneous tools
110 gem5         = "gem5.fast"
111 runghc       = "runghc"    -- run GHC interactively
112 circo        = "circo"     -- from graphviz
113 dot          = "dot"       --   "    "
114 inkscape     = "inkscape"
115
116 -- path to source and install directories; these are automatically set by
117 -- hake.sh at setup time 
118 source_dir :: String
119 -- source_dir = undefined -- (set by hake.sh, see end of file)
120
121 install_dir :: String
122 -- install_dir = undefined -- (set by hake.sh, see end of file)
123
124 cache_dir :: String
125 -- cache_dir = undefined -- (set by hake.sh, see end of file)
126
127 -- Set of architectures for which to generate rules
128 architectures :: [String]
129 -- architectures = undefined -- (set by hake.sh, see end of file)
130
131 -- Optimisation flags (-Ox -g etc.) passed to compiler
132 cOptFlags :: [String]
133 cOptFlags = ["-g", "-O2"]
134
135 -- Selects which libc to compile with, "oldc" or "newlib"
136 libc :: String
137 --libc = "oldc"
138 libc = "newlib"
139
140 newlib_malloc :: String
141 --newlib_malloc = "sbrk"     -- use sbrk and newlib's malloc()
142 --newlib_malloc = "dlmalloc" -- use dlmalloc
143 newlib_malloc = "oldmalloc"
144
145 -- Configure pagesize for libbarrelfish's morecore implementation
146 -- x86_64 accepts "small", "large", and "huge" for 4kB, 2MB and 1GB pages
147 -- respectively. x86_32 accepts "small" and "large" for 4kB and 2MB/4MB pages
148 -- respectively. All other architectures default to their default page size.
149 morecore_pagesize :: String
150 morecore_pagesize = "small"
151
152 -- Use a frame pointer
153 use_fp :: Bool
154 use_fp = True
155
156 -- Default timeslice duration in milliseconds
157 timeslice :: Integer
158 timeslice = 80
159
160 -- Put kernel into microbenchmarks mode
161 microbenchmarks :: Bool
162 microbenchmarks = False
163
164 -- Enable tracing
165 trace :: Bool
166 trace = False
167
168 -- Enable QEMU networking. (ie. make network work in small memory)
169 support_qemu_networking :: Bool
170 support_qemu_networking  = False
171
172 -- armv7 platform to build for
173 -- Currently available: gem5, pandaboard
174 armv7_platform :: String
175 --armv7_platform = "gem5"
176 armv7_platform = "pandaboard"
177
178 -- on pandaboard, build a heterogenous image and let the cortex-A9 set up and start the
179 -- cortex-M3 processor (build targets "heteropanda_slave" and "heteropanda_master_image")
180 heteropanda :: Bool
181 heteropanda = False
182
183 -- enable network tracing
184 trace_network_subsystem :: Bool
185 trace_network_subsystem = False
186
187 -- May want to disable LRPC to improve trace visuals
188 trace_disable_lrpc :: Bool
189 trace_disable_lrpc = False
190
191 -- use Kaluga
192 use_kaluga_dvm :: Bool
193 use_kaluga_dvm = True
194
195 -- Domain and driver debugging
196 global_debug :: Bool
197 global_debug = False
198
199 e1000n_debug :: Bool
200 e1000n_debug = False
201
202 eMAC_debug :: Bool
203 eMAC_debug = False
204
205 rtl8029_debug :: Bool
206 rtl8029_debug = False
207
208 ahcid_debug :: Bool
209 ahcid_debug = False
210
211 libahci_debug :: Bool
212 libahci_debug = False
213
214 vfs_debug :: Bool
215 vfs_debug = False
216
217 ethersrv_debug :: Bool
218 ethersrv_debug = False
219
220 netd_debug :: Bool
221 netd_debug = False
222
223 libacpi_debug :: Bool 
224 libacpi_debug = False
225
226 acpi_interface_debug :: Bool
227 acpi_interface_debug = False
228
229 acpi_service_debug :: Bool
230 acpi_service_debug = False
231
232 acpi_server_debug :: Bool
233 acpi_server_debug = False
234
235 lpc_timer_debug :: Bool
236 lpc_timer_debug = False
237
238 lwip_debug :: Bool
239 lwip_debug = False
240
241 libpci_debug :: Bool
242 libpci_debug = False
243
244 usrpci_debug :: Bool
245 usrpci_debug = False
246
247 timer_debug :: Bool
248 timer_debug = False
249
250 eclipse_kernel_debug :: Bool
251 eclipse_kernel_debug = False
252
253 skb_debug :: Bool
254 skb_debug = False
255
256 skb_client_debug :: Bool
257 skb_client_debug = False
258
259 flounder_debug :: Bool
260 flounder_debug = False
261
262 flounder_failed_debug :: Bool
263 flounder_failed_debug = False
264
265 webserver_debug :: Bool
266 webserver_debug = False
267
268 sqlclient_debug :: Bool
269 sqlclient_debug = False
270
271 sqlite_debug :: Bool
272 sqlite_debug = False
273
274 sqlite_backend_debug :: Bool
275 sqlite_backend_debug = False
276
277 nfs_debug :: Bool
278 nfs_debug = False
279
280 rpc_debug :: Bool
281 rpc_debug = False
282
283 loopback_debug :: Bool
284 loopback_debug = False
285
286 octopus_debug :: Bool
287 octopus_debug = False
288
289 term_debug :: Bool
290 term_debug = False
291
292 serial_debug :: Bool
293 serial_debug = False
294
295 -- Deadlock debugging
296 debug_deadlocks :: Bool
297 debug_deadlocks = False
298
299 -- Partitioned memory server
300 memserv_percore :: Bool
301 memserv_percore = False
302
303 -- Lazy THC implementation (requires use_fp = True)
304 lazy_thc :: Bool
305 lazy_thc
306     | elem "armv7" architectures   = False
307     | elem "armv5" architectures   = False
308     | elem "armv8" architectures   = False
309     | elem "xscale" architectures  = False
310     | otherwise                    = True
311
312 -- Enable capability tracing debug facility
313 caps_trace :: Bool
314 caps_trace = False
315
316 -- Mapping Database configuration options (this affects lib/mdb/)
317 -- enable extensive tracing of mapping db implementation
318 mdb_trace :: Bool
319 mdb_trace = False
320
321 -- enable tracing of top level mdb_insert, mdb_remove calls
322 mdb_trace_no_recursive :: Bool
323 mdb_trace_no_recursive = False
324
325 -- fail on invariant violations
326 mdb_fail_invariants :: Bool
327 mdb_fail_invariants = True
328
329 -- check invariants before/after mdb_insert/mdb_remove.
330 mdb_check_invariants :: Bool
331 mdb_check_invariants = False
332
333 -- recheck invariants at each tracing point
334 mdb_recheck_invariants :: Bool
335 mdb_recheck_invariants = False
336
337 -- enable extensive tracing of mapping db implementation (userspace version)
338 mdb_trace_user :: Bool
339 mdb_trace_user = False
340
341 -- fail on invariant violations
342 mdb_fail_invariants_user :: Bool
343 mdb_fail_invariants_user = True
344
345 -- recheck invariants at each tracing point
346 mdb_recheck_invariants_user :: Bool
347 mdb_recheck_invariants_user = True
348
349 -- check invariants before/after mdb_insert/mdb_remove.
350 mdb_check_invariants_user :: Bool
351 mdb_check_invariants_user = True
352
353 -- Select scheduler
354 data Scheduler = RBED | RR deriving (Show,Eq)
355 scheduler :: Scheduler
356 scheduler = RBED
357
358 -- Physical Address Extensions (PAE)-enabled paging on x86-32
359 pae_paging :: Bool
360 pae_paging = False
361
362 -- Page Size Extensions (PSE)-enabled paging on x86-32
363 -- Always enabled when pae_paging == True, regardless of value
364 pse_paging :: Bool
365 pse_paging = False
366
367 -- No Execute Extensions (NXE)-enabled paging on x86-32
368 -- May not be True when pae_paging == False
369 nxe_paging :: Bool
370 nxe_paging = False
371
372 oneshot_timer :: Bool
373 oneshot_timer = False
374
375 -- Enable hardware VM support for AMD's Secure Virtual Machine (SVM)
376 -- If disabled, Intel's VMX hardware is supported instead
377 config_svm :: Bool
378 config_svm = True
379
380 -- Enable the use of only Arrakis domains (with arrakismon)
381 -- If disabled, use normal VM-guests (with vmkitmon)
382 config_arrakismon :: Bool
383 config_arrakismon = False
384
385 defines :: [RuleToken]
386 defines = [ Str ("-D" ++ d) | d <- [  
387              if microbenchmarks then "CONFIG_MICROBENCHMARKS" else "",
388              if trace then "CONFIG_TRACE" else "",
389              if support_qemu_networking then "CONFIG_QEMU_NETWORK" else "",
390              if trace_network_subsystem then "NETWORK_STACK_TRACE" else "",
391              if trace_disable_lrpc then "TRACE_DISABLE_LRPC" else "",
392              if global_debug then "GLOBAL_DEBUG" else "",
393              if e1000n_debug then "E1000N_SERVICE_DEBUG" else "",
394              if ahcid_debug then "AHCI_SERVICE_DEBUG" else "",
395              if libahci_debug then "AHCI_LIB_DEBUG" else "",
396              if vfs_debug then "VFS_DEBUG" else "",
397              if eMAC_debug then "EMAC_SERVICE_DEBUG" else "",
398              if rtl8029_debug then "RTL8029_SERVICE_DEBUG" else "",
399              if ethersrv_debug then "ETHERSRV_SERVICE_DEBUG" else "",
400              if netd_debug then "NETD_SERVICE_DEBUG" else "",
401              if libacpi_debug then "ACPI_DEBUG_OUTPUT" else "",
402              if acpi_interface_debug then "ACPI_BF_DEBUG" else "",
403              if acpi_service_debug then "ACPI_SERVICE_DEBUG" else "",
404              if lpc_timer_debug then "LPC_TIMER_DEBUG" else "",
405              if lwip_debug then "LWIP_BARRELFISH_DEBUG" else "",
406              if libpci_debug then "PCI_CLIENT_DEBUG" else "",
407              if usrpci_debug then "PCI_SERVICE_DEBUG" else "",
408              if timer_debug then "TIMER_CLIENT_DEBUG" else "",
409              if eclipse_kernel_debug then "ECLIPSE_KERNEL_DEBUG" else "",
410              if skb_debug then "SKB_SERVICE_DEBUG" else "",
411              if skb_client_debug then "SKB_CLIENT_DEBUG" else "",
412              if flounder_debug then "FLOUNDER_DEBUG" else "",
413              if flounder_failed_debug then "FLOUNDER_FAILED_DEBUG" else "",
414              if webserver_debug then "WEBSERVER_DEBUG" else "",
415              if sqlclient_debug then "SQL_CLIENT_DEBUG" else "",
416              if sqlite_debug then "SQL_SERVICE_DEBUG" else "",
417              if sqlite_backend_debug then "SQL_BACKEND_DEBUG" else "",
418              if nfs_debug then "NFS_CLIENT_DEBUG" else "",
419              if rpc_debug then "RPC_DEBUG" else "",
420              if loopback_debug then "LOOPBACK_DEBUG" else "",
421              if octopus_debug then "DIST_SERVICE_DEBUG" else "",
422              if term_debug then "TERMINAL_LIBRARY_DEBUG" else "",
423              if serial_debug then "SERIAL_DRIVER_DEBUG" else "",
424              if debug_deadlocks then "CONFIG_DEBUG_DEADLOCKS" else "",
425              if memserv_percore then "CONFIG_MEMSERV_PERCORE" else "",
426              if lazy_thc then "CONFIG_LAZY_THC" else "",
427              if pae_paging then "CONFIG_PAE" else "",
428              if pse_paging then "CONFIG_PSE" else "",
429              if nxe_paging then "CONFIG_NXE" else "",
430              if libc == "oldc" then "CONFIG_OLDC" else "CONFIG_NEWLIB",
431              if oneshot_timer then "CONFIG_ONESHOT_TIMER" else "",
432              if config_svm then "CONFIG_SVM" else "",
433              if config_arrakismon then "CONFIG_ARRAKISMON" else "",
434              if use_kaluga_dvm then "USE_KALUGA_DVM" else "",
435              if heteropanda then "HETEROPANDA" else "",
436              if caps_trace then "TRACE_PMEM_CAPS" else ""
437              ], d /= "" ]
438
439 -- Sets the include path for the libc
440 libcInc :: String
441 libcInc = if libc == "oldc" then "/include/oldc"
442           else "/lib/newlib/newlib/libc/include"
443
444 -- Sets the include path for lwIP
445 lwipInc :: String
446 lwipInc = "/lib/lwip/src/include"
447 lwipxxxInc :: String
448 lwipxxxInc = "/lib/lwip/src/include/ipv4"
449
450 -- some defines depend on the architecture/compile options
451 arch_defines :: Options -> [RuleToken]
452 arch_defines opts
453     -- enable config flags for interconnect drivers in use for this arch
454     = [ Str ("-D" ++ d)
455        | d <- ["CONFIG_INTERCONNECT_DRIVER_" ++ (map toUpper n)
456                | n <- optInterconnectDrivers opts]
457       ]
458     -- enable config flags for flounder backends in use for this arch
459     ++ [ Str ("-D" ++ d)
460        | d <- ["CONFIG_FLOUNDER_BACKEND_" ++ (map toUpper n)
461                | n <- optFlounderBackends opts]
462       ]
463
464 -- newlib common compile flags (maybe put these in a config.h file?)
465 newlibAddCFlags :: [String]
466 newlibAddCFlags = [ "-DPACKAGE_NAME=\"newlib\"" ,
467                     "-DPACKAGE_TARNAME=\"newlib\"",
468                     "-DPACKAGE_VERSION=\"1.19.0\"",
469                     "-DPACKAGE_BUGREPORT=\"\"",
470                     "-DPACKAGE_URL=\"\"",
471                     "-D_I386MACH_ALLOW_HW_INTERRUPTS",
472                     "-DMISSING_SYSCALL_NAMES",
473                     "-D_WANT_IO_C99_FORMATS",
474                     "-D_COMPILING_NEWLIB",
475                     "-D_WANT_IO_LONG_LONG",
476                     "-D_WANT_IO_LONG_DOUBLE",
477                     "-D_MB_CAPABLE",
478                     "-D__BSD_VISIBLE"]