Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Now produces a rombios+vgabios vm_kernel regardless of whether XED=1
[palacios.git] / palacios / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
3 # $Revision: 1.52 $
4
5 # This is free software.  You are permitted to use,
6 # redistribute, and modify it as specified in the file "COPYING".
7
8 # Required software to build GeekOS:
9 # - GNU Make (http://www.gnu.org/software/make)
10 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
11 # - nasm (http://nasm.sourceforge.net)
12 # - Perl5, AWK (any version), egrep
13 #
14 # Cygwin (http://cygwin.com) may be used to build GeekOS.
15 # Make sure that gcc, binutils, nasm, and perl are installed.
16
17 # NOTES:
18 # - This makefile has been written carefully to work correctly
19 #   with the -j (parallel make) option.  I regularly use "make -j 2"
20 #   to speed the build process on 2 processor systems.
21
22
23 # Base address of kernel
24 #
25 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
26 # minus maximum size
27 #
28 #
29 # Note that the code will initially load at 0x10000
30 #
31 # The setup code needs to copy it up to this address and jump there
32 #
33 KERNEL_BASE_ADDR := 0x00100000
34
35 # Kernel entry point function
36 KERNEL_ENTRY = $(SYM_PFX)Main
37
38
39 PROJECT_ROOT := ..
40 VPATH := $(PROJECT_ROOT)/src
41
42 #when -DNDEBUG is set the kassert functions are disabled
43 #JRLDEBUG=-DNDEBUG
44
45 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
46 # as are SERIAL_PRINT_DEBUG
47
48 DEBUG=1
49 DEBUG_SECTIONS= 
50
51 ifeq ($(DEBUG_ALL),1)
52   DEBUG_SECTIONS:= $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING -DDEBUG_CTRL_REGS -DDEBUG_INTERRUPTS -DDEBUG_IO -DDEBUG_KEYBOARD -DDEBUG_PIC -DDEBUG_PIT -DDEBUG_NVRAM
53 endif
54 ifeq ($(DEBUG_SHADOW_PAGING),1)
55 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
56 endif
57 ifeq ($(DEBUG_CTRL_REGS),1)
58 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
59 endif
60 ifeq ($(DEBUG_INTERRUPTS),1)
61 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
62 endif
63 ifeq ($(DEBUG_IO),1)
64 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
65 endif
66 ifeq ($(DEBUG_KEYBOARD),1)
67 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
68 endif
69 ifeq ($(DEBUG_PIC),1)
70 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
71 endif
72 ifeq ($(DEBUG_PIT),1)
73 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
74 endif
75 ifeq ($(DEBUG_NVRAM),1)
76 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
77 endif
78
79
80
81 #
82 # XED=1 means that libxed will be included
83 #
84 # and VMM_XED is one
85 #
86 # and make world will build an empty boot package
87 #
88 XED=1
89
90 ifeq ($(DEBUG),1)
91   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
92
93 else
94   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
95 endif
96
97 ifeq ($(XED),1)
98   LEIXED = -DVMM_XED=1
99 else
100   LEIXED = -DVMM_XED=0
101 endif
102
103 LEIFLAGS = $(LEIXED)
104
105 #
106 #
107 #Peter's compile flags
108 PADFLAGS =
109
110 #
111 # This is wrong for current cygwin - no changes needed
112 #
113 # Figure out if we're compiling with cygwin, http://cygwin.com
114 #
115
116 #SYSTEM_NAME := $(shell uname -s)
117 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
118 #SYM_PFX            := _
119 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
120 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
121 #NON_ELF_SYSTEM     := yes
122 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
123 #endif
124
125
126
127
128 # ----------------------------------------------------------------------
129 # Configuration -
130 #   Various options specifying how GeekOS should be built,
131 #   what source files to build, which user programs to build,
132 #   etc.  This is generally the only section of the makefile
133 #   that will need to be modified.
134 # ----------------------------------------------------------------------
135
136 # List of targets to build by default.
137 # These targets encompass everything needed to boot
138 # and run GeekOS.
139 ALL_TARGETS := vmm.img vm_kernel
140
141
142 # Kernel source files
143 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
144         blockdev.c ide.c \
145         keyboard.c screen.c timer.c \
146         mem.c crc32.c \
147         gdt.c tss.c segment.c \
148         bget.c malloc.c \
149         synch.c kthread.c \
150         serial.c  reboot.c \
151         paging.c \
152         debug.c vmm_stubs.c  vm.c  pci.c\
153         main.c
154
155 # Kernel object files built from C source files
156 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
157
158 # Kernel assembly files
159 KERNEL_ASM_SRCS := lowlevel.asm
160
161 KERNEL_GAS_SRCS := testvm.s udivdi3.s
162
163 # Kernel object files build from assembler source files
164 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
165
166 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
167
168
169 # All kernel object files
170 KERNEL_OBJS := $(KERNEL_C_OBJS) \
171   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
172
173 # Common library source files.
174 # This library is linked into both the kernel and user programs.
175 # It provides string functions and generic printf()-style
176 # formatted output.
177 COMMON_C_SRCS := fmtout.c string.c memmove.c
178
179 # Common library object files.
180 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
181
182 VMM_ASM_SRCS :=  svm_lowlevel.asm \
183 #                       vmx_lowlevel.asm
184
185 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
186
187
188 VMM_C_SRCS :=   vm_guest.c \
189                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
190                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
191                 vmm_intr.c vmm_time.c\
192                 vmm_shadow_paging.c vm_guest_mem.c  \
193                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
194                 svm_halt.c svm_pause.c vmm_config.c
195 #\
196 #               vmx.c vmcs_gen.c vmcs.c
197
198 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
199
200 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
201
202 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c
203
204 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
205
206 DEVICE_OBJS := $(DEVICE_C_OBJS)
207
208 V3LIBS :=
209
210 ifeq ($(XED),1) 
211   V3LIBS := $(V3LIBS) -L../lib/xed -lxed
212 endif
213
214
215 # ----------------------------------------------------------------------
216 # Tools -
217 #   This section defines programs that are used to build GeekOS.
218 # ----------------------------------------------------------------------
219
220 # Uncomment if cross compiling
221 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
222 #TARGET_CC_PREFIX :=  i386-elf-
223
224 # Target C compiler.  gcc 2.95.2 or later should work.
225 TARGET_CC := $(TARGET_CC_PREFIX)gcc
226 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
227
228 # Host C compiler.  This is used to compile programs to execute on
229 # the host platform, not the target (x86) platform.  On x86/ELF
230 # systems, such as Linux and FreeBSD, it can generally be the same
231 # as the target C compiler.
232 HOST_CC := gcc
233
234 # Target linker.  GNU ld is probably to only one that will work.
235 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
236
237 # Target archiver
238 TARGET_AR := $(TARGET_CC_PREFIX)ar
239
240 # Target ranlib
241 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
242
243 # Target nm
244 TARGET_NM := $(TARGET_CC_PREFIX)nm
245
246 # Target objcopy
247 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
248
249 # Nasm (http://nasm.sourceforge.net)
250 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
251 #NASM := /opt/vmm-tools/bin/nasm
252
253 AS = as --32
254
255 # Tool to build PFAT filesystem images.
256 BUILDFAT := tools/builtFat.exe
257
258 # Perl5 or later
259 PERL := perl
260
261 # Pad a file so its size is a multiple of some unit (i.e., sector size)
262 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
263
264 # Create a file filled with zeroes.
265 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
266
267 # Calculate size of file in sectors
268 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
269
270
271 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
272
273
274 # ----------------------------------------------------------------------
275 # Definitions -
276 #   Options passed to the tools.
277 # ----------------------------------------------------------------------
278
279 # Flags used for all C source files
280 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) $(LEIFLAGS)  -fPIC
281 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
282
283 # Flags used for kernel C source files
284 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
285
286 # Flags used for VMM C source files
287 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__
288
289 # Flags used for VMM C ASM files
290 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
291
292 # Flags user for kernel assembly files
293 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
294
295 # Flags used for common library and libc source files
296 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
297         $(EXTRA_CC_USER_OPTS)
298
299 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
300 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
301
302 # ----------------------------------------------------------------------
303 # Rules -
304 #   Describes how to compile the source files.
305 # ----------------------------------------------------------------------
306
307 # Compilation of kernel C source files
308
309 geekos/%.o : geekos/%.c
310         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
311
312
313 # Compilation of kernel assembly source files
314 geekos/%.o : geekos/%.asm
315         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
316
317 # Compilation of test VM
318 geekos/%.o : geekos/%.s
319         $(AS) $< -o geekos/$*.o
320
321 geekos/%.o : geekos/%.S
322         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
323
324 # Compilation of common library C source files
325 common/%.o : common/%.c
326         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
327
328 palacios/%.o : palacios/%.c
329         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
330
331 palacios/%.o : palacios/%.asm
332         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
333
334 devices/%.o : devices/%.c
335         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
336
337 devices/%.o : devices/%.asm
338         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
339
340 # ----------------------------------------------------------------------
341 # Targets -
342 #   Specifies files to be built
343 # ----------------------------------------------------------------------
344
345 # Default target - see definition of ALL_TARGETS in Configuration section
346 all : $(ALL_TARGETS)
347
348
349 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
350 #       $(NASM) -O99 \
351 #       -f elf \
352 #               -I$(PROJECT_ROOT)/src/geekos/ \
353 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
354 #       -o $@
355
356
357 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
358 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
359
360 # Standard floppy image - just boots the kernel
361 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
362         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
363         $(PAD) _temp 512
364         cp _temp fd.img
365
366 vmm.img : fd.img
367         cp fd.img vmm.img
368         $(PAD) vmm.img 1474560
369
370 force_rombios: 
371         (cd ../src/vmboot/rombios; make clean; make)
372
373 force_vgabios:
374         (cd ../src/vmboot/vgabios; make clean; make)
375
376 force_payload: force_rombios force_vgabios
377         ../scripts/make_payload.pl payload_layout.txt vm_kernel
378
379 inter1: force_payload
380         -make clean
381
382 world: inter1 vmm.img
383
384 # make ready to boot over PXE
385 pxe:    vmm.img
386         cp vmm.img /tftpboot/vmm.img
387
388 run: vmm.img
389         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
390
391
392
393
394 # Floppy boot sector (first stage boot loader).
395 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
396         $(NASM) -f bin \
397                 -I$(PROJECT_ROOT)/src/geekos/ \
398                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
399                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
400                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
401                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
402                 -o $@
403
404 # Setup program (second stage boot loader).
405 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
406         $(NASM) -f bin \
407                 -I$(PROJECT_ROOT)/src/geekos/ \
408                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
409                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
410                 $(PROJECT_ROOT)/src/geekos/setup.asm \
411                 -o $@
412         $(PAD) $@ 512
413
414 # Loadable (flat) kernel image.
415 geekos/kernel.bin : geekos/kernel.exe
416         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
417         $(PAD) $@ 512
418
419 # The kernel executable and symbol map.
420 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) vm_kernel
421         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
422                  $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) -b binary vm_kernel
423         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
424
425
426 force:
427
428
429 #vm_kernel: force
430 #       $(PAD) vm_kernel 512
431 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
432
433
434
435
436 # Clean build directories of generated files
437 clean :
438         for d in geekos common libc user tools palacios devices; do \
439                 (cd $$d && rm -f *); \
440         done
441
442
443 # Build header file dependencies, so source files are recompiled when
444 # header files they depend on are modified.
445 depend : $(GENERATED_LIBC_SRCS)
446         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
447                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
448                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
449                 > depend.mak
450         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
451                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
452                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
453                 >> depend.mak
454         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
455                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
456                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
457                 >> depend.mak
458         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
459                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
460                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
461                 >> depend.mak
462
463 # By default, there are no header file dependencies.
464 depend.mak :
465         touch $@
466
467 include depend.mak