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.


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