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.


initial SVM guest running
[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.13 $
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
24 # THESE MUST MATCH WHAT IS DEFINED IN defs.h and defs.asm exactly
25 # MUST BE INTEGRAL NUMBER OF PAGES
26 TOP_OF_MEM := 0x30000000
27 VM_SIZE    := 0x20000000
28 VM_START   := 0x0
29
30 #
31 # THE KERNEL, SETUP, BOOTPACKAGE MUST BE SMALLER THAN THIS
32 # MUST BE INTEGRAL NUMBER OF PAGES
33 # define 
34 MAX_VMM := 0x160000
35
36 # Base address of kernel
37 #
38 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
39 # minus maximum size
40 #
41 #
42 # Note that the code will initially load at 0x10000
43 #
44 # The setup code needs to copy it up to this address and jump there
45 #
46 KERNEL_BASE_ADDR := $(shell perl -e 'print sprintf("0x%x",$(TOP_OF_MEM)-4096*3-$(MAX_VMM));')
47
48 # Kernel entry point function
49 KERNEL_ENTRY = $(SYM_PFX)Main
50
51
52 PROJECT_ROOT := ..
53 VPATH := $(PROJECT_ROOT)/src
54
55 #when -DNDEBUG is set the kassert functions are disabled
56 #JRLDEBUG=-DNDEBUG
57 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1
58
59 #
60 #
61 #Peter's compile flags
62 PADFLAGS = -DMAX_VMM=$(MAX_VMM)
63
64 # Figure out if we're compiling with cygwin, http://cygwin.com
65 SYSTEM_NAME := $(shell uname -s)
66 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
67 SYM_PFX            := _
68 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
69 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
70 NON_ELF_SYSTEM     := yes
71 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
72 endif
73
74 VMM_SIZES = ../include/geekos/vmm_sizes.h
75
76
77 # ----------------------------------------------------------------------
78 # Configuration -
79 #   Various options specifying how GeekOS should be built,
80 #   what source files to build, which user programs to build,
81 #   etc.  This is generally the only section of the makefile
82 #   that will need to be modified.
83 # ----------------------------------------------------------------------
84
85 # List of targets to build by default.
86 # These targets encompass everything needed to boot
87 # and run GeekOS.
88 ALL_TARGETS := fd.img vm_kernel
89
90
91 # Kernel source files
92 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
93         blockdev.c ide.c \
94         keyboard.c screen.c timer.c \
95         mem.c crc32.c \
96         gdt.c tss.c segment.c \
97         bget.c malloc.c \
98         synch.c kthread.c \
99         serial.c  reboot.c \
100         paging.c vmx.c vmcs_gen.c vmcs.c \
101          svm.c vmm.c vmm_util.c vmm_stubs.c \
102         vmcb.c vmm_mem.c vm_guest.c \
103         debug.c\
104         main.c
105
106 # Kernel object files built from C source files
107 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
108
109 # Kernel assembly files
110 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm svm_lowlevel.asm
111
112 KERNEL_GAS_SRCS := testvm.s
113
114 # Kernel object files build from assembler source files
115 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
116
117 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
118
119
120 # All kernel object files
121 KERNEL_OBJS := $(KERNEL_C_OBJS) \
122   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
123
124 # Common library source files.
125 # This library is linked into both the kernel and user programs.
126 # It provides string functions and generic printf()-style
127 # formatted output.
128 COMMON_C_SRCS := fmtout.c string.c memmove.c
129
130 # Common library object files.
131 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
132
133
134
135
136 # ----------------------------------------------------------------------
137 # Tools -
138 #   This section defines programs that are used to build GeekOS.
139 # ----------------------------------------------------------------------
140
141 # Uncomment if cross compiling
142 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
143 #TARGET_CC_PREFIX :=  i386-elf-
144
145 # Target C compiler.  gcc 2.95.2 or later should work.
146 TARGET_CC := $(TARGET_CC_PREFIX)gcc
147 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
148
149 # Host C compiler.  This is used to compile programs to execute on
150 # the host platform, not the target (x86) platform.  On x86/ELF
151 # systems, such as Linux and FreeBSD, it can generally be the same
152 # as the target C compiler.
153 HOST_CC := gcc
154
155 # Target linker.  GNU ld is probably to only one that will work.
156 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
157
158 # Target archiver
159 TARGET_AR := $(TARGET_CC_PREFIX)ar
160
161 # Target ranlib
162 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
163
164 # Target nm
165 TARGET_NM := $(TARGET_CC_PREFIX)nm
166
167 # Target objcopy
168 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
169
170 # Nasm (http://nasm.sourceforge.net)
171 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
172 #NASM := /opt/vmm-tools/bin/nasm
173
174 AS = as --32
175
176 # Tool to build PFAT filesystem images.
177 BUILDFAT := tools/builtFat.exe
178
179 # Perl5 or later
180 PERL := perl
181
182 # Pad a file so its size is a multiple of some unit (i.e., sector size)
183 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
184
185 # Create a file filled with zeroes.
186 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
187
188 # Calculate size of file in sectors
189 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
190
191
192 # ----------------------------------------------------------------------
193 # Definitions -
194 #   Options passed to the tools.
195 # ----------------------------------------------------------------------
196
197 # Flags used for all C source files
198 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
199 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
200
201 # Flags used for kernel C source files
202 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
203
204 # Flags user for kernel assembly files
205 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
206
207 # Flags used for common library and libc source files
208 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
209         $(EXTRA_CC_USER_OPTS)
210
211 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
212 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
213
214 # ----------------------------------------------------------------------
215 # Rules -
216 #   Describes how to compile the source files.
217 # ----------------------------------------------------------------------
218
219 # Compilation of kernel C source files
220
221 geekos/%.o : geekos/%.c
222         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
223
224
225 # Compilation of kernel assembly source files
226 geekos/%.o : geekos/%.asm
227         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
228
229 # Compilation of test VM
230 geekos/%.o : geekos/%.s
231         $(AS) $< -o geekos/$*.o
232
233 geekos/%.o : geekos/%.S
234         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
235
236 # Compilation of common library C source files
237 common/%.o : common/%.c
238         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
239
240 # ----------------------------------------------------------------------
241 # Targets -
242 #   Specifies files to be built
243 # ----------------------------------------------------------------------
244
245 # Default target - see definition of ALL_TARGETS in Configuration section
246 all : $(ALL_TARGETS)
247
248
249 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
250         $(NASM) -O99 \
251         -f elf \
252                 -I$(PROJECT_ROOT)/src/geekos/ \
253                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
254         -o $@
255
256
257 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
258         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
259
260 # Standard floppy image - just boots the kernel
261 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
262         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
263         $(PAD) _temp 512
264         cat _temp vm_kernel > $@
265
266 # make ready to boot over PXE
267 pxe:    fd.img
268         cp fd.img /tftpboot/vmm.img
269         $(PAD) /tftpboot/vmm.img 1474560
270
271
272 pxe-discovery-pdinda:   fd.img
273         cp fd.img geekos.img
274         $(PAD) geekos.img 1474560
275         /usr/local/vmm-util/pxe_cp geekos.img
276         /usr/local/vmm-util/tty_perm pdinda
277         echo "Copied file to PXE boot area and set serial permissions for pdinda"
278
279
280 pxe-discovery-bjp600:   fd.img
281         cp fd.img geekos.img
282         $(PAD) geekos.img 1474560
283         /usr/local/vmm-util/pxe_cp geekos.img
284         /usr/local/vmm-util/tty_perm bjp600
285         echo "Copied file to PXE boot area and set serial permissions for pdinda"
286
287
288 # Floppy boot sector (first stage boot loader).
289 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
290         $(NASM) -f bin \
291                 -I$(PROJECT_ROOT)/src/geekos/ \
292                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
293                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
294                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
295                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
296                 -o $@
297
298 # Setup program (second stage boot loader).
299 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
300         $(NASM) -f bin \
301                 -I$(PROJECT_ROOT)/src/geekos/ \
302                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
303                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
304                 -DVMM_SIZE=$(MAX_VMM) \
305                 $(PROJECT_ROOT)/src/geekos/setup.asm \
306                 -o $@
307         $(PAD) $@ 512
308
309 # Loadable (flat) kernel image.
310 geekos/kernel.bin : geekos/kernel.exe
311         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
312         $(PAD) $@ 512
313
314 # The kernel executable and symbol map.
315 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
316         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
317                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
318         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
319
320
321 generate_sizes: force
322         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
323         echo "#define __vmm_sizes" >> $(VMM_SIZES)
324         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
325
326         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
327         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS) geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
328         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
329
330         echo "#define VM_KERNEL_LENGTH (" `$(NUMSECS) vm_kernel` "*512)" >> $(VMM_SIZES)
331         echo "#define VM_KERNEL_START (KERNEL_LOAD_ADDRESS + KERNEL_CORE_LENGTH)" >> $(VMM_SIZES)
332         echo "#define VM_BOOT_PACKAGE_START (VM_KERNEL_START) " >> $(VMM_SIZES)
333         echo "#define VM_BOOT_PACKAGE_END  (VM_KERNEL_START+VM_KERNEL_LENGTH-1) " >> $(VMM_SIZES)
334         echo "#endif" >> $(VMM_SIZES)
335
336 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
337         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
338
339 show_sizes: make_show_sizes
340         ./show_sizes
341
342
343 get_kernel_size: make_show_sizes
344         ./show_sizes | grep 
345
346 force:
347
348
349 vm_kernel: force
350         $(PAD) vm_kernel 512
351         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
352
353
354 # Clean build directories of generated files
355 clean :
356         for d in geekos common libc user tools; do \
357                 (cd $$d && rm -f *); \
358         done
359
360
361 # Build header file dependencies, so source files are recompiled when
362 # header files they depend on are modified.
363 depend : $(GENERATED_LIBC_SRCS)
364         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
365                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
366                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
367                 > depend.mak
368         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
369                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
370                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
371                 >> depend.mak
372
373 # By default, there are no header file dependencies.
374 depend.mak :
375         touch $@
376
377 include depend.mak