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.


added generic VMM 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.9 $
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\
102         main.c
103
104 # Kernel object files built from C source files
105 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
106
107 # Kernel assembly files
108 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm svm_lowlevel.asm
109
110 KERNEL_GAS_SRCS := testvm.s
111
112 # Kernel object files build from assembler source files
113 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
114
115 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
116
117
118 # All kernel object files
119 KERNEL_OBJS := $(KERNEL_C_OBJS) \
120   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
121
122 # Common library source files.
123 # This library is linked into both the kernel and user programs.
124 # It provides string functions and generic printf()-style
125 # formatted output.
126 COMMON_C_SRCS := fmtout.c string.c memmove.c
127
128 # Common library object files.
129 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
130
131
132
133
134 # ----------------------------------------------------------------------
135 # Tools -
136 #   This section defines programs that are used to build GeekOS.
137 # ----------------------------------------------------------------------
138
139 # Uncomment if cross compiling
140 #TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
141 #TARGET_CC_PREFIX :=  i386-elf-
142
143 # Target C compiler.  gcc 2.95.2 or later should work.
144 #TARGET_CC := $(TARGET_CC_PREFIX)gcc
145 TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
146
147 # Host C compiler.  This is used to compile programs to execute on
148 # the host platform, not the target (x86) platform.  On x86/ELF
149 # systems, such as Linux and FreeBSD, it can generally be the same
150 # as the target C compiler.
151 HOST_CC := gcc
152
153 # Target linker.  GNU ld is probably to only one that will work.
154 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
155
156 # Target archiver
157 TARGET_AR := $(TARGET_CC_PREFIX)ar
158
159 # Target ranlib
160 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
161
162 # Target nm
163 TARGET_NM := $(TARGET_CC_PREFIX)nm
164
165 # Target objcopy
166 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
167
168 # Nasm (http://nasm.sourceforge.net)
169 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
170 #NASM := /opt/vmm-tools/bin/nasm
171
172 AS = as --32
173
174 # Tool to build PFAT filesystem images.
175 BUILDFAT := tools/builtFat.exe
176
177 # Perl5 or later
178 PERL := perl
179
180 # Pad a file so its size is a multiple of some unit (i.e., sector size)
181 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
182
183 # Create a file filled with zeroes.
184 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
185
186 # Calculate size of file in sectors
187 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
188
189
190 # ----------------------------------------------------------------------
191 # Definitions -
192 #   Options passed to the tools.
193 # ----------------------------------------------------------------------
194
195 # Flags used for all C source files
196 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
197 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
198
199 # Flags used for kernel C source files
200 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
201
202 # Flags user for kernel assembly files
203 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
204
205 # Flags used for common library and libc source files
206 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
207         $(EXTRA_CC_USER_OPTS)
208
209 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
210 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
211
212 # ----------------------------------------------------------------------
213 # Rules -
214 #   Describes how to compile the source files.
215 # ----------------------------------------------------------------------
216
217 # Compilation of kernel C source files
218
219 geekos/%.o : geekos/%.c
220         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
221
222
223 # Compilation of kernel assembly source files
224 geekos/%.o : geekos/%.asm
225         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
226
227 # Compilation of test VM
228 geekos/%.o : geekos/%.s
229         $(AS) $< -o geekos/$*.o
230
231 geekos/%.o : geekos/%.S
232         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
233
234 # Compilation of common library C source files
235 common/%.o : common/%.c
236         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
237
238 # ----------------------------------------------------------------------
239 # Targets -
240 #   Specifies files to be built
241 # ----------------------------------------------------------------------
242
243 # Default target - see definition of ALL_TARGETS in Configuration section
244 all : $(ALL_TARGETS)
245
246
247 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
248         $(NASM) -O99 \
249         -f elf \
250                 -I$(PROJECT_ROOT)/src/geekos/ \
251                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
252         -o $@
253
254
255 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
256         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
257
258 # Standard floppy image - just boots the kernel
259 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
260         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
261         $(PAD) _temp 512
262         cat _temp vm_kernel > $@
263
264 # make ready to boot over PXE
265 pxe:    fd.img
266         cp fd.img /tftpboot/vmm.img
267         $(PAD) /tftpboot/vmm.img 1474560
268
269
270 pxe-discovery-pdinda:   fd.img
271         cp fd.img geekos.img
272         $(PAD) geekos.img 1474560
273         /usr/local/vmm-util/pxe_cp geekos.img
274         /usr/local/vmm-util/tty_perm pdinda
275         echo "Copied file to PXE boot area and set serial permissions for pdinda"
276
277
278 pxe-discovery-bjp600:   fd.img
279         cp fd.img geekos.img
280         $(PAD) geekos.img 1474560
281         /usr/local/vmm-util/pxe_cp geekos.img
282         /usr/local/vmm-util/tty_perm bjp600
283         echo "Copied file to PXE boot area and set serial permissions for pdinda"
284
285
286 # Floppy boot sector (first stage boot loader).
287 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
288         $(NASM) -f bin \
289                 -I$(PROJECT_ROOT)/src/geekos/ \
290                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
291                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
292                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
293                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
294                 -o $@
295
296 # Setup program (second stage boot loader).
297 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
298         $(NASM) -f bin \
299                 -I$(PROJECT_ROOT)/src/geekos/ \
300                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
301                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
302                 -DVMM_SIZE=$(MAX_VMM) \
303                 $(PROJECT_ROOT)/src/geekos/setup.asm \
304                 -o $@
305         $(PAD) $@ 512
306
307 # Loadable (flat) kernel image.
308 geekos/kernel.bin : geekos/kernel.exe
309         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
310         $(PAD) $@ 512
311
312 # The kernel executable and symbol map.
313 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
314         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
315                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
316         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
317
318
319 generate_sizes: force
320         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
321         echo "#define __vmm_sizes" >> $(VMM_SIZES)
322         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
323
324         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
325         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS) geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
326         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
327
328         echo "#define VM_KERNEL_LENGTH (" `$(NUMSECS) vm_kernel` "*512)" >> $(VMM_SIZES)
329         echo "#define VM_KERNEL_START (KERNEL_LOAD_ADDRESS + KERNEL_CORE_LENGTH)" >> $(VMM_SIZES)
330         echo "#define VM_BOOT_PACKAGE_START (VM_KERNEL_START) " >> $(VMM_SIZES)
331         echo "#define VM_BOOT_PACKAGE_END  (VM_KERNEL_START+VM_KERNEL_LENGTH-1) " >> $(VMM_SIZES)
332         echo "#endif" >> $(VMM_SIZES)
333
334 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
335         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
336
337 show_sizes: make_show_sizes
338         ./show_sizes
339
340
341 get_kernel_size: make_show_sizes
342         ./show_sizes | grep 
343
344 force:
345
346
347 vm_kernel: force
348         $(PAD) vm_kernel 512
349         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
350
351
352 # Clean build directories of generated files
353 clean :
354         for d in geekos common libc user tools; do \
355                 (cd $$d && rm -f *); \
356         done
357
358
359 # Build header file dependencies, so source files are recompiled when
360 # header files they depend on are modified.
361 depend : $(GENERATED_LIBC_SRCS)
362         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
363                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
364                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
365                 > depend.mak
366         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
367                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
368                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
369                 >> depend.mak
370
371 # By default, there are no header file dependencies.
372 depend.mak :
373         touch $@
374
375 include depend.mak