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.


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