TOPDIR	= .
include Makefile.master

# default configurations
CONFIG_64 ?= \
	$(shell gcc --target-help | grep -q x86_64: && echo -n 1 || echo -n 0)
CONFIG_DEBUG_GDB ?= 0
CONFIG_SPINLOCK_DEBUG ?= 1
CONFIG_TTY_SERIAL ?= 1
CONFIG_CPU_MMU_SPT_USE_PAE ?= 1
CONFIG_PS2KBD_F11PANIC ?= 0
CONFIG_PS2KBD_F12MSG ?= 0
CONFIG_DBGSH ?= 1
CONFIG_LOG_TO_GUEST ?= 0
CONFIG_ACPI_DSDT ?= 1
CONFIG_DISABLE_SLEEP ?= 1
CONFIG_ENABLE_ASSERT ?= 1
CONFIG_VTD_IOMMU ?= 1
CONFIG_VT_EPT ?= 1

# config list
CONFIGLIST :=
CONFIGLIST += CONFIG_64=$(CONFIG_64)[64bit VMM]
CONFIGLIST += CONFIG_SPINLOCK_DEBUG=$(CONFIG_SPINLOCK_DEBUG)[spinlock debug]
CONFIGLIST += CONFIG_TTY_SERIAL=$(CONFIG_TTY_SERIAL)[VMM uses a serial port (COM1) for output]
CONFIGLIST += CONFIG_PS2KBD_F11PANIC=$(CONFIG_PS2KBD_F11PANIC)[Panic when F11 is pressed (PS/2 only)]
CONFIGLIST += CONFIG_PS2KBD_F12MSG=$(CONFIG_PS2KBD_F12MSG)[Print when F12 is pressed (PS/2 only)]
CONFIGLIST += CONFIG_DBGSH=$(CONFIG_DBGSH)[Debug shell access from guest]
CONFIGLIST += CONFIG_LOG_TO_GUEST=$(CONFIG_LOG_TO_GUEST)[Log to guest memory]
CONFIGLIST += CONFIG_ACPI_DSDT=$(CONFIG_ACPI_DSDT)[Parse ACPI DSDT]
CONFIGLIST += CONFIG_DISABLE_SLEEP=$(CONFIG_DISABLE_SLEEP)[Disable ACPI S2 and S3]
CONFIGLIST += CONFIG_ENABLE_ASSERT=$(CONFIG_ENABLE_ASSERT)[Enable checking assertion failure]
CONFIGLIST += CONFIG_VTD_IOMMU=$(CONFIG_VTD_IOMMU)[Enable VT-d IOMMU]
CONFIGLIST += CONFIG_VT_EPT=$(CONFIG_VT_EPT)[Enable VT EPT]

NAME	= vmm
FORMAT	= elf32-i386
TARGET	= $(NAME).elf
MAP	= $(NAME).map
LDS	= vmm.lds
OBJS-1	= core/core.o io/io.o
OBJS	= $(OBJS-1)

.PHONY : all clean config $(OBJS) sloc lint

all : $(TARGET)

clean :
	rm -f $(TARGET) $(MAP)
	$(MAKE) -C core clean
	$(MAKE) -C io clean

config :
	./config.sh

lint:
	$(MAKE) -C core lint
	$(MAKE) -C io lint

$(CONFIG) : Makefile
	echo -n '$(CONFIGLIST)' | tr '[' '#' | tr ']' '\n' | \
		sed 's/^ //' > $(CONFIG)

$(TARGET) $(MAP) : $(LDS) $(OBJS) $(CONFIG)
	$(LD) $(LDFLAGS) $(LDFLAGS2) -o $(TARGET) $(OBJS)
	objcopy --output-format $(FORMAT) $(TARGET)

core/core.o :
	$(MAKE) -C core

io/io.o :
	$(MAKE) -C io
