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.


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