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.


started the emulation framework
[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.55 $
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 ifeq ($(DEBUG),1)
81   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
82
83 else
84   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
85 endif
86
87
88 #
89 # DECODER is the decoder that will be used 
90 # currently we only support xed
91 #
92 DECODER=XED
93
94 DECODER_FLAGS=
95 DECODER_SRCS=
96 DECODER_LIBS=
97
98 ifeq ($(DECODER),XED)
99 DECODER_SRCS := vmm_xed.c
100 DECODER_FLAGS :=  -L../lib/xed
101 DECODER_LIBS := -lxed
102 else
103 # This is an error
104 endif
105
106
107 #
108 # This is wrong for current cygwin - no changes needed
109 #
110 # Figure out if we're compiling with cygwin, http://cygwin.com
111 #
112
113 #SYSTEM_NAME := $(shell uname -s)
114 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
115 #SYM_PFX            := _
116 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
117 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
118 #NON_ELF_SYSTEM     := yes
119 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
120 #endif
121
122
123
124
125 # ----------------------------------------------------------------------
126 # Configuration -
127 #   Various options specifying how GeekOS should be built,
128 #   what source files to build, which user programs to build,
129 #   etc.  This is generally the only section of the makefile
130 #   that will need to be modified.
131 # ----------------------------------------------------------------------
132
133 # List of targets to build by default.
134 # These targets encompass everything needed to boot
135 # and run GeekOS.
136 ALL_TARGETS := vmm.img vm_kernel
137
138
139 # Kernel source files
140 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
141         blockdev.c ide.c \
142         keyboard.c screen.c timer.c \
143         mem.c crc32.c \
144         gdt.c tss.c segment.c \
145         bget.c malloc.c \
146         synch.c kthread.c \
147         serial.c  reboot.c \
148         paging.c \
149         debug.c vmm_stubs.c  vm.c  pci.c\
150         main.c
151
152 # Kernel object files built from C source files
153 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
154
155 # Kernel assembly files
156 KERNEL_ASM_SRCS := lowlevel.asm
157
158 KERNEL_GAS_SRCS := testvm.s udivdi3.s
159
160 # Kernel object files build from assembler source files
161 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
162
163 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
164
165
166 # All kernel object files
167 KERNEL_OBJS := $(KERNEL_C_OBJS) \
168   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
169
170 # Common library source files.
171 # This library is linked into both the kernel and user programs.
172 # It provides string functions and generic printf()-style
173 # formatted output.
174 COMMON_C_SRCS := fmtout.c string.c memmove.c
175
176 # Common library object files.
177 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
178
179 VMM_ASM_SRCS :=  svm_lowlevel.asm \
180 #                       vmx_lowlevel.asm
181
182 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
183
184
185 VMM_C_SRCS :=   vm_guest.c \
186                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
187                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
188                 vmm_intr.c vmm_time.c \
189                 vmm_shadow_paging.c vm_guest_mem.c  \
190                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
191                 svm_halt.c svm_pause.c vmm_config.c vmm_hashtable.c \
192                 vmm_string.c vmm_emulator.c \
193                  $(DECODER_SRCS)
194 #\
195 #               vmx.c vmcs_gen.c vmcs.c
196
197 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
198
199 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
200
201
202
203
204 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c
205
206 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
207
208 DEVICE_OBJS := $(DEVICE_C_OBJS)
209
210 V3LIBS := $(DECODER_LIBS)
211
212
213
214 # ----------------------------------------------------------------------
215 # Tools -
216 #   This section defines programs that are used to build GeekOS.
217 # ----------------------------------------------------------------------
218
219 # Uncomment if cross compiling
220 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
221 #TARGET_CC_PREFIX :=  i386-elf-
222
223 # Target C compiler.  gcc 2.95.2 or later should work.
224 TARGET_CC := $(TARGET_CC_PREFIX)gcc
225 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
226
227 # Host C compiler.  This is used to compile programs to execute on
228 # the host platform, not the target (x86) platform.  On x86/ELF
229 # systems, such as Linux and FreeBSD, it can generally be the same
230 # as the target C compiler.
231 HOST_CC := gcc
232
233 # Target linker.  GNU ld is probably to only one that will work.
234 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
235
236 # Target archiver
237 TARGET_AR := $(TARGET_CC_PREFIX)ar
238
239 # Target ranlib
240 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
241
242 # Target nm
243 TARGET_NM := $(TARGET_CC_PREFIX)nm
244
245 # Target objcopy
246 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
247
248 # Nasm (http://nasm.sourceforge.net)
249 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
250 #NASM := /opt/vmm-tools/bin/nasm
251
252 AS = as --32
253
254 # Tool to build PFAT filesystem images.
255 BUILDFAT := tools/builtFat.exe
256
257 # Perl5 or later
258 PERL := perl
259
260 # Pad a file so its size is a multiple of some unit (i.e., sector size)
261 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
262
263 # Create a file filled with zeroes.
264 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
265
266 # Calculate size of file in sectors
267 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
268
269
270 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
271
272
273 # ----------------------------------------------------------------------
274 # Definitions -
275 #   Options passed to the tools.
276 # ----------------------------------------------------------------------
277
278 # Flags used for all C source files
279 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC
280 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
281
282 # Flags used for kernel C source files
283 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
284
285 # Flags used for VMM C source files
286 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__ $(DECODER_FLAGS) $(JRLDEBUG)
287
288 # Flags used for VMM C ASM files
289 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
290
291 # Flags user for kernel assembly files
292 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
293
294 # Flags used for common library and libc source files
295 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
296         $(EXTRA_CC_USER_OPTS)
297
298 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
299 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
300
301 # ----------------------------------------------------------------------
302 # Rules -
303 #   Describes how to compile the source files.
304 # ----------------------------------------------------------------------
305
306 # Compilation of kernel C source files
307
308 geekos/%.o : geekos/%.c
309         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
310
311
312 # Compilation of kernel assembly source files
313 geekos/%.o : geekos/%.asm
314         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
315
316 # Compilation of test VM
317 geekos/%.o : geekos/%.s
318         $(AS) $< -o geekos/$*.o
319
320 geekos/%.o : geekos/%.S
321         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
322
323 # Compilation of common library C source files
324 common/%.o : common/%.c
325         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
326
327 palacios/%.o : palacios/%.c
328         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
329
330 palacios/%.o : palacios/%.asm
331         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
332
333 devices/%.o : devices/%.c
334         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
335
336 devices/%.o : devices/%.asm
337         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
338
339 # ----------------------------------------------------------------------
340 # Targets -
341 #   Specifies files to be built
342 # ----------------------------------------------------------------------
343
344 # Default target - see definition of ALL_TARGETS in Configuration section
345 all : $(ALL_TARGETS)
346
347
348 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
349 #       $(NASM) -O99 \
350 #       -f elf \
351 #               -I$(PROJECT_ROOT)/src/geekos/ \
352 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
353 #       -o $@
354
355
356 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
357 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
358
359 # Standard floppy image - just boots the kernel
360 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
361         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
362         $(PAD) _temp 512
363         cp _temp fd.img
364
365 vmm.img : fd.img
366         cp fd.img vmm.img
367         $(PAD) vmm.img 1474560
368
369 force_rombios: 
370         (cd ../src/vmboot/rombios; make clean; make)
371
372 force_vgabios:
373         (cd ../src/vmboot/vgabios; make clean; make)
374
375 force_payload: force_rombios force_vgabios
376         ../scripts/make_payload.pl payload_layout.txt vm_kernel
377
378 inter1: force_payload
379         -make clean
380
381 world: inter1 vmm.img
382
383 # make ready to boot over PXE
384 pxe:    vmm.img
385         cp vmm.img /tftpboot/vmm.img
386
387 run: vmm.img
388         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
389
390
391
392
393 # Floppy boot sector (first stage boot loader).
394 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
395         $(NASM) -f bin \
396                 -I$(PROJECT_ROOT)/src/geekos/ \
397                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
398                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
399                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
400                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
401                 -o $@
402
403 # Setup program (second stage boot loader).
404 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
405         $(NASM) -f bin \
406                 -I$(PROJECT_ROOT)/src/geekos/ \
407                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
408                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
409                 $(PROJECT_ROOT)/src/geekos/setup.asm \
410                 -o $@
411         $(PAD) $@ 512
412
413 # Loadable (flat) kernel image.
414 geekos/kernel.bin : geekos/kernel.exe
415         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
416         $(PAD) $@ 512
417
418 # The kernel executable and symbol map.
419 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) vm_kernel
420         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
421                 $(DECODER_FLAGS) \
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