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.


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