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.


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