# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1216350761 -32400
# Node ID 400e5d4877caacf9a9da96b3fe47e76024e27b44
# Parent eb0fc71cfc72ed15ed35fa17617b7cab32164029
# Parent a8603b2fb786958f8e74e9b6d6356eb1beec5b68
merge with xen-unstable.hg
---
stubdom/binutils.patch | 12
stubdom/gcc.patch | 28
tools/firmware/vgabios/vbetables.h | 1282 -----
.hgignore | 7
Config.mk | 8
Makefile | 18
buildconfigs/mk.linux-2.6-tip-latest | 14
buildconfigs/src.git-clone | 60
config/StdGNU.mk | 3
docs/ChangeLog | 3
extras/mini-os/Config.mk | 12
extras/mini-os/Makefile | 4
extras/mini-os/arch/ia64/minios-ia64.lds | 6
extras/mini-os/arch/x86/minios-x86_32.lds | 6
extras/mini-os/arch/x86/minios-x86_64.lds | 6
extras/mini-os/arch/x86/mm.c | 2
extras/mini-os/blkfront.c | 21
extras/mini-os/events.c | 26
extras/mini-os/fbfront.c | 19
extras/mini-os/fs-front.c | 2
extras/mini-os/hypervisor.c | 3
extras/mini-os/include/arch/cc.h | 6
extras/mini-os/include/arch/sys_arch.h | 6
extras/mini-os/include/blkfront.h | 4
extras/mini-os/include/byteswap.h | 2
extras/mini-os/include/console.h | 4
extras/mini-os/include/ctype.h | 5
extras/mini-os/include/err.h | 2
extras/mini-os/include/errno.h | 9
extras/mini-os/include/events.h | 3
extras/mini-os/include/fbfront.h | 2
extras/mini-os/include/fs.h | 4
extras/mini-os/include/hypervisor.h | 4
extras/mini-os/include/ia64/arch_spinlock.h | 2
extras/mini-os/include/ia64/atomic.h | 2
extras/mini-os/include/ia64/efi.h | 2
extras/mini-os/include/ia64/endian.h | 2
extras/mini-os/include/ia64/hypercall-ia64.h | 4
extras/mini-os/include/ia64/os.h | 6
extras/mini-os/include/lib.h | 4
extras/mini-os/include/linux/types.h | 2
extras/mini-os/include/mm.h | 6
extras/mini-os/include/netfront.h | 2
extras/mini-os/include/pcifront.h | 28
extras/mini-os/include/posix/fcntl.h | 11
extras/mini-os/include/posix/limits.h | 41
extras/mini-os/include/posix/sys/mman.h | 3
extras/mini-os/include/posix/sys/select.h | 1
extras/mini-os/include/posix/unistd.h | 5
extras/mini-os/include/sched.h | 9
extras/mini-os/include/semaphore.h | 4
extras/mini-os/include/spinlock.h | 4
extras/mini-os/include/sys/lock.h | 52
extras/mini-os/include/time.h | 2
extras/mini-os/include/types.h | 8
extras/mini-os/include/wait.h | 27
extras/mini-os/include/waittypes.h | 26
extras/mini-os/include/x86/arch_sched.h | 2
extras/mini-os/include/x86/arch_spinlock.h | 4
extras/mini-os/include/x86/os.h | 6
extras/mini-os/include/x86/x86_32/hypercall-x86_32.h | 2
extras/mini-os/include/x86/x86_64/hypercall-x86_64.h | 2
extras/mini-os/include/xmalloc.h | 2
extras/mini-os/kernel.c | 28
extras/mini-os/lib/ctype.c | 2
extras/mini-os/lib/printf.c | 1
extras/mini-os/lib/sys.c | 20
extras/mini-os/lib/xmalloc.c | 4
extras/mini-os/lock.c | 111
extras/mini-os/lwip-net.c | 10
extras/mini-os/main.c | 2
extras/mini-os/minios.mk | 7
extras/mini-os/mm.c | 2
extras/mini-os/netfront.c | 28
extras/mini-os/pcifront.c | 364 +
extras/mini-os/sched.c | 6
extras/mini-os/xenbus/xenbus.c | 53
stubdom/Makefile | 261 -
stubdom/grub.patches/00cvs | 872 +++
stubdom/grub.patches/99minios | 24
stubdom/grub/Makefile | 10
stubdom/grub/mini-os.c | 4
stubdom/libpci.config.h | 2
stubdom/libpci.config.mak | 5
stubdom/lwip.patch-cvs | 1512 ++++++
stubdom/newlib.patch | 234
stubdom/pciutils.patch | 94
tools/Makefile | 35
tools/blktap/drivers/Makefile | 7
tools/blktap/drivers/blktapctrl.c | 109
tools/blktap/drivers/blktapctrl.h | 23
tools/blktap/drivers/blktapctrl_linux.c | 109
tools/blktap/drivers/block-aio.c | 16
tools/blktap/drivers/block-qcow.c | 22
tools/blktap/drivers/block-ram.c | 16
tools/blktap/drivers/block-sync.c | 18
tools/blktap/drivers/img2qcow.c | 6
tools/blktap/drivers/qcow-create.c | 2
tools/blktap/drivers/qcow2raw.c | 6
tools/blktap/drivers/tapdisk.c | 10
tools/blktap/lib/blktaplib.h | 9
tools/blktap/lib/xenbus.c | 6
tools/console/daemon/io.c | 2
tools/examples/network-bridge | 13
tools/examples/vscsi | 22
tools/examples/vtpm-common.sh | 4
tools/examples/xen-backend.agent | 3
tools/examples/xen-backend.rules | 1
tools/examples/xmexample.hvm | 23
tools/examples/xmexample.vti | 22
tools/examples/xmexample1 | 25
tools/examples/xmexample2 | 24
tools/firmware/hvmloader/acpi/build.c | 8
tools/firmware/hvmloader/config.h | 11
tools/firmware/hvmloader/hvmloader.c | 23
tools/firmware/hvmloader/mp_tables.c | 19
tools/firmware/hvmloader/smp.c | 3
tools/firmware/hvmloader/util.h | 6
tools/firmware/rombios/32bit/tcgbios/tcgbios.c | 4
tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c | 12
tools/firmware/rombios/32bit/util.c | 6
tools/firmware/rombios/rombios.c | 24
tools/firmware/vgabios/ChangeLog | 204
tools/firmware/vgabios/Makefile | 16
tools/firmware/vgabios/README | 28
tools/firmware/vgabios/TODO | 4
tools/firmware/vgabios/biossums.c | 220
tools/firmware/vgabios/clext.c | 24
tools/firmware/vgabios/vbe.c | 516 +-
tools/firmware/vgabios/vbe.h | 25
tools/firmware/vgabios/vbe_display_api.txt | 78
tools/firmware/vgabios/vbetables-gen.c | 240 +
tools/firmware/vgabios/vgabios.c | 389 +
tools/firmware/vgabios/vgatables.h | 528 +-
tools/fs-back/fs-backend.c | 7
tools/fs-back/fs-backend.h | 6
tools/fs-back/fs-ops.c | 82
tools/include/xen-sys/MiniOS/privcmd.h | 18
tools/ioemu/Makefile.target | 2
tools/ioemu/hw/e1000.c | 53
tools/ioemu/hw/pass-through.c | 2395
+++++++++-
tools/ioemu/hw/pass-through.h | 175
tools/ioemu/hw/pci.c | 35
tools/ioemu/hw/pt-msi.c | 583 --
tools/ioemu/hw/pt-msi.h | 44
tools/ioemu/hw/vga.c | 207
tools/ioemu/hw/xen_platform.c | 98
tools/ioemu/sdl.c | 3
tools/ioemu/target-i386-dm/exec-dm.c | 4
tools/ioemu/vl.c | 5
tools/ioemu/vl.h | 2
tools/ioemu/xenstore.c | 4
tools/libfsimage/ext2fs/fsys_ext2fs.c | 6
tools/libfsimage/fat/fsys_fat.c | 6
tools/libfsimage/iso9660/fsys_iso9660.c | 6
tools/libfsimage/reiserfs/fsys_reiserfs.c | 6
tools/libfsimage/ufs/fsys_ufs.c | 6
tools/libfsimage/zfs/fsys_zfs.c | 6
tools/libxc/xc_domain.c | 63
tools/libxc/xc_minios.c | 1
tools/libxc/xc_misc.c | 30
tools/libxc/xc_private.c | 2
tools/libxc/xenctrl.h | 26
tools/libxc/xg_private.h | 3
tools/misc/xenperf.c | 4
tools/python/xen/lowlevel/acm/acm.c | 2
tools/python/xen/lowlevel/xc/xc.c | 57
tools/python/xen/util/pci.py | 667 ++
tools/python/xen/util/vscsi_util.py | 133
tools/python/xen/xend/XendAPI.py | 20
tools/python/xen/xend/XendCheckpoint.py | 2
tools/python/xen/xend/XendConfig.py | 175
tools/python/xen/xend/XendDPCI.py | 154
tools/python/xen/xend/XendDevices.py | 3
tools/python/xen/xend/XendDomain.py | 3
tools/python/xen/xend/XendDomainInfo.py | 280 -
tools/python/xen/xend/XendError.py | 11
tools/python/xen/xend/XendNode.py | 54
tools/python/xen/xend/XendPPCI.py | 158
tools/python/xen/xend/image.py | 2
tools/python/xen/xend/osdep.py | 10
tools/python/xen/xend/server/DevController.py | 8
tools/python/xen/xend/server/XMLRPCServer.py | 9
tools/python/xen/xend/server/pciif.py | 75
tools/python/xen/xend/server/vscsiif.py | 232
tools/python/xen/xm/create.py | 103
tools/python/xen/xm/main.py | 137
tools/xcutils/xc_save.c | 123
tools/xenmon/xenbaked.c | 89
tools/xenstat/xentop/xentop.c | 2
tools/xenstore/talloc.c | 2
tools/xenstore/tdb.c | 4
tools/xenstore/xenstore_client.c | 2
tools/xenstore/xenstored_core.c | 17
tools/xentrace/xenctx.c | 32
tools/xentrace/xentrace.c | 28
tools/xm-test/tests/security-acm/10_security-acm_pol_update.py | 5
xen/arch/ia64/xen/fw_emul.c | 5
xen/arch/x86/acpi/cpu_idle.c | 23
xen/arch/x86/acpi/cpufreq/cpufreq_ondemand.c | 2
xen/arch/x86/cpu/intel.c | 32
xen/arch/x86/cpu/mcheck/Makefile | 3
xen/arch/x86/cpu/mcheck/amd_f10.c | 131
xen/arch/x86/cpu/mcheck/amd_k8.c | 324 +
xen/arch/x86/cpu/mcheck/amd_nonfatal.c | 303 +
xen/arch/x86/cpu/mcheck/k7.c | 7
xen/arch/x86/cpu/mcheck/mce.c | 566 ++
xen/arch/x86/cpu/mcheck/mce.h | 26
xen/arch/x86/cpu/mcheck/non-fatal.c | 30
xen/arch/x86/cpu/mcheck/x86_mca.h | 72
xen/arch/x86/domain.c | 17
xen/arch/x86/domctl.c | 51
xen/arch/x86/hpet.c | 15
xen/arch/x86/hvm/hvm.c | 142
xen/arch/x86/hvm/mtrr.c | 27
xen/arch/x86/hvm/rtc.c | 65
xen/arch/x86/hvm/svm/svm.c | 6
xen/arch/x86/hvm/svm/vmcb.c | 4
xen/arch/x86/hvm/vlapic.c | 5
xen/arch/x86/hvm/vmx/vmcs.c | 6
xen/arch/x86/hvm/vmx/vmx.c | 21
xen/arch/x86/i8259.c | 7
xen/arch/x86/irq.c | 42
xen/arch/x86/mm/hap/p2m-ept.c | 95
xen/arch/x86/mm/p2m.c | 22
xen/arch/x86/mm/shadow/common.c | 285 -
xen/arch/x86/mm/shadow/multi.c | 85
xen/arch/x86/mm/shadow/private.h | 11
xen/arch/x86/msi.c | 228
xen/arch/x86/nmi.c | 4
xen/arch/x86/physdev.c | 30
xen/arch/x86/setup.c | 2
xen/arch/x86/smpboot.c | 4
xen/arch/x86/time.c | 210
xen/arch/x86/traps.c | 125
xen/arch/x86/x86_32/asm-offsets.c | 6
xen/arch/x86/x86_32/entry.S | 36
xen/arch/x86/x86_32/traps.c | 9
xen/arch/x86/x86_64/asm-offsets.c | 6
xen/arch/x86/x86_64/compat/entry.S | 35
xen/arch/x86/x86_64/compat/traps.c | 9
xen/arch/x86/x86_64/entry.S | 35
xen/arch/x86/x86_64/mm.c | 3
xen/arch/x86/x86_64/traps.c | 9
xen/common/domain.c | 10
xen/common/domctl.c | 17
xen/common/event_channel.c | 34
xen/common/hvm/save.c | 6
xen/common/memory.c | 36
xen/common/page_alloc.c | 3
xen/common/sched_sedf.c | 26
xen/common/stop_machine.c | 1
xen/common/version.c | 1
xen/drivers/acpi/reboot.c | 1
xen/drivers/passthrough/Makefile | 1
xen/drivers/passthrough/amd/Makefile | 1
xen/drivers/passthrough/amd/iommu_intr.c | 205
xen/drivers/passthrough/amd/iommu_map.c | 49
xen/drivers/passthrough/amd/pci_amd_iommu.c | 133
xen/drivers/passthrough/io.c | 36
xen/drivers/passthrough/iommu.c | 79
xen/drivers/passthrough/pci.c | 203
xen/drivers/passthrough/vtd/dmar.c | 389 -
xen/drivers/passthrough/vtd/dmar.h | 44
xen/drivers/passthrough/vtd/extern.h | 1
xen/drivers/passthrough/vtd/intremap.c | 4
xen/drivers/passthrough/vtd/iommu.c | 481 --
xen/drivers/passthrough/vtd/qinval.c | 4
xen/drivers/passthrough/vtd/utils.c | 75
xen/include/Makefile | 1
xen/include/acpi/cpufreq/processor_perf.h | 2
xen/include/asm-x86/domain.h | 14
xen/include/asm-x86/event.h | 7
xen/include/asm-x86/hvm/hvm.h | 1
xen/include/asm-x86/hvm/support.h | 3
xen/include/asm-x86/hvm/svm/amd-iommu-defs.h | 66
xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 14
xen/include/asm-x86/hvm/vmx/vmx.h | 4
xen/include/asm-x86/hvm/vpt.h | 4
xen/include/asm-x86/io_apic.h | 4
xen/include/asm-x86/mm.h | 9
xen/include/asm-x86/msi.h | 4
xen/include/asm-x86/msr-index.h | 3
xen/include/asm-x86/mtrr.h | 3
xen/include/asm-x86/perfc_defn.h | 9
xen/include/asm-x86/time.h | 4
xen/include/asm-x86/traps.h | 50
xen/include/public/arch-x86/xen-mca.h | 279 +
xen/include/public/arch-x86/xen.h | 4
xen/include/public/domctl.h | 16
xen/include/public/hvm/hvm_op.h | 21
xen/include/public/io/fsif.h | 2
xen/include/public/io/pciif.h | 6
xen/include/public/memory.h | 26
xen/include/public/physdev.h | 11
xen/include/public/xen-compat.h | 2
xen/include/xen/event.h | 12
xen/include/xen/hvm/iommu.h | 5
xen/include/xen/iommu.h | 15
xen/include/xen/pci.h | 42
xen/include/xen/sched.h | 21
xen/include/xen/time.h | 2
xen/include/xsm/xsm.h | 6
xen/xsm/dummy.c | 6
304 files changed, 15866 insertions(+), 4761 deletions(-)
diff -r eb0fc71cfc72 -r 400e5d4877ca .hgignore
--- a/.hgignore Tue Jul 08 11:41:43 2008 +0900
+++ b/.hgignore Fri Jul 18 12:12:41 2008 +0900
@@ -135,9 +135,8 @@
^tools/firmware/rombios/_rombios[^/]*_\.c$
^tools/firmware/rombios/rombios[^/]*\.s$
^tools/firmware/rombios/32bit/32bitbios_flat\.h$
-^tools/firmware/vmxassist/gen$
-^tools/firmware/vmxassist/offsets\.h$
-^tools/firmware/vmxassist/vmxassist$
+^tools/firmware/vgabios/vbetables-gen$
+^tools/firmware/vgabios/vbetables\.h$
^tools/flask/loadpolicy/flask-loadpolicy$
^tools/include/xen/.*$
^tools/include/xen-foreign/.*\.(c|h|size)$
@@ -248,6 +247,8 @@
^tools/xm-test/lib/XmTestLib/config.py$
^tools/xm-test/lib/XmTestReport/xmtest.py$
^tools/xm-test/tests/.*\.test$
+^tools/ioemu-remote
+^tools/ioemu-dir$
^xen/\.banner.*$
^xen/BLOG$
^xen/System.map$
diff -r eb0fc71cfc72 -r 400e5d4877ca Config.mk
--- a/Config.mk Tue Jul 08 11:41:43 2008 +0900
+++ b/Config.mk Fri Jul 18 12:12:41 2008 +0900
@@ -78,6 +78,14 @@ FLASK_ENABLE ?= n
FLASK_ENABLE ?= n
ACM_SECURITY ?= n
+QEMU_REMOTE=http://xenbits.xensource.com/git-http/qemu-xen-unstable.git
+
+# Specify which qemu-dm to use. This may be `ioemu' to use the old
+# Mercurial in-tree version, or a local directory, or a git URL.
+# CONFIG_QEMU ?= ioemu
+# CONFIG_QEMU ?= ../qemu-xen.git
+CONFIG_QEMU ?= $(QEMU_REMOTE)
+
# Optional components
XENSTAT_XENTOP ?= y
VTPM_TOOLS ?= n
diff -r eb0fc71cfc72 -r 400e5d4877ca Makefile
--- a/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -15,12 +15,13 @@ include buildconfigs/Rules.mk
# build and install everything into the standard system directories
.PHONY: install
-install: install-xen install-kernels install-tools install-docs
+install: install-xen install-kernels install-tools install-stubdom install-docs
.PHONY: build
build: kernels
$(MAKE) -C xen build
$(MAKE) -C tools build
+ $(MAKE) -C stubdom build
$(MAKE) -C docs build
# The test target is for unit tests that can run without an installation. Of
@@ -33,7 +34,7 @@ test:
# build and install everything into local dist directory
.PHONY: dist
dist: DESTDIR=$(DISTDIR)/install
-dist: dist-xen dist-kernels dist-tools dist-docs
+dist: dist-xen dist-kernels dist-tools dist-stubdom dist-docs
$(INSTALL_DIR) $(DISTDIR)/check
$(INSTALL_DATA) ./COPYING $(DISTDIR)
$(INSTALL_DATA) ./README $(DISTDIR)
@@ -44,10 +45,11 @@ dist-%: install-%
@: # do nothing
# Legacy dist targets
-.PHONY: xen tools kernels docs
+.PHONY: xen tools stubdom kernels docs
xen: dist-xen
tools: dist-tools
kernels: dist-kernels
+stubdom: dist-stubdom
docs: dist-docs
.PHONY: prep-kernels
@@ -65,6 +67,10 @@ install-tools:
.PHONY: install-kernels
install-kernels:
for i in $(XKERNELS) ; do $(MAKE) $$i-install || exit 1; done
+
+.PHONY: install-stubdom
+install-stubdom:
+ $(MAKE) -C stubdom install
.PHONY: install-docs
install-docs:
@@ -102,6 +108,7 @@ clean::
clean::
$(MAKE) -C xen clean
$(MAKE) -C tools clean
+ $(MAKE) -C stubdom crossclean
$(MAKE) -C docs clean
# clean, but blow away kernel build tree plus tarballs
@@ -109,6 +116,7 @@ distclean:
distclean:
$(MAKE) -C xen distclean
$(MAKE) -C tools distclean
+ $(MAKE) -C stubdom distclean
$(MAKE) -C docs distclean
rm -rf dist patches/tmp
for i in $(ALLKERNELS) ; do $(MAKE) $$i-delete ; done
@@ -132,6 +140,7 @@ help:
@echo ' install-xen - build and install the Xen hypervisor'
@echo ' install-tools - build and install the control tools'
@echo ' install-kernels - build and install guest kernels'
+ @echo ' install-stubdom - build and install the stubdomain images'
@echo ' install-docs - build and install user documentation'
@echo ''
@echo 'Building targets:'
@@ -140,6 +149,7 @@ help:
@echo ' trees then make dist'
@echo ' xen - build and install Xen hypervisor'
@echo ' tools - build and install tools'
+ @echo ' stubdomain - build and install the stubdomain images'
@echo ' kernels - build and install guest kernels'
@echo ' kbuild - synonym for make kernels'
@echo ' docs - build and install user documentation'
@@ -214,7 +224,7 @@ linux26:
# tboot targets
#
-TBOOT_TARFILE = tboot-20071128.tar.gz
+TBOOT_TARFILE = tboot-20080613.tar.gz
TBOOT_BASE_URL = http://downloads.sourceforge.net/tboot
.PHONY: build-tboot
diff -r eb0fc71cfc72 -r 400e5d4877ca buildconfigs/mk.linux-2.6-tip-latest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildconfigs/mk.linux-2.6-tip-latest Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,14 @@
+XEN_LINUX_SOURCE ?= git-clone
+LINUX_VER ?= 2.6-x86-latest
+
+IMAGE_TARGET ?= bzImage vmlinux
+
+XEN_LINUX_CONFIG_UPDATE := buildconfigs/enable-xen-config
+
+XEN_LINUX_GIT_URL ?=
git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-tip.git
+XEN_LINUX_GIT_REMOTENAME ?= x86
+XEN_LINUX_GIT_REMOTEBRANCH ?= auto-latest
+
+EXTRAVERSION ?=
+
+include buildconfigs/mk.linux-2.6-common
diff -r eb0fc71cfc72 -r 400e5d4877ca buildconfigs/src.git-clone
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildconfigs/src.git-clone Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,60 @@
+# Mercurial
+GIT ?= git
+
+LINUX_SRCDIR ?= linux-$(LINUX_VER).git
+
+# The URL of the remote GIT repository
+ifeq ($(XEN_LINUX_GIT_URL),)
+.ERROR: XEN_LINUX_GIT_URL not specified
+endif
+
+# The name to use for the remote repository
+XEN_LINUX_GIT_REMOTENAME ?= origin
+
+# The branch in the remote repository
+ifeq ($(XEN_LINUX_GIT_REMOTEBRANCH),)
+.ERROR: XEN_LINUX_GIT_REMOTEBRANCH not specified
+endif
+
+XEN_LINUX_GIT_LOCALBRANCH ?= master
+
+# Set XEN_LINUX_GITREV to update to a particlar revision.
+XEN_LINUX_GITREV ?=
+
+$(LINUX_SRCDIR)/.valid-src: $(__XEN_LINUX_UPDATE)
+ @set -e ; if [ -d $(LINUX_SRCDIR) ] && [ ! -d $(GIT_DIR) ] ; then \
+ echo "$(LINUX_SRCDIR) exists but is not a git repository." 1>&2 ; \
+ false ; \
+ fi
+
+ @set -e ; if [ ! -e $(LINUX_SRCDIR)/.git ] ; then \
+ mkdir $(LINUX_SRCDIR) ; \
+ cd $(LINUX_SRCDIR) ; \
+ $(GIT) init-db ; \
+ fi
+
+ @set -e ; cd $(LINUX_SRCDIR) ; \
+ if ! $(GIT) remote | grep -q $(XEN_LINUX_GIT_REMOTENAME) ; then \
+ echo "Adding remote git repository \`$(XEN_LINUX_GIT_URL)' as
\`$(XEN_LINUX_GIT_REMOTENAME)'" ; \
+ $(GIT) remote add $(XEN_LINUX_GIT_REMOTENAME) $(XEN_LINUX_GIT_URL)
; \
+ fi
+
+ @echo "Updating remote \`$(XEN_LINUX_GIT_REMOTENAME)'"
+ @cd $(LINUX_SRCDIR) && $(GIT) fetch $(XEN_LINUX_GIT_REMOTENAME)
+
+ @set -e ; cd $(LINUX_SRCDIR) ; \
+ if ! $(GIT) branch -l | grep -q $(XEN_LINUX_GIT_LOCALBRANCH) ; then \
+ $(GIT) branch --track $(XEN_LINUX_GIT_LOCALBRANCH) \
+ $(XEN_LINUX_GIT_REMOTENAME)/$(XEN_LINUX_GIT_REMOTEBRANCH) ; \
+ $(GIT) checkout ; \
+ fi
+
+ @ set -e ; cd $(LINUX_SRCDIR) ; \
+ if [ -n "$(XEN_LINUX_GITREV)" ] ; then \
+ echo "Updating $(LINUX_SRCDIR) to revision \'$(XEN_LINUX_GITREV)'."
; \
+ $(GIT) reset --hard $(XEN_LINUX_GITREV) ; \
+ else \
+ $(GIT) reset --hard
$(XEN_LINUX_GIT_REMOTENAME)/$(XEN_LINUX_GIT_REMOTEBRANCH) ; \
+ fi
+
+ touch $@
diff -r eb0fc71cfc72 -r 400e5d4877ca config/StdGNU.mk
--- a/config/StdGNU.mk Tue Jul 08 11:41:43 2008 +0900
+++ b/config/StdGNU.mk Fri Jul 18 12:12:41 2008 +0900
@@ -12,6 +12,9 @@ SIZEUTIL = $(CROSS_COMPILE)size
MSGFMT = msgfmt
MSGMERGE = msgmerge
+
+# Allow git to be wrappered in the environment
+GIT ?= git
INSTALL = install
INSTALL_DIR = $(INSTALL) -d -m0755 -p
diff -r eb0fc71cfc72 -r 400e5d4877ca docs/ChangeLog
--- a/docs/ChangeLog Tue Jul 08 11:41:43 2008 +0900
+++ b/docs/ChangeLog Fri Jul 18 12:12:41 2008 +0900
@@ -15,6 +15,9 @@ http://lists.xensource.com/archives/html
Xen 3.3 release
---------------
+
+17974: PHYSDEVOP_manage_pci_add/PHYSDEVOP_manage_pci_remove
+http://xenbits.xensource.com/xen-unstable.hg?rev/183ca809e1d7
17903: Add greater than 16 xvd device availability
http://xenbits.xensource.com/xen-unstable.hg?rev/0728459b3c8d
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/Config.mk
--- a/extras/mini-os/Config.mk Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/Config.mk Fri Jul 18 12:12:41 2008 +0900
@@ -38,20 +38,20 @@ EXTRA_INC = $(ARCH_INC)
# This must be before include minios.mk!
include $(MINI-OS_ROOT)/$(TARGET_ARCH_DIR)/arch.mk
-extra_incl := $(foreach dir,$(EXTRA_INC),-I$(MINI-OS_ROOT)/include/$(dir))
+extra_incl := $(foreach dir,$(EXTRA_INC),-isystem
$(CURDIR)/$(MINI-OS_ROOT)/include/$(dir))
-DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include
+DEF_CPPFLAGS += -isystem $(CURDIR)/$(MINI-OS_ROOT)/include
DEF_CPPFLAGS += -D__MINIOS__
ifeq ($(libc),y)
DEF_CPPFLAGS += -DHAVE_LIBC
-DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include/posix
-DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore
+DEF_CPPFLAGS += -isystem $(CURDIR)/$(MINI-OS_ROOT)/include/posix
+DEF_CPPFLAGS += -isystem $(CURDIR)/$(XEN_ROOT)/tools/xenstore
endif
ifneq ($(LWIPDIR),)
lwip=y
DEF_CPPFLAGS += -DHAVE_LWIP
-DEF_CPPFLAGS += -I$(LWIPDIR)/src/include
-DEF_CPPFLAGS += -I$(LWIPDIR)/src/include/ipv4
+DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include
+DEF_CPPFLAGS += -isystem $(LWIPDIR)/src/include/ipv4
endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/Makefile
--- a/extras/mini-os/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -55,6 +55,8 @@ endif
.PHONY: links
links: $(ARCH_LINKS)
[ -e include/xen ] || ln -sf ../../../xen/include/public include/xen
+ [ -e include/mini-os ] || ln -sf . include/mini-os
+ [ -e include/$(TARGET_ARCH_FAM)/mini-os ] || ln -sf .
include/$(TARGET_ARCH_FAM)/mini-os
.PHONY: arch_lib
arch_lib:
@@ -89,7 +91,7 @@ endif
endif
$(OBJ_DIR)/$(TARGET)_app.o: $(APP_OBJS) app.lds
- $(LD) -r -d $(LDFLAGS) $^ $(APP_LDLIBS) --undefined main -o $@
+ $(LD) -r -d $(LDFLAGS) -\( $^ -\) $(APP_LDLIBS) --undefined main -o $@
$(OBJ_DIR)/$(TARGET): links $(OBJS) $(OBJ_DIR)/$(TARGET)_app.o arch_lib
$(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(OBJ_DIR)/$(TARGET)_app.o $(OBJS)
$(LDARCHLIB) $(LDLIBS) -o $@.o
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/ia64/minios-ia64.lds
--- a/extras/mini-os/arch/ia64/minios-ia64.lds Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/arch/ia64/minios-ia64.lds Fri Jul 18 12:12:41 2008 +0900
@@ -55,8 +55,8 @@ SECTIONS
.ctors : {
__CTOR_LIST__ = .;
QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
- *(SORT_BY_NAME(.ctors))
- SORT_BY_NAME(CONSTRUCTORS)
+ *(.ctors)
+ CONSTRUCTORS
QUAD(0)
__CTOR_END__ = .;
}
@@ -64,7 +64,7 @@ SECTIONS
.dtors : {
__DTOR_LIST__ = .;
QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2)
- *(SORT_BY_NAME(.dtors))
+ *(.dtors)
QUAD(0)
__DTOR_END__ = .;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/minios-x86_32.lds
--- a/extras/mini-os/arch/x86/minios-x86_32.lds Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/arch/x86/minios-x86_32.lds Fri Jul 18 12:12:41 2008 +0900
@@ -31,8 +31,8 @@ SECTIONS
.ctors : {
__CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
- *(SORT_BY_NAME(.ctors))
- SORT_BY_NAME(CONSTRUCTORS)
+ *(.ctors)
+ CONSTRUCTORS
LONG(0)
__CTOR_END__ = .;
}
@@ -40,7 +40,7 @@ SECTIONS
.dtors : {
__DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
- *(SORT_BY_NAME(.dtors))
+ *(.dtors)
LONG(0)
__DTOR_END__ = .;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/minios-x86_64.lds
--- a/extras/mini-os/arch/x86/minios-x86_64.lds Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/arch/x86/minios-x86_64.lds Fri Jul 18 12:12:41 2008 +0900
@@ -31,8 +31,8 @@ SECTIONS
.ctors : {
__CTOR_LIST__ = .;
QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
- *(SORT_BY_NAME(.ctors))
- SORT_BY_NAME(CONSTRUCTORS)
+ *(.ctors)
+ CONSTRUCTORS
QUAD(0)
__CTOR_END__ = .;
}
@@ -40,7 +40,7 @@ SECTIONS
.dtors : {
__DTOR_LIST__ = .;
QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2)
- *(SORT_BY_NAME(.dtors))
+ *(.dtors)
QUAD(0)
__DTOR_END__ = .;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/arch/x86/mm.c
--- a/extras/mini-os/arch/x86/mm.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/arch/x86/mm.c Fri Jul 18 12:12:41 2008 +0900
@@ -549,7 +549,7 @@ void arch_init_p2m(unsigned long max_pfn
#define L2_P2M_MASK (L2_P2M_ENTRIES - 1)
#define L3_P2M_MASK (L3_P2M_ENTRIES - 1)
- unsigned long *l1_list, *l2_list, *l3_list;
+ unsigned long *l1_list = NULL, *l2_list = NULL, *l3_list;
unsigned long pfn;
l3_list = (unsigned long *)alloc_page();
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/blkfront.c
--- a/extras/mini-os/blkfront.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/blkfront.c Fri Jul 18 12:12:41 2008 +0900
@@ -84,7 +84,7 @@ static void free_blkfront(struct blkfron
free(dev);
}
-struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info)
+struct blkfront_dev *init_blkfront(char *_nodename, struct blkfront_info *info)
{
xenbus_transaction_t xbt;
char* err;
@@ -93,11 +93,9 @@ struct blkfront_dev *init_blkfront(char
int retry=0;
char* msg;
char* c;
+ char* nodename = _nodename ? _nodename : "device/vbd/768";
struct blkfront_dev *dev;
-
- if (!nodename)
- nodename = "device/vbd/768";
char path[strlen(nodename) + 1 + 10 + 1];
@@ -342,13 +340,14 @@ void blkfront_io(struct blkfront_aiocb *
void blkfront_io(struct blkfront_aiocb *aiocbp, int write)
{
unsigned long flags;
+ DEFINE_WAIT(w);
+
ASSERT(!aiocbp->aio_cb);
aiocbp->aio_cb = blkfront_aio_cb;
blkfront_aio(aiocbp, write);
aiocbp->data = NULL;
local_irq_save(flags);
- DEFINE_WAIT(w);
while (1) {
blkfront_aio_poll(aiocbp->aio_dev);
if (aiocbp->data)
@@ -393,6 +392,7 @@ void blkfront_sync(struct blkfront_dev *
void blkfront_sync(struct blkfront_dev *dev)
{
unsigned long flags;
+ DEFINE_WAIT(w);
if (dev->info.mode == O_RDWR) {
if (dev->info.barrier == 1)
@@ -404,7 +404,6 @@ void blkfront_sync(struct blkfront_dev *
/* Note: This won't finish if another thread enqueues requests. */
local_irq_save(flags);
- DEFINE_WAIT(w);
while (1) {
blkfront_aio_poll(dev);
if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring))
@@ -424,6 +423,7 @@ int blkfront_aio_poll(struct blkfront_de
RING_IDX rp, cons;
struct blkif_response *rsp;
int more;
+ int nr_consumed;
moretodo:
#ifdef HAVE_LIBC
@@ -437,14 +437,17 @@ moretodo:
rmb(); /* Ensure we see queued responses up to 'rp'. */
cons = dev->ring.rsp_cons;
- int nr_consumed = 0;
+ nr_consumed = 0;
while ((cons != rp))
{
+ struct blkfront_aiocb *aiocbp;
+ int status;
+
rsp = RING_GET_RESPONSE(&dev->ring, cons);
nr_consumed++;
- struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id;
- int status = rsp->status;
+ aiocbp = (void*) (uintptr_t) rsp->id;
+ status = rsp->status;
if (status != BLKIF_RSP_OKAY)
printk("block error %d for op %d\n", status, rsp->operation);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/events.c
--- a/extras/mini-os/events.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/events.c Fri Jul 18 12:12:41 2008 +0900
@@ -136,6 +136,23 @@ evtchn_port_t bind_virq(uint32_t virq, e
return op.port;
}
+evtchn_port_t bind_pirq(uint32_t pirq, int will_share, evtchn_handler_t
handler, void *data)
+{
+ evtchn_bind_pirq_t op;
+
+ /* Try to bind the pirq to a port */
+ op.pirq = pirq;
+ op.flags = will_share ? BIND_PIRQ__WILL_SHARE : 0;
+
+ if ( HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &op) != 0 )
+ {
+ printk("Failed to bind physical IRQ %d\n", pirq);
+ return -1;
+ }
+ bind_evtchn(op.port, handler, data);
+ return op.port;
+}
+
#if defined(__x86_64__)
char irqstack[2 * STACK_SIZE];
@@ -190,10 +207,11 @@ int evtchn_alloc_unbound(domid_t pal, ev
int evtchn_alloc_unbound(domid_t pal, evtchn_handler_t handler,
void *data, evtchn_port_t
*port)
{
+ int err;
evtchn_alloc_unbound_t op;
op.dom = DOMID_SELF;
op.remote_dom = pal;
- int err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
+ err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
if (err)
return err;
*port = bind_evtchn(op.port, handler, data);
@@ -207,13 +225,15 @@ int evtchn_bind_interdomain(domid_t pal,
evtchn_handler_t handler, void *data,
evtchn_port_t *local_port)
{
+ int err;
+ evtchn_port_t port;
evtchn_bind_interdomain_t op;
op.remote_dom = pal;
op.remote_port = remote_port;
- int err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
+ err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
if (err)
return err;
- evtchn_port_t port = op.local_port;
+ port = op.local_port;
*local_port = bind_evtchn(port, handler, data);
return err;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/fbfront.c
--- a/extras/mini-os/fbfront.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/fbfront.c Fri Jul 18 12:12:41 2008 +0900
@@ -64,7 +64,7 @@ static void free_kbdfront(struct kbdfron
free(dev);
}
-struct kbdfront_dev *init_kbdfront(char *nodename, int abs_pointer)
+struct kbdfront_dev *init_kbdfront(char *_nodename, int abs_pointer)
{
xenbus_transaction_t xbt;
char* err;
@@ -72,11 +72,8 @@ struct kbdfront_dev *init_kbdfront(char
struct xenkbd_page *s;
int retry=0;
char* msg;
-
+ char* nodename = _nodename ? _nodename : "device/vkbd/0";
struct kbdfront_dev *dev;
-
- if (!nodename)
- nodename = "device/vkbd/0";
char path[strlen(nodename) + 1 + 10 + 1];
@@ -351,7 +348,7 @@ int fbfront_receive(struct fbfront_dev *
return i;
}
-struct fbfront_dev *init_fbfront(char *nodename, unsigned long *mfns, int
width, int height, int depth, int stride, int n)
+struct fbfront_dev *init_fbfront(char *_nodename, unsigned long *mfns, int
width, int height, int depth, int stride, int n)
{
xenbus_transaction_t xbt;
char* err;
@@ -361,9 +358,9 @@ struct fbfront_dev *init_fbfront(char *n
char* msg;
int i, j;
struct fbfront_dev *dev;
-
- if (!nodename)
- nodename = "device/vfb/0";
+ int max_pd;
+ unsigned long mapped;
+ char* nodename = _nodename ? _nodename : "device/vfb/0";
char path[strlen(nodename) + 1 + 10 + 1];
@@ -392,8 +389,8 @@ struct fbfront_dev *init_fbfront(char *n
dev->offset = 0;
dev->events = NULL;
- const int max_pd = sizeof(s->pd) / sizeof(s->pd[0]);
- unsigned long mapped = 0;
+ max_pd = sizeof(s->pd) / sizeof(s->pd[0]);
+ mapped = 0;
for (i = 0; mapped < n && i < max_pd; i++) {
unsigned long *pd = (unsigned long *) alloc_page();
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/fs-front.c
--- a/extras/mini-os/fs-front.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/fs-front.c Fri Jul 18 12:12:41 2008 +0900
@@ -3,7 +3,7 @@
*
* Frontend driver for FS split device driver.
*
- * Copyright (c) 2007, Grzegorz Milos, Sun Microsystems, Inc.
+ * Copyright (c) 2007, Grzegorz Milos, <gm281@xxxxxxxxx>.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/hypervisor.c
--- a/extras/mini-os/hypervisor.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/hypervisor.c Fri Jul 18 12:12:41 2008 +0900
@@ -72,9 +72,10 @@ void do_hypervisor_callback(struct pt_re
void force_evtchn_callback(void)
{
+ int save;
vcpu_info_t *vcpu;
vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()];
- int save = vcpu->evtchn_upcall_mask;
+ save = vcpu->evtchn_upcall_mask;
while (vcpu->evtchn_upcall_pending) {
vcpu->evtchn_upcall_mask = 1;
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/arch/cc.h
--- a/extras/mini-os/include/arch/cc.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/arch/cc.h Fri Jul 18 12:12:41 2008 +0900
@@ -10,8 +10,8 @@
#define __LWIP_ARCH_CC_H__
/* Typedefs for the types used by lwip - */
-#include <os.h>
-#include <types.h>
+#include <mini-os/os.h>
+#include <mini-os/types.h>
#include <time.h>
typedef u8 u8_t;
typedef s8 s8_t;
@@ -46,7 +46,7 @@ extern void lwip_die(char *fmt, ...);
/* If the compiler does not provide memset() this file must include a */
/* definition of it, or include a file which defines it. */
-#include <lib.h>
+#include <mini-os/lib.h>
/* This file must either include a system-local <errno.h> which defines */
/* the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/arch/sys_arch.h
--- a/extras/mini-os/include/arch/sys_arch.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/arch/sys_arch.h Fri Jul 18 12:12:41 2008 +0900
@@ -9,9 +9,9 @@
#ifndef __LWIP_ARCH_SYS_ARCH_H__
#define __LWIP_ARCH_SYS_ARCH_H__
-#include <os.h>
-#include <xmalloc.h>
-#include <semaphore.h>
+#include <mini-os/os.h>
+#include <mini-os/xmalloc.h>
+#include <mini-os/semaphore.h>
typedef struct semaphore *sys_sem_t;
#define SYS_SEM_NULL ((sys_sem_t) NULL)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/blkfront.h
--- a/extras/mini-os/include/blkfront.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/blkfront.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,6 +1,6 @@
-#include <wait.h>
+#include <mini-os/wait.h>
#include <xen/io/blkif.h>
-#include <types.h>
+#include <mini-os/types.h>
struct blkfront_dev;
struct blkfront_aiocb
{
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/byteswap.h
--- a/extras/mini-os/include/byteswap.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/byteswap.h Fri Jul 18 12:12:41 2008 +0900
@@ -3,7 +3,7 @@
/* Unfortunately not provided by newlib. */
-#include <types.h>
+#include <mini-os/types.h>
static inline uint16_t bswap_16(uint16_t x)
{
return
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/console.h
--- a/extras/mini-os/include/console.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/console.h Fri Jul 18 12:12:41 2008 +0900
@@ -36,8 +36,8 @@
#ifndef _LIB_CONSOLE_H_
#define _LIB_CONSOLE_H_
-#include<os.h>
-#include<traps.h>
+#include<mini-os/os.h>
+#include<mini-os/traps.h>
#include<stdarg.h>
void print(int direct, const char *fmt, va_list args);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ctype.h
--- a/extras/mini-os/include/ctype.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/ctype.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,6 +1,9 @@
#ifndef _CTYPE_H
#define _CTYPE_H
+#ifdef HAVE_LIBC
+#include_next <ctype.h>
+#else
/*
* NOTE! This ctype does not handle EOF like the standard C
* library is required to.
@@ -53,3 +56,5 @@ static inline unsigned char __toupper(un
#define toupper(c) __toupper(c)
#endif
+
+#endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/err.h
--- a/extras/mini-os/include/err.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/err.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,7 +1,7 @@
#ifndef _ERR_H
#define _ERR_H
-#include <errno.h>
+#include <mini-os/errno.h>
/*
* Kernel pointers have redundant information, so we can use a
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/errno.h
--- a/extras/mini-os/include/errno.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/errno.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,7 +1,9 @@
#ifndef _ERRNO_H
#define _ERRNO_H
-#include <errno-base.h>
+#include <mini-os/errno-base.h>
+
+typedef int error_t;
#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
@@ -107,8 +109,11 @@
#define EOWNERDEAD 130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */
+
+#define EFTYPE 132 /* Inappropriate file type or format */
+
#ifdef HAVE_LIBC
-#include <sched.h>
+#include <mini-os/sched.h>
extern int errno;
#define ERRNO
#define errno (get_current()->reent._errno)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/events.h
--- a/extras/mini-os/include/events.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/events.h Fri Jul 18 12:12:41 2008 +0900
@@ -19,7 +19,7 @@
#ifndef _EVENTS_H_
#define _EVENTS_H_
-#include<traps.h>
+#include<mini-os/traps.h>
#include<xen/event_channel.h>
typedef void (*evtchn_handler_t)(evtchn_port_t, struct pt_regs *, void *);
@@ -27,6 +27,7 @@ typedef void (*evtchn_handler_t)(evtchn_
/* prototypes */
int do_event(evtchn_port_t port, struct pt_regs *regs);
evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data);
+evtchn_port_t bind_pirq(uint32_t pirq, int will_share, evtchn_handler_t
handler, void *data);
evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler,
void *data);
void unbind_evtchn(evtchn_port_t port);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/fbfront.h
--- a/extras/mini-os/include/fbfront.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/fbfront.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,6 +1,6 @@
#include <xen/io/kbdif.h>
#include <xen/io/fbif.h>
-#include <wait.h>
+#include <mini-os/wait.h>
/* from <linux/input.h> */
#ifndef BTN_LEFT
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/fs.h
--- a/extras/mini-os/include/fs.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/fs.h Fri Jul 18 12:12:41 2008 +0900
@@ -2,8 +2,8 @@
#define __FS_H__
#include <xen/io/fsif.h>
-#include <semaphore.h>
-#include <types.h>
+#include <mini-os/semaphore.h>
+#include <mini-os/types.h>
struct fs_import
{
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/hypervisor.h
--- a/extras/mini-os/include/hypervisor.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/hypervisor.h Fri Jul 18 12:12:41 2008 +0900
@@ -13,7 +13,7 @@
#ifndef _HYPERVISOR_H_
#define _HYPERVISOR_H_
-#include <types.h>
+#include <mini-os/types.h>
#include <xen/xen.h>
#if defined(__i386__)
#include <hypercall-x86_32.h>
@@ -24,7 +24,7 @@
#else
#error "Unsupported architecture"
#endif
-#include <traps.h>
+#include <mini-os/traps.h>
/*
* a placeholder for the start of day information passed up from the hypervisor
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/arch_spinlock.h
--- a/extras/mini-os/include/ia64/arch_spinlock.h Tue Jul 08 11:41:43
2008 +0900
+++ b/extras/mini-os/include/ia64/arch_spinlock.h Fri Jul 18 12:12:41
2008 +0900
@@ -27,7 +27,7 @@
#include "atomic.h"
-#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
+#define ARCH_SPIN_LOCK_UNLOCKED { 0 }
#define SPIN_LOCK_UNUSED 0
#define SPIN_LOCK_USED 1
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/atomic.h
--- a/extras/mini-os/include/ia64/atomic.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/ia64/atomic.h Fri Jul 18 12:12:41 2008 +0900
@@ -38,7 +38,7 @@
#if !defined(__ASSEMBLY__)
-#include <types.h>
+#include <mini-os/types.h>
/*
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/efi.h
--- a/extras/mini-os/include/ia64/efi.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/ia64/efi.h Fri Jul 18 12:12:41 2008 +0900
@@ -32,7 +32,7 @@
#ifndef _EFI_H_
#define _EFI_H_
-#include "types.h"
+#include <mini-os/types.h>
#define EFIWARN(a) (a)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/endian.h
--- a/extras/mini-os/include/ia64/endian.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/ia64/endian.h Fri Jul 18 12:12:41 2008 +0900
@@ -26,7 +26,7 @@
#if !defined(_ENDIAN_H_)
#define _ENDIAN_H_
-#include "types.h"
+#include <mini-os/types.h>
#if !defined(__ASSEMBLY__)
diff -r eb0fc71cfc72 -r 400e5d4877ca
extras/mini-os/include/ia64/hypercall-ia64.h
--- a/extras/mini-os/include/ia64/hypercall-ia64.h Tue Jul 08 11:41:43
2008 +0900
+++ b/extras/mini-os/include/ia64/hypercall-ia64.h Fri Jul 18 12:12:41
2008 +0900
@@ -34,8 +34,8 @@
#ifndef __HYPERCALL_H__
#define __HYPERCALL_H__
-#include "lib.h" /* memcpy() */
-#include "errno.h" /* ENOSYS() */
+#include <mini-os/lib.h> /* memcpy() */
+#include <mini-os/errno.h> /* ENOSYS() */
#include <xen/event_channel.h>
#include <xen/sched.h>
#include <xen/version.h>
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/ia64/os.h
--- a/extras/mini-os/include/ia64/os.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/ia64/os.h Fri Jul 18 12:12:41 2008 +0900
@@ -27,15 +27,15 @@
#if !defined(__ASSEMBLY__)
-#include "types.h"
+#include <mini-os/types.h>
#include "endian.h"
#include "ia64_cpu.h"
#include "atomic.h"
#include "efi.h"
#include "sal.h"
#include "pal.h"
-#include "hypervisor.h"
-#include <kernel.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/kernel.h>
typedef uint64_t paddr_t; /* Physical address. */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/lib.h
--- a/extras/mini-os/include/lib.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/lib.h Fri Jul 18 12:12:41 2008 +0900
@@ -99,13 +99,13 @@ char * strcat(char * dest, const char *
char * strcat(char * dest, const char * src);
char *strdup(const char *s);
#endif
-#include <console.h>
+#include <mini-os/console.h>
#define RAND_MIX 2654435769U
int rand(void);
-#include <xenbus.h>
+#include <mini-os/xenbus.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/linux/types.h
--- a/extras/mini-os/include/linux/types.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/linux/types.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,5 +1,5 @@
#ifndef _LINUX_TYPES_H_
#define _LINUX_TYPES_H_
-#include <types.h>
+#include <mini-os/types.h>
typedef u64 __u64;
#endif /* _LINUX_TYPES_H_ */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/mm.h Fri Jul 18 12:12:41 2008 +0900
@@ -35,10 +35,10 @@
#error "Unsupported architecture"
#endif
-#include <lib.h>
+#include <mini-os/lib.h>
-#include <arch_limits.h>
-#include <arch_mm.h>
+#include <mini-os/arch_limits.h>
+#include <mini-os/arch_mm.h>
#define STACK_SIZE_PAGE_ORDER __STACK_SIZE_PAGE_ORDER
#define STACK_SIZE __STACK_SIZE
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/netfront.h
--- a/extras/mini-os/include/netfront.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/netfront.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,4 +1,4 @@
-#include <wait.h>
+#include <mini-os/wait.h>
#ifdef HAVE_LWIP
#include <lwip/netif.h>
#endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/pcifront.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/include/pcifront.h Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,28 @@
+#include <mini-os/types.h>
+#include <xen/io/pciif.h>
+struct pcifront_dev;
+struct pcifront_dev *init_pcifront(char *nodename);
+void pcifront_op(struct pcifront_dev *dev, struct xen_pci_op *op);
+void pcifront_scan(struct pcifront_dev *dev, void (*fun)(unsigned int domain,
unsigned int bus, unsigned slot, unsigned int fun));
+int pcifront_conf_read(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long fun,
+ unsigned int off, unsigned int size, unsigned int *val);
+int pcifront_conf_write(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long fun,
+ unsigned int off, unsigned int size, unsigned int val);
+int pcifront_enable_msi(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun);
+int pcifront_disable_msi(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun);
+int pcifront_enable_msix(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun,
+ struct xen_msix_entry *entries, int n);
+int pcifront_disable_msix(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun);
+void shutdown_pcifront(struct pcifront_dev *dev);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/fcntl.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/include/posix/fcntl.h Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,11 @@
+#ifndef _POSIX_FCNTL_H
+#define _POSIX_FCNTL_H
+
+#include_next <fcntl.h>
+
+#define F_ULOCK 0
+#define F_LOCK 1
+#define F_TLOCK 2
+#define F_TEST 3
+
+#endif /* _POSIX_FCNTL_H */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/limits.h
--- a/extras/mini-os/include/posix/limits.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/posix/limits.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,9 +1,46 @@
#ifndef _POSIX_LIMITS_H
#define _POSIX_LIMITS_H
-#include_next <limits.h>
-#include <arch_limits.h>
+#include <mini-os/arch_limits.h>
+
+#define CHAR_BIT 8
+
+#define SCHAR_MAX 0x7f
+#define SCHAR_MIN (-SCHAR_MAX-1)
+#define UCHAR_MAX 0xff
+
+#ifdef __CHAR_UNSIGNED__
+# define CHAR_MIN 0
+# define CHAR_MAX UCHAR_MAX
+#else
+# define CHAR_MIN SCHAR_MIN
+# define CHAR_MAX SCHAR_MAX
+#endif
+
+#define INT_MAX 0x7fffffff
+#define INT_MIN (-INT_MAX-1)
+#define UINT_MAX 0xffffffff
+
+#define SHRT_MAX 0x7fff
+
+#if defined(__x86_64__) || defined(__ia64__)
+# define LONG_MAX 0x7fffffffffffffffL
+# define ULONG_MAX 0xffffffffffffffffUL
+#else
+# define LONG_MAX 0x7fffffffL
+# define ULONG_MAX 0xffffffffUL
+#endif
+#define LONG_MIN (-LONG_MAX-1L)
+
+#define LLONG_MAX 0x7fffffffffffffffLL
+#define LLONG_MIN (-LLONG_MAX-1LL)
+#define ULLONG_MAX 0xffffffffffffffffULL
+
+#define LONG_LONG_MIN LLONG_MIN
+#define LONG_LONG_MAX LLONG_MAX
+#define ULONG_LONG_MAX ULLONG_MAX
#define PATH_MAX __PAGE_SIZE
+#define PAGE_SIZE __PAGE_SIZE
#endif /* _POSIX_LIMITS_H */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/sys/mman.h
--- a/extras/mini-os/include/posix/sys/mman.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/posix/sys/mman.h Fri Jul 18 12:12:41 2008 +0900
@@ -9,6 +9,9 @@
#define MAP_PRIVATE 0x02
#define MAP_ANON 0x20
+/* Pages are always resident anyway */
+#define MAP_LOCKED 0x0
+
#define MAP_FAILED ((void*)0)
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t
offset);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/sys/select.h
--- a/extras/mini-os/include/posix/sys/select.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/posix/sys/select.h Fri Jul 18 12:12:41 2008 +0900
@@ -2,6 +2,7 @@
#define _POSIX_SELECT_H
#include <sys/time.h>
+#include <lwip/sockets.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
#endif /* _POSIX_SELECT_H */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/posix/unistd.h
--- a/extras/mini-os/include/posix/unistd.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/posix/unistd.h Fri Jul 18 12:12:41 2008 +0900
@@ -2,11 +2,8 @@
#define _POSIX_UNISTD_H
#include_next <unistd.h>
-#include <sys/select.h>
-#include <arch_limits.h>
-#define getpagesize() __PAGE_SIZE
-
+size_t getpagesize(void);
int ftruncate(int fd, off_t length);
#endif /* _POSIX_UNISTD_H */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/sched.h
--- a/extras/mini-os/include/sched.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/sched.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,9 +1,12 @@
#ifndef __SCHED_H__
#define __SCHED_H__
-#include <list.h>
-#include <time.h>
-#include <arch_sched.h>
+#include <mini-os/list.h>
+#include <mini-os/time.h>
+#include <mini-os/arch_sched.h>
+#ifdef HAVE_LIBC
+#include <sys/reent.h>
+#endif
struct thread
{
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/semaphore.h
--- a/extras/mini-os/include/semaphore.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/semaphore.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,8 +1,8 @@
#ifndef _SEMAPHORE_H_
#define _SEMAPHORE_H_
-#include <wait.h>
-#include <spinlock.h>
+#include <mini-os/wait.h>
+#include <mini-os/spinlock.h>
/*
* Implementation of semaphore in Mini-os is simple, because
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/spinlock.h
--- a/extras/mini-os/include/spinlock.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/spinlock.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,7 +1,7 @@
#ifndef __ASM_SPINLOCK_H
#define __ASM_SPINLOCK_H
-#include <lib.h>
+#include <mini-os/lib.h>
/*
* Your basic SMP spinlocks, allowing only a single CPU anywhere
@@ -12,7 +12,7 @@ typedef struct {
} spinlock_t;
-#include "arch_spinlock.h"
+#include <mini-os/arch_spinlock.h>
#define SPINLOCK_MAGIC 0xdead4ead
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/sys/lock.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/include/sys/lock.h Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,52 @@
+#ifndef _MINIOS_SYS_LOCK_H_
+#define _MINIOS_SYS_LOCK_H_
+
+#ifdef HAVE_LIBC
+
+/* Due to inclusion loop, we can not include sched.h, so have to hide things */
+
+#include <mini-os/waittypes.h>
+
+
+typedef struct {
+ int busy;
+ struct wait_queue_head wait;
+} _LOCK_T;
+
+#define __LOCK_INIT(class,lock) \
+ class _LOCK_T lock = { .wait = __WAIT_QUEUE_HEAD_INITIALIZER(lock.wait) }
+int ___lock_init(_LOCK_T *lock);
+int ___lock_acquire(_LOCK_T *lock);
+int ___lock_try_acquire(_LOCK_T *lock);
+int ___lock_release(_LOCK_T *lock);
+int ___lock_close(_LOCK_T *lock);
+#define __lock_init(__lock) ___lock_init(&__lock)
+#define __lock_acquire(__lock) ___lock_acquire(&__lock)
+#define __lock_release(__lock) ___lock_release(&__lock)
+#define __lock_try_acquire(__lock) ___lock_try_acquire(&__lock)
+#define __lock_close(__lock) 0
+
+
+typedef struct {
+ struct thread *owner;
+ int count;
+ struct wait_queue_head wait;
+} _LOCK_RECURSIVE_T;
+
+#define __LOCK_INIT_RECURSIVE(class, lock) \
+ class _LOCK_RECURSIVE_T lock = { .wait =
__WAIT_QUEUE_HEAD_INITIALIZER((lock).wait) }
+
+int ___lock_init_recursive(_LOCK_RECURSIVE_T *lock);
+int ___lock_acquire_recursive(_LOCK_RECURSIVE_T *lock);
+int ___lock_try_acquire_recursive(_LOCK_RECURSIVE_T *lock);
+int ___lock_release_recursive(_LOCK_RECURSIVE_T *lock);
+int ___lock_close_recursive(_LOCK_RECURSIVE_T *lock);
+#define __lock_init_recursive(__lock) ___lock_init_recursive(&__lock)
+#define __lock_acquire_recursive(__lock) ___lock_acquire_recursive(&__lock)
+#define __lock_release_recursive(__lock) ___lock_release_recursive(&__lock)
+#define __lock_try_acquire_recursive(__lock)
___lock_try_acquire_recursive(&__lock)
+#define __lock_close_recursive(__lock) 0
+
+#endif
+
+#endif /* _MINIOS_SYS_LOCK_H_ */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/time.h
--- a/extras/mini-os/include/time.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/time.h Fri Jul 18 12:12:41 2008 +0900
@@ -19,7 +19,7 @@
#ifndef _MINIOS_TIME_H_
#define _MINIOS_TIME_H_
-#include <types.h>
+#include <mini-os/types.h>
/*
* System Time
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/types.h
--- a/extras/mini-os/include/types.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/types.h Fri Jul 18 12:12:41 2008 +0900
@@ -36,9 +36,11 @@ typedef unsigned long u64;
#endif
/* FreeBSD compat types */
+#ifndef HAVE_LIBC
typedef unsigned char u_char;
typedef unsigned int u_int;
typedef unsigned long u_long;
+#endif
#ifdef __i386__
typedef long long quad_t;
typedef unsigned long long u_quad_t;
@@ -79,11 +81,13 @@ typedef u64 uint64_t, uintmax_t;
typedef u64 uint64_t, uintmax_t;
typedef s64 int64_t, intmax_t;
typedef u64 off_t;
+#endif
+typedef intptr_t ptrdiff_t;
-#define INT_MAX ((int)(~0U>>1))
-#define UINT_MAX (~0U)
+#ifndef HAVE_LIBC
typedef long ssize_t;
#endif
+
#endif /* _TYPES_H_ */
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/wait.h
--- a/extras/mini-os/include/wait.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/wait.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,30 +1,9 @@
#ifndef __WAIT_H__
#define __WAIT_H__
-#include <sched.h>
-#include <list.h>
-#include <lib.h>
-#include <os.h>
-
-struct wait_queue
-{
- struct thread *thread;
- struct list_head thread_list;
-};
-
-struct wait_queue_head
-{
- /* TODO - lock required? */
- struct list_head thread_list;
-};
-
-#define DECLARE_WAIT_QUEUE_HEAD(name) \
- struct wait_queue_head name = \
- { .thread_list = { &(name).thread_list, &(name).thread_list} }
-
-#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \
- .thread_list = { &(name).thread_list, &(name).thread_list } }
-
+#include <mini-os/sched.h>
+#include <mini-os/os.h>
+#include <mini-os/waittypes.h>
#define DEFINE_WAIT(name) \
struct wait_queue name = { \
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/waittypes.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/include/waittypes.h Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,26 @@
+#ifndef __WAITTYPE_H__
+#define __WAITTYPE_H__
+
+#include <mini-os/list.h>
+
+struct thread;
+struct wait_queue
+{
+ struct thread *thread;
+ struct list_head thread_list;
+};
+
+struct wait_queue_head
+{
+ /* TODO - lock required? */
+ struct list_head thread_list;
+};
+
+#define DECLARE_WAIT_QUEUE_HEAD(name) \
+ struct wait_queue_head name = \
+ { .thread_list = { &(name).thread_list, &(name).thread_list} }
+
+#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \
+ .thread_list = { &(name).thread_list, &(name).thread_list } }
+
+#endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/arch_sched.h
--- a/extras/mini-os/include/x86/arch_sched.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/x86/arch_sched.h Fri Jul 18 12:12:41 2008 +0900
@@ -2,7 +2,7 @@
#ifndef __ARCH_SCHED_H__
#define __ARCH_SCHED_H__
-#include <arch_limits.h>
+#include "arch_limits.h"
static inline struct thread* get_current(void)
{
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/arch_spinlock.h
--- a/extras/mini-os/include/x86/arch_spinlock.h Tue Jul 08 11:41:43
2008 +0900
+++ b/extras/mini-os/include/x86/arch_spinlock.h Fri Jul 18 12:12:41
2008 +0900
@@ -3,11 +3,11 @@
#ifndef __ARCH_ASM_SPINLOCK_H
#define __ARCH_ASM_SPINLOCK_H
-#include <lib.h>
+#include <mini-os/lib.h>
#include "os.h"
-#define ARCH_SPIN_LOCK_UNLOCKED (spinlock_t) { 1 }
+#define ARCH_SPIN_LOCK_UNLOCKED { 1 }
/*
* Simple spin lock operations. There are two variants, one clears IRQ's
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/x86/os.h
--- a/extras/mini-os/include/x86/os.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/x86/os.h Fri Jul 18 12:12:41 2008 +0900
@@ -16,9 +16,9 @@
#ifndef __ASSEMBLY__
-#include <types.h>
-#include <hypervisor.h>
-#include <kernel.h>
+#include <mini-os/types.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/kernel.h>
#define USED __attribute__ ((used))
diff -r eb0fc71cfc72 -r 400e5d4877ca
extras/mini-os/include/x86/x86_32/hypercall-x86_32.h
--- a/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h Tue Jul 08
11:41:43 2008 +0900
+++ b/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h Fri Jul 18
12:12:41 2008 +0900
@@ -33,7 +33,7 @@
#include <xen/xen.h>
#include <xen/sched.h>
#include <xen/nmi.h>
-#include <mm.h>
+#include <mini-os/mm.h>
#define __STR(x) #x
#define STR(x) __STR(x)
diff -r eb0fc71cfc72 -r 400e5d4877ca
extras/mini-os/include/x86/x86_64/hypercall-x86_64.h
--- a/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h Tue Jul 08
11:41:43 2008 +0900
+++ b/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h Fri Jul 18
12:12:41 2008 +0900
@@ -36,7 +36,7 @@
#include <xen/xen.h>
#include <xen/sched.h>
-#include <mm.h>
+#include <mini-os/mm.h>
#define __STR(x) #x
#define STR(x) __STR(x)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/include/xmalloc.h
--- a/extras/mini-os/include/xmalloc.h Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/include/xmalloc.h Fri Jul 18 12:12:41 2008 +0900
@@ -10,6 +10,8 @@
#define xfree(ptr) free(ptr)
#else
+
+#include <limits.h>
#define DEFAULT_ALIGN (sizeof(unsigned long))
#define malloc(size) _xmalloc(size, DEFAULT_ALIGN)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/kernel.c Fri Jul 18 12:12:41 2008 +0900
@@ -40,6 +40,7 @@
#include <netfront.h>
#include <blkfront.h>
#include <fbfront.h>
+#include <pcifront.h>
#include <fs.h>
#include <xmalloc.h>
#include <fcntl.h>
@@ -431,6 +432,29 @@ static void kbdfront_thread(void *p)
}
}
+static struct pcifront_dev *pci_dev;
+
+static void pcifront_thread(void *p)
+{
+ void print(unsigned int domain, unsigned int bus, unsigned int slot,
unsigned int fun)
+ {
+ unsigned int vendor, device, rev, class;
+
+ pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x00, 2, &vendor);
+ pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x02, 2, &device);
+ pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x08, 1, &rev);
+ pcifront_conf_read(pci_dev, domain, bus, slot, fun, 0x0a, 2, &class);
+
+ printk("%04x:%02x:%02x.%02x %04x: %04x:%04x (rev %02x)\n", domain,
bus, slot, fun, class, vendor, device, rev);
+ }
+
+ pci_dev = init_pcifront(NULL);
+ if (!pci_dev)
+ return;
+ printk("PCI devices:\n");
+ pcifront_scan(pci_dev, print);
+}
+
static void fs_thread(void *p)
{
init_fs_frontend();
@@ -446,6 +470,7 @@ __attribute__((weak)) int app_main(start
create_thread("blkfront", blkfront_thread, si);
create_thread("fbfront", fbfront_thread, si);
create_thread("kbdfront", kbdfront_thread, si);
+ create_thread("pcifront", pcifront_thread, si);
create_thread("fs-frontend", fs_thread, si);
return 0;
}
@@ -524,6 +549,9 @@ void stop_kernel(void)
if (kbd_dev)
shutdown_kbdfront(kbd_dev);
+ if (pci_dev)
+ shutdown_pcifront(pci_dev);
+
/* TODO: fs import */
local_irq_disable();
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/ctype.c
--- a/extras/mini-os/lib/ctype.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/lib/ctype.c Fri Jul 18 12:12:41 2008 +0900
@@ -1,3 +1,4 @@
+#ifndef HAVE_LIBC
#include <ctype.h>
unsigned char _ctype[] = {
@@ -25,3 +26,4 @@ _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_
_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */
_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */
_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */
+#endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/printf.c
--- a/extras/mini-os/lib/printf.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/lib/printf.c Fri Jul 18 12:12:41 2008 +0900
@@ -62,6 +62,7 @@
#include <lib.h>
#include <mm.h>
#include <ctype.h>
+#include <limits.h>
/**
* simple_strtoul - convert a string to an unsigned long
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/sys.c
--- a/extras/mini-os/lib/sys.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/lib/sys.c Fri Jul 18 12:12:41 2008 +0900
@@ -733,7 +733,7 @@ static int select_poll(int nfds, fd_set
FD_CLR(i, exceptfds);
break;
case FTYPE_CONSOLE:
- if (FD_ISSET(i, writefds)) {
+ if (FD_ISSET(i, readfds)) {
if (xencons_ring_avail())
n++;
else
@@ -1094,6 +1094,11 @@ int clock_gettime(clockid_t clk_id, stru
return 0;
}
+size_t getpagesize(void)
+{
+ return PAGE_SIZE;
+}
+
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t
offset)
{
unsigned long n = (length + PAGE_SIZE - 1) / PAGE_SIZE;
@@ -1185,6 +1190,7 @@ void sparse(unsigned long data, size_t s
/* Not supported by FS yet. */
unsupported_function_crash(link);
unsupported_function(int, readlink, -1);
+unsupported_function_crash(umask);
/* We could support that. */
unsupported_function_log(int, chdir, -1);
@@ -1207,6 +1213,18 @@ unsupported_function(int, sigaltstack, -
unsupported_function(int, sigaltstack, -1);
unsupported_function_crash(kill);
+/* Unsupported */
+unsupported_function_crash(pipe);
+unsupported_function_crash(fork);
+unsupported_function_crash(execv);
+unsupported_function_crash(execve);
+unsupported_function_crash(waitpid);
+unsupported_function_crash(wait);
+unsupported_function_crash(lockf);
+unsupported_function_crash(sysconf);
+unsupported_function(int, tcsetattr, -1);
+unsupported_function(int, tcgetattr, 0);
+
/* Linuxish abi for the Caml runtime, don't support */
unsupported_function_log(struct dirent *, readdir64, NULL);
unsupported_function_log(int, getrusage, -1);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lib/xmalloc.c
--- a/extras/mini-os/lib/xmalloc.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/lib/xmalloc.c Fri Jul 18 12:12:41 2008 +0900
@@ -139,7 +139,7 @@ static void *xmalloc_whole_pages(size_t
void *_xmalloc(size_t size, size_t align)
{
- struct xmalloc_hdr *i, *hdr = NULL;
+ struct xmalloc_hdr *i, *tmp, *hdr = NULL;
uintptr_t data_begin;
size_t hdr_size;
/* unsigned long flags; */
@@ -155,7 +155,7 @@ void *_xmalloc(size_t size, size_t align
/* Search free list. */
/* spin_lock_irqsave(&freelist_lock, flags); */
- list_for_each_entry( i, &freelist, freelist )
+ list_for_each_entry_safe( i, tmp, &freelist, freelist )
{
data_begin = align_up((uintptr_t)i + hdr_size, align);
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lock.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/lock.c Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,111 @@
+/*
+ * locks for newlib
+ *
+ * Samuel Thibault <Samuel.Thibault@xxxxxxxxxxxxx>, July 20008
+ */
+
+#ifdef HAVE_LIBC
+
+#include <sys/lock.h>
+#include <sched.h>
+#include <wait.h>
+
+int ___lock_init(_LOCK_T *lock)
+{
+ lock->busy = 0;
+ init_waitqueue_head(&lock->wait);
+ return 0;
+}
+
+int ___lock_acquire(_LOCK_T *lock)
+{
+ unsigned long flags;
+ while(1) {
+ wait_event(lock->wait, !lock->busy);
+ local_irq_save(flags);
+ if (!lock->busy)
+ break;
+ local_irq_restore(flags);
+ }
+ lock->busy = 1;
+ local_irq_restore(flags);
+ return 0;
+}
+
+int ___lock_try_acquire(_LOCK_T *lock)
+{
+ unsigned long flags;
+ int ret = -1;
+ local_irq_save(flags);
+ if (!lock->busy) {
+ lock->busy = 1;
+ ret = 0;
+ }
+ local_irq_restore(flags);
+ return ret;
+}
+
+int ___lock_release(_LOCK_T *lock)
+{
+ unsigned long flags;
+ local_irq_save(flags);
+ lock->busy = 0;
+ wake_up(&lock->wait);
+ local_irq_restore(flags);
+ return 0;
+}
+
+
+int ___lock_init_recursive(_LOCK_RECURSIVE_T *lock)
+{
+ lock->owner = NULL;
+ init_waitqueue_head(&lock->wait);
+ return 0;
+}
+
+int ___lock_acquire_recursive(_LOCK_RECURSIVE_T *lock)
+{
+ unsigned long flags;
+ if (lock->owner != get_current()) {
+ while (1) {
+ wait_event(lock->wait, lock->owner == NULL);
+ local_irq_save(flags);
+ if (lock->owner == NULL)
+ break;
+ local_irq_restore(flags);
+ }
+ lock->owner = get_current();
+ local_irq_restore(flags);
+ }
+ lock->count++;
+ return 0;
+}
+
+int ___lock_try_acquire_recursive(_LOCK_RECURSIVE_T *lock)
+{
+ unsigned long flags;
+ int ret = -1;
+ local_irq_save(flags);
+ if (!lock->owner) {
+ ret = 0;
+ lock->owner = get_current();
+ lock->count++;
+ }
+ local_irq_restore(flags);
+ return ret;
+}
+
+int ___lock_release_recursive(_LOCK_RECURSIVE_T *lock)
+{
+ unsigned long flags;
+ BUG_ON(lock->owner != get_current());
+ if (--lock->count)
+ return 0;
+ local_irq_save(flags);
+ lock->owner = NULL;
+ wake_up(&lock->wait);
+ local_irq_restore(flags);
+ return 0;
+}
+
+#endif
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/lwip-net.c
--- a/extras/mini-os/lwip-net.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/lwip-net.c Fri Jul 18 12:12:41 2008 +0900
@@ -93,6 +93,9 @@ static err_t
static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
+ if (!dev)
+ return ERR_OK;
+
#ifdef ETH_PAD_SIZE
pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endif
@@ -342,7 +345,7 @@ void start_networking(void)
struct ip_addr ipaddr = { htonl(IF_IPADDR) };
struct ip_addr netmask = { htonl(IF_NETMASK) };
struct ip_addr gw = { 0 };
- char *ip;
+ char *ip = NULL;
tprintk("Waiting for network.\n");
@@ -380,5 +383,6 @@ void start_networking(void)
/* Shut down the network */
void stop_networking(void)
{
- shutdown_netfront(dev);
-}
+ if (dev)
+ shutdown_netfront(dev);
+}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/main.c
--- a/extras/mini-os/main.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/main.c Fri Jul 18 12:12:41 2008 +0900
@@ -52,6 +52,7 @@ static void call_main(void *p)
#ifdef CONFIG_QEMU
char *vm;
char path[128];
+ int domid;
#endif
int i;
@@ -74,7 +75,6 @@ static void call_main(void *p)
}
/* Fetch argc, argv from XenStore */
- int domid;
domid = xenbus_read_integer("target");
if (domid == -1) {
printk("Couldn't read target\n");
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/minios.mk
--- a/extras/mini-os/minios.mk Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/minios.mk Fri Jul 18 12:12:41 2008 +0900
@@ -6,13 +6,14 @@ debug = y
# Define some default flags.
# NB. '-Wcast-qual' is nasty, so I omitted it.
-DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
+DEF_CFLAGS += -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
-Wno-redundant-decls
DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
+DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline)
DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
-DEF_ASFLAGS = -D__ASSEMBLY__
-DEF_LDFLAGS =
+DEF_ASFLAGS += -D__ASSEMBLY__
+DEF_LDFLAGS +=
ifeq ($(debug),y)
DEF_CFLAGS += -g
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/mm.c
--- a/extras/mini-os/mm.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/mm.c Fri Jul 18 12:12:41 2008 +0900
@@ -361,6 +361,7 @@ void free_pages(void *pointer, int order
}
+#ifndef __ia64__
int free_physical_pages(xen_pfn_t *mfns, int n)
{
struct xen_memory_reservation reservation;
@@ -371,6 +372,7 @@ int free_physical_pages(xen_pfn_t *mfns,
reservation.domid = DOMID_SELF;
return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
}
+#endif
#ifdef HAVE_LIBC
void *sbrk(ptrdiff_t increment)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/netfront.c
--- a/extras/mini-os/netfront.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/netfront.c Fri Jul 18 12:12:41 2008 +0900
@@ -95,8 +95,9 @@ static inline int xennet_rxidx(RING_IDX
void network_rx(struct netfront_dev *dev)
{
- RING_IDX rp,cons;
+ RING_IDX rp,cons,req_prod;
struct netif_rx_response *rx;
+ int nr_consumed, some, more, i, notify;
moretodo:
@@ -104,12 +105,13 @@ moretodo:
rmb(); /* Ensure we see queued responses up to 'rp'. */
cons = dev->rx.rsp_cons;
- int nr_consumed=0;
- int some = 0;
+ nr_consumed = 0;
+ some = 0;
while ((cons != rp) && !some)
{
struct net_buffer* buf;
unsigned char* page;
+ int id;
rx = RING_GET_RESPONSE(&dev->rx, cons);
@@ -122,7 +124,7 @@ moretodo:
if (rx->status == NETIF_RSP_NULL) continue;
- int id = rx->id;
+ id = rx->id;
BUG_ON(id >= NET_TX_RING_SIZE);
buf = &dev->rx_buffers[id];
@@ -151,19 +153,15 @@ moretodo:
}
dev->rx.rsp_cons=cons;
- int more;
RING_FINAL_CHECK_FOR_RESPONSES(&dev->rx,more);
if(more && !some) goto moretodo;
- RING_IDX req_prod = dev->rx.req_prod_pvt;
-
- int i;
- netif_rx_request_t *req;
+ req_prod = dev->rx.req_prod_pvt;
for(i=0; i<nr_consumed; i++)
{
int id = xennet_rxidx(req_prod + i);
- req = RING_GET_REQUEST(&dev->rx, req_prod + i);
+ netif_rx_request_t *req = RING_GET_REQUEST(&dev->rx, req_prod + i);
struct net_buffer* buf = &dev->rx_buffers[id];
void* page = buf->page;
@@ -178,7 +176,6 @@ moretodo:
dev->rx.req_prod_pvt = req_prod + i;
- int notify;
RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&dev->rx, notify);
if (notify)
notify_remote_via_evtchn(dev->evtchn);
@@ -199,6 +196,7 @@ void network_tx_buf_gc(struct netfront_d
for (cons = dev->tx.rsp_cons; cons != prod; cons++)
{
struct netif_tx_response *txrsp;
+ struct net_buffer *buf;
txrsp = RING_GET_RESPONSE(&dev->tx, cons);
if (txrsp->status == NETIF_RSP_NULL)
@@ -209,7 +207,7 @@ void network_tx_buf_gc(struct netfront_d
id = txrsp->id;
BUG_ON(id >= NET_TX_RING_SIZE);
- struct net_buffer* buf = &dev->tx_buffers[id];
+ buf = &dev->tx_buffers[id];
gnttab_end_access(buf->gref);
buf->gref=GRANT_INVALID_REF;
@@ -298,7 +296,7 @@ static void free_netfront(struct netfron
free(dev);
}
-struct netfront_dev *init_netfront(char *nodename, void
(*thenetif_rx)(unsigned char* data, int len), unsigned char rawmac[6], char
**ip)
+struct netfront_dev *init_netfront(char *_nodename, void
(*thenetif_rx)(unsigned char* data, int len), unsigned char rawmac[6], char
**ip)
{
xenbus_transaction_t xbt;
char* err;
@@ -308,11 +306,9 @@ struct netfront_dev *init_netfront(char
int retry=0;
int i;
char* msg;
+ char* nodename = _nodename ? _nodename : "device/vif/0";
struct netfront_dev *dev;
-
- if (!nodename)
- nodename = "device/vif/0";
char path[strlen(nodename) + 1 + 10 + 1];
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/pcifront.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/pcifront.c Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,364 @@
+/* Minimal PCI driver for Mini-OS.
+ * Copyright (c) 2007-2008 Samuel Thibault.
+ * Based on blkfront.c.
+ */
+
+#include <os.h>
+#include <xenbus.h>
+#include <events.h>
+#include <errno.h>
+#include <gnttab.h>
+#include <xmalloc.h>
+#include <wait.h>
+#include <pcifront.h>
+
+#define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07))
+
+DECLARE_WAIT_QUEUE_HEAD(pcifront_queue);
+
+struct pcifront_dev {
+ domid_t dom;
+
+ struct xen_pci_sharedinfo *info;
+ grant_ref_t info_ref;
+ evtchn_port_t evtchn;
+
+ char *nodename;
+ char *backend;
+
+ xenbus_event_queue events;
+};
+
+void pcifront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
+{
+ wake_up(&pcifront_queue);
+}
+
+static void free_pcifront(struct pcifront_dev *dev)
+{
+ mask_evtchn(dev->evtchn);
+
+ free(dev->backend);
+
+ gnttab_end_access(dev->info_ref);
+ free_page(dev->info);
+
+ unbind_evtchn(dev->evtchn);
+
+ free(dev->nodename);
+ free(dev);
+}
+
+struct pcifront_dev *init_pcifront(char *_nodename)
+{
+ xenbus_transaction_t xbt;
+ char* err;
+ char* message=NULL;
+ int retry=0;
+ char* msg;
+ char* nodename = _nodename ? _nodename : "device/pci/0";
+
+ struct pcifront_dev *dev;
+
+ char path[strlen(nodename) + 1 + 10 + 1];
+
+ printk("******************* PCIFRONT for %s **********\n\n\n", nodename);
+
+ dev = malloc(sizeof(*dev));
+ memset(dev, 0, sizeof(*dev));
+ dev->nodename = strdup(nodename);
+
+ snprintf(path, sizeof(path), "%s/backend-id", nodename);
+ dev->dom = xenbus_read_integer(path);
+ evtchn_alloc_unbound(dev->dom, pcifront_handler, dev, &dev->evtchn);
+
+ dev->info = (struct xen_pci_sharedinfo*) alloc_page();
+ memset(dev->info,0,PAGE_SIZE);
+
+ dev->info_ref = gnttab_grant_access(dev->dom,virt_to_mfn(dev->info),0);
+
+ dev->events = NULL;
+
+again:
+ err = xenbus_transaction_start(&xbt);
+ if (err) {
+ printk("starting transaction\n");
+ }
+
+ err = xenbus_printf(xbt, nodename, "pci-op-ref","%u",
+ dev->info_ref);
+ if (err) {
+ message = "writing pci-op-ref";
+ goto abort_transaction;
+ }
+ err = xenbus_printf(xbt, nodename,
+ "event-channel", "%u", dev->evtchn);
+ if (err) {
+ message = "writing event-channel";
+ goto abort_transaction;
+ }
+ err = xenbus_printf(xbt, nodename,
+ "magic", XEN_PCI_MAGIC);
+ if (err) {
+ message = "writing magic";
+ goto abort_transaction;
+ }
+
+ err = xenbus_printf(xbt, nodename, "state", "%u",
+ 3); /* initialised */
+
+
+ err = xenbus_transaction_end(xbt, 0, &retry);
+ if (retry) {
+ goto again;
+ printk("completing transaction\n");
+ }
+
+ goto done;
+
+abort_transaction:
+ xenbus_transaction_end(xbt, 1, &retry);
+ goto error;
+
+done:
+
+ snprintf(path, sizeof(path), "%s/backend", nodename);
+ msg = xenbus_read(XBT_NIL, path, &dev->backend);
+ if (msg) {
+ printk("Error %s when reading the backend path %s\n", msg, path);
+ goto error;
+ }
+
+ printk("backend at %s\n", dev->backend);
+
+ {
+ char path[strlen(dev->backend) + 1 + 5 + 1];
+ snprintf(path, sizeof(path), "%s/state", dev->backend);
+
+ xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
+
+ xenbus_wait_for_value(path, "4", &dev->events);
+
+ xenbus_printf(xbt, nodename, "state", "%u", 4); /* connected */
+ }
+ unmask_evtchn(dev->evtchn);
+
+ printk("**************************\n");
+
+ return dev;
+
+error:
+ free_pcifront(dev);
+ return NULL;
+}
+
+void pcifront_scan(struct pcifront_dev *dev, void (*func)(unsigned int domain,
unsigned int bus, unsigned slot, unsigned int fun))
+{
+ char path[strlen(dev->backend) + 1 + 5 + 10 + 1];
+ int i, n;
+ char *s, *msg;
+ unsigned int domain, bus, slot, fun;
+
+ snprintf(path, sizeof(path), "%s/num_devs", dev->backend);
+ n = xenbus_read_integer(path);
+
+ for (i = 0; i < n; i++) {
+ snprintf(path, sizeof(path), "%s/vdev-%d", dev->backend, i);
+ msg = xenbus_read(XBT_NIL, path, &s);
+ if (msg) {
+ printk("Error %s when reading the PCI root name at %s\n", path);
+ continue;
+ }
+
+ if (sscanf(s, "%x:%x:%x.%x", &domain, &bus, &slot, &fun) != 4) {
+ printk("\"%s\" does not look like a PCI device address\n", s);
+ free(s);
+ continue;
+ }
+ free(s);
+
+ func(domain, bus, slot, fun);
+ }
+}
+
+void shutdown_pcifront(struct pcifront_dev *dev)
+{
+ char* err;
+ char *nodename = dev->nodename;
+
+ char path[strlen(dev->backend) + 1 + 5 + 1];
+
+ printk("close pci: backend at %s\n",dev->backend);
+
+ snprintf(path, sizeof(path), "%s/state", dev->backend);
+ err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 5); /* closing */
+ xenbus_wait_for_value(path, "5", &dev->events);
+
+ err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 6);
+ xenbus_wait_for_value(path, "6", &dev->events);
+
+ err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
+ xenbus_wait_for_value(path, "2", &dev->events);
+
+ xenbus_unwatch_path(XBT_NIL, path);
+
+ snprintf(path, sizeof(path), "%s/info-ref", nodename);
+ xenbus_rm(XBT_NIL, path);
+ snprintf(path, sizeof(path), "%s/event-channel", nodename);
+ xenbus_rm(XBT_NIL, path);
+
+ free_pcifront(dev);
+}
+
+
+void pcifront_op(struct pcifront_dev *dev, struct xen_pci_op *op)
+{
+ dev->info->op = *op;
+ /* Make sure info is written before the flag */
+ wmb();
+ set_bit(_XEN_PCIF_active, (void*) &dev->info->flags);
+ notify_remote_via_evtchn(dev->evtchn);
+
+ wait_event(pcifront_queue, !test_bit(_XEN_PCIF_active, (void*)
&dev->info->flags));
+
+ /* Make sure flag is read before info */
+ rmb();
+ *op = dev->info->op;
+}
+
+int pcifront_conf_read(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long fun,
+ unsigned int off, unsigned int size, unsigned int *val)
+{
+ struct xen_pci_op op;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_conf_read;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+ op.offset = off;
+ op.size = size;
+
+ pcifront_op(dev, &op);
+
+ if (op.err)
+ return op.err;
+
+ *val = op.value;
+
+ return 0;
+}
+
+int pcifront_conf_write(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long fun,
+ unsigned int off, unsigned int size, unsigned int val)
+{
+ struct xen_pci_op op;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_conf_write;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+ op.offset = off;
+ op.size = size;
+
+ op.value = val;
+
+ pcifront_op(dev, &op);
+
+ return op.err;
+}
+
+int pcifront_enable_msi(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long fun)
+{
+ struct xen_pci_op op;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_enable_msi;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+
+ pcifront_op(dev, &op);
+
+ if (op.err)
+ return op.err;
+ else
+ return op.value;
+}
+
+int pcifront_disable_msi(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun)
+{
+ struct xen_pci_op op;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_disable_msi;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+
+ pcifront_op(dev, &op);
+
+ return op.err;
+}
+
+int pcifront_enable_msix(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun,
+ struct xen_msix_entry *entries, int n)
+{
+ struct xen_pci_op op;
+
+ if (n > SH_INFO_MAX_VEC)
+ return XEN_PCI_ERR_op_failed;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_enable_msix;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+ op.value = n;
+
+ memcpy(op.msix_entries, entries, n * sizeof(*entries));
+
+ pcifront_op(dev, &op);
+
+ if (op.err)
+ return op.err;
+
+ memcpy(entries, op.msix_entries, n * sizeof(*entries));
+
+ return 0;
+}
+
+
+int pcifront_disable_msix(struct pcifront_dev *dev,
+ unsigned int dom,
+ unsigned int bus, unsigned int slot, unsigned long
fun)
+{
+ struct xen_pci_op op;
+
+ memset(&op, 0, sizeof(op));
+
+ op.cmd = XEN_PCI_OP_disable_msix;
+ op.domain = dom;
+ op.bus = bus;
+ op.devfn = PCI_DEVFN(slot, fun);
+
+ pcifront_op(dev, &op);
+
+ return op.err;
+}
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/sched.c
--- a/extras/mini-os/sched.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/sched.c Fri Jul 18 12:12:41 2008 +0900
@@ -75,7 +75,7 @@ void schedule(void)
void schedule(void)
{
struct thread *prev, *next, *thread;
- struct list_head *iterator;
+ struct list_head *iterator, *next_iterator;
unsigned long flags;
prev = current;
@@ -97,7 +97,7 @@ void schedule(void)
s_time_t now = NOW();
s_time_t min_wakeup_time = now + SECONDS(10);
next = NULL;
- list_for_each(iterator, &idle_thread->thread_list)
+ list_for_each_safe(iterator, next_iterator, &idle_thread->thread_list)
{
thread = list_entry(iterator, struct thread, thread_list);
if (!is_runnable(thread) && thread->wakeup_time != 0LL)
@@ -128,7 +128,7 @@ void schedule(void)
inturrupted at the return instruction. And therefore at safe point. */
if(prev != next) switch_threads(prev, next);
- list_for_each(iterator, &exited_threads)
+ list_for_each_safe(iterator, next_iterator, &exited_threads)
{
thread = list_entry(iterator, struct thread, thread_list);
if(thread != prev)
diff -r eb0fc71cfc72 -r 400e5d4877ca extras/mini-os/xenbus/xenbus.c
--- a/extras/mini-os/xenbus/xenbus.c Tue Jul 08 11:41:43 2008 +0900
+++ b/extras/mini-os/xenbus/xenbus.c Fri Jul 18 12:12:41 2008 +0900
@@ -78,9 +78,9 @@ char **xenbus_wait_for_watch_return(xenb
char **xenbus_wait_for_watch_return(xenbus_event_queue *queue)
{
struct xenbus_event *event;
+ DEFINE_WAIT(w);
if (!queue)
queue = &xenbus_events;
- DEFINE_WAIT(w);
while (!(event = *queue)) {
add_waiter(w, xenbus_watch_queue);
schedule();
@@ -382,6 +382,7 @@ xenbus_msg_reply(int type,
static char *errmsg(struct xsd_sockmsg *rep)
{
+ char *res;
if (!rep) {
char msg[] = "No reply";
size_t len = strlen(msg) + 1;
@@ -389,7 +390,7 @@ static char *errmsg(struct xsd_sockmsg *
}
if (rep->type != XS_ERROR)
return NULL;
- char *res = malloc(rep->len + 1);
+ res = malloc(rep->len + 1);
memcpy(res, rep + 1, rep->len);
res[rep->len] = 0;
free(rep);
@@ -419,10 +420,10 @@ char *xenbus_ls(xenbus_transaction_t xbt
struct xsd_sockmsg *reply, *repmsg;
struct write_req req[] = { { pre, strlen(pre)+1 } };
int nr_elems, x, i;
- char **res;
+ char **res, *msg;
repmsg = xenbus_msg_reply(XS_DIRECTORY, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(repmsg);
+ msg = errmsg(repmsg);
if (msg) {
*contents = NULL;
return msg;
@@ -447,9 +448,9 @@ char *xenbus_read(xenbus_transaction_t x
{
struct write_req req[] = { {path, strlen(path) + 1} };
struct xsd_sockmsg *rep;
- char *res;
+ char *res, *msg;
rep = xenbus_msg_reply(XS_READ, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg) {
*value = NULL;
return msg;
@@ -469,8 +470,9 @@ char *xenbus_write(xenbus_transaction_t
{value, strlen(value)},
};
struct xsd_sockmsg *rep;
+ char *msg;
rep = xenbus_msg_reply(XS_WRITE, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg) return msg;
free(rep);
return NULL;
@@ -487,6 +489,8 @@ char* xenbus_watch_path_token( xenbus_tr
struct watch *watch = malloc(sizeof(*watch));
+ char *msg;
+
if (!events)
events = &xenbus_events;
@@ -497,7 +501,7 @@ char* xenbus_watch_path_token( xenbus_tr
rep = xenbus_msg_reply(XS_WATCH, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg) return msg;
free(rep);
@@ -515,9 +519,11 @@ char* xenbus_unwatch_path_token( xenbus_
struct watch *watch, **prev;
+ char *msg;
+
rep = xenbus_msg_reply(XS_UNWATCH, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg) return msg;
free(rep);
@@ -536,8 +542,9 @@ char *xenbus_rm(xenbus_transaction_t xbt
{
struct write_req req[] = { {path, strlen(path) + 1} };
struct xsd_sockmsg *rep;
+ char *msg;
rep = xenbus_msg_reply(XS_RM, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg)
return msg;
free(rep);
@@ -548,9 +555,9 @@ char *xenbus_get_perms(xenbus_transactio
{
struct write_req req[] = { {path, strlen(path) + 1} };
struct xsd_sockmsg *rep;
- char *res;
+ char *res, *msg;
rep = xenbus_msg_reply(XS_GET_PERMS, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg) {
*value = NULL;
return msg;
@@ -567,14 +574,16 @@ char *xenbus_set_perms(xenbus_transactio
char *xenbus_set_perms(xenbus_transaction_t xbt, const char *path, domid_t
dom, char perm)
{
char value[PERM_MAX_SIZE];
- snprintf(value, PERM_MAX_SIZE, "%c%hu", perm, dom);
struct write_req req[] = {
{path, strlen(path) + 1},
- {value, strlen(value) + 1},
+ {value, 0},
};
struct xsd_sockmsg *rep;
+ char *msg;
+ snprintf(value, PERM_MAX_SIZE, "%c%hu", perm, dom);
+ req[1].len = strlen(value) + 1;
rep = xenbus_msg_reply(XS_SET_PERMS, xbt, req, ARRAY_SIZE(req));
- char *msg = errmsg(rep);
+ msg = errmsg(rep);
if (msg)
return msg;
free(rep);
@@ -659,11 +668,11 @@ char* xenbus_printf(xenbus_transaction_t
static void do_ls_test(const char *pre)
{
- char **dirs;
+ char **dirs, *msg;
int x;
DEBUG("ls %s...\n", pre);
- char *msg = xenbus_ls(XBT_NIL, pre, &dirs);
+ msg = xenbus_ls(XBT_NIL, pre, &dirs);
if (msg) {
DEBUG("Error in xenbus ls: %s\n", msg);
free(msg);
@@ -679,9 +688,9 @@ static void do_ls_test(const char *pre)
static void do_read_test(const char *path)
{
- char *res;
+ char *res, *msg;
DEBUG("Read %s...\n", path);
- char *msg = xenbus_read(XBT_NIL, path, &res);
+ msg = xenbus_read(XBT_NIL, path, &res);
if (msg) {
DEBUG("Error in xenbus read: %s\n", msg);
free(msg);
@@ -693,8 +702,9 @@ static void do_read_test(const char *pat
static void do_write_test(const char *path, const char *val)
{
+ char *msg;
DEBUG("Write %s to %s...\n", val, path);
- char *msg = xenbus_write(XBT_NIL, path, val);
+ msg = xenbus_write(XBT_NIL, path, val);
if (msg) {
DEBUG("Result %s\n", msg);
free(msg);
@@ -705,8 +715,9 @@ static void do_write_test(const char *pa
static void do_rm_test(const char *path)
{
+ char *msg;
DEBUG("rm %s...\n", path);
- char *msg = xenbus_rm(XBT_NIL, path);
+ msg = xenbus_rm(XBT_NIL, path);
if (msg) {
DEBUG("Result %s\n", msg);
free(msg);
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/Makefile
--- a/stubdom/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -3,18 +3,18 @@ MINI_OS = $(XEN_ROOT)/extras/mini-os
export XEN_OS=MiniOS
-include $(XEN_ROOT)/Config.mk
+CONFIG_QEMU=ioemu
+
export stubdom=y
export debug=y
-
-IOEMU_OPTIONS=--disable-vnc-tls
-BINUTILS_VERSION=2.18
-GCC_VERSION=4.2.2
+include $(XEN_ROOT)/Config.mk
+
+IOEMU_OPTIONS=--disable-sdl --disable-opengl --disable-gfx-check
--disable-vnc-tls --disable-brlapi --disable-kqemu
ZLIB_VERSION=1.2.3
LIBPCI_VERSION=2.2.9
-NEWLIB_DATE=2008-01-01
-LWIP_DATE=2008-06-01
-GRUB_DATE=2008-06-01
+NEWLIB_VERSION=1.16.0
+LWIP_VERSION=1.3.0
+GRUB_VERSION=0.97
WGET=wget -c
@@ -26,10 +26,12 @@ ifeq ($(GNU_TARGET_ARCH), i686)
ifeq ($(GNU_TARGET_ARCH), i686)
TARGET_CFLAGS=
NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS
+STUBDOM_SUPPORTED=1
endif
ifeq ($(GNU_TARGET_ARCH), x86_64)
TARGET_CFLAGS=-mno-red-zone
NEWLIB_CFLAGS+=-D_I386MACH_ALLOW_HW_INTERRUPTS
+STUBDOM_SUPPORTED=1
endif
ifeq ($(GNU_TARGET_ARCH), ia64)
TARGET_CFLAGS=-mconstant-gp
@@ -37,82 +39,65 @@ endif
CROSS_ROOT=cross-root-$(GNU_TARGET_ARCH)
CROSS_PREFIX=$(CURDIR)/$(CROSS_ROOT)
-export CROSS_COMPILE=$(GNU_TARGET_ARCH)-xen-elf-
-export PATH:=$(CROSS_PREFIX)/bin:$(PATH)
+
+# Disable PIE/SSP if GCC supports them. They can break us.
+TARGET_CFLAGS += $(CFLAGS)
+TARGET_CPPFLAGS += $(CPPFLAGS)
+TARGET_CFLAGS += $(call cc-option,$(CC),-nopie,)
+TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
+TARGET_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
+
+# Do not use host headers and libs
+GCC_INSTALL = $(shell gcc -print-search-dirs | sed -n -e 's/install:
\(.*\)/\1/p')
+TARGET_CPPFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__
+TARGET_CPPFLAGS += -nostdinc
+TARGET_CPPFLAGS += -isystem $(CURDIR)/$(MINI_OS)/include/posix
+TARGET_CPPFLAGS += -isystem $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include
+TARGET_CPPFLAGS += -isystem $(GCC_INSTALL)include
+TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include
+TARGET_CPPFLAGS += -isystem $(CURDIR)/lwip/src/include/ipv4
+TARGET_CPPFLAGS += -I$(CURDIR)/include
+
+TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib
TARGETS=ioemu c caml grub
.PHONY: all
-all: ioemu-stubdom c-stubdom pv-grub
-
-################
-# Cross-binutils
-################
-
-binutils-$(BINUTILS_VERSION).tar.bz2:
- $(WGET) http://ftp.gnu.org/gnu/binutils/$@
-binutils-$(BINUTILS_VERSION): binutils-$(BINUTILS_VERSION).tar.bz2
- tar xjf $<
- patch -d $@ -p1 < binutils.patch
+all: build
+ifeq ($(STUBDOM_SUPPORTED),1)
+build: ioemu-stubdom c-stubdom pv-grub
+else
+build:
+endif
+
+##############
+# Cross-newlib
+##############
+
+newlib-$(NEWLIB_VERSION).tar.gz:
+ $(WGET) ftp://sources.redhat.com/pub/newlib/$@
+
+newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz
+ tar xzf $<
+ patch -d $@ -p0 < newlib.patch
touch $@
-
-BINUTILS_STAMPFILE=$(CROSS_ROOT)/bin/$(GNU_TARGET_ARCH)-xen-elf-ar
-.PHONY: cross-binutils
-cross-binutils: $(BINUTILS_STAMPFILE)
-$(BINUTILS_STAMPFILE): binutils-$(BINUTILS_VERSION)
- mkdir -p binutils-build
- ( cd binutils-build && \
- ../binutils-$(BINUTILS_VERSION)/configure --prefix=$(CROSS_PREFIX)
--verbose --target=$(GNU_TARGET_ARCH)-xen-elf && \
- $(MAKE) && \
- $(MAKE) check && \
- $(MAKE) install )
-
-###########
-# Cross-gcc
-###########
-
-gcc-$(GCC_VERSION).tar.bz2:
- $(WGET)
http://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.bz2
-gcc-$(GCC_VERSION): gcc-$(GCC_VERSION).tar.bz2
- tar xjf $<
- patch -d $@ -p1 < gcc.patch
- touch $@
-
-GCC_STAMPFILE=$(CROSS_ROOT)/bin/$(GNU_TARGET_ARCH)-xen-elf-gcc-$(GCC_VERSION)
-.PHONY: cross-gcc
-cross-gcc: $(GCC_STAMPFILE)
-$(GCC_STAMPFILE): gcc-$(GCC_VERSION) $(BINUTILS_STAMPFILE)
- mkdir -p gcc-build
- ( cd gcc-build && \
- ../gcc-$(GCC_VERSION)/configure --prefix=$(CROSS_PREFIX) --verbose
--target=$(GNU_TARGET_ARCH)-xen-elf --enable-languages=c --disable-libssp
--with-gnu-as --with-gnu-ld && \
- $(MAKE) GCC_FOR_TARGET='$$$$r/gcc/xgcc -B$$$$r/gcc/
'"$(TARGET_CFLAGS)"' $$(FLAGS_FOR_TARGET)' && \
- $(MAKE) install )
-
-##############
-# Cross-newlib
-##############
-
-newlib-cvs:
- cvs -z 9 -d :pserver:anoncvs@xxxxxxxxxxxxxxxxxx:/cvs/src co -D
$(NEWLIB_DATE) newlib
- mv src newlib-cvs
- patch -d $@ -p0 < newlib.patch
NEWLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libc.a
.PHONY: cross-newlib
cross-newlib: $(NEWLIB_STAMPFILE)
-$(NEWLIB_STAMPFILE): newlib-cvs $(GCC_STAMPFILE)
+$(NEWLIB_STAMPFILE): newlib-$(NEWLIB_VERSION)
mkdir -p newlib-build
( cd newlib-build && \
- CC_FOR_TARGET="$(GNU_TARGET_ARCH)-xen-elf-gcc $(TARGET_CFLAGS)
$(NEWLIB_CFLAGS)" ../newlib-cvs/configure --prefix=$(CROSS_PREFIX) --verbose
--target=$(GNU_TARGET_ARCH)-xen-elf --enable-newlib-io-long-long && \
+ CC_FOR_TARGET="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS)
$(NEWLIB_CFLAGS)" AR_FOR_TARGET=$(AR) LD_FOR_TARGET=$(LD)
RANLIB_FOR_TARGET=$(RANLIB) ../newlib-$(NEWLIB_VERSION)/configure
--prefix=$(CROSS_PREFIX) --verbose --target=$(GNU_TARGET_ARCH)-xen-elf
--enable-newlib-io-long-long --disable-multilib && \
$(MAKE) && \
- $(MAKE) install )
+ DESTDIR= $(MAKE) install )
############
# Cross-zlib
############
zlib-$(ZLIB_VERSION).tar.gz:
- $(WGET) http://www.zlib.net/zlib-$(ZLIB_VERSION).tar.gz
+ $(WGET) http://www.zlib.net/$@
ZLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libz.a
.PHONY: cross-zlib
@@ -120,7 +105,7 @@ cross-zlib: $(ZLIB_STAMPFILE)
$(ZLIB_STAMPFILE): zlib-$(ZLIB_VERSION).tar.gz $(NEWLIB_STAMPFILE)
tar xzf $<
( cd zlib-$(ZLIB_VERSION) && \
- CFLAGS="$(TARGET_CFLAGS)" CC=$(GNU_TARGET_ARCH)-xen-elf-gcc
./configure --prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf && \
+ CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" CC=$(CC) ./configure
--prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf && \
$(MAKE) libz.a && \
$(MAKE) install )
@@ -129,18 +114,22 @@ cross-zlib: $(ZLIB_STAMPFILE)
##############
pciutils-$(LIBPCI_VERSION).tar.bz2:
- $(WGET)
http://www.kernel.org/pub/software/utils/pciutils/pciutils-$(LIBPCI_VERSION).tar.bz2
+ $(WGET) http://www.kernel.org/pub/software/utils/pciutils/$@
+
+pciutils-$(LIBPCI_VERSION): pciutils-$(LIBPCI_VERSION).tar.bz2
+ tar xjf $<
+ patch -d $@ -p1 < pciutils.patch
+ touch $@
LIBPCI_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libpci.a
.PHONY: cross-libpci
cross-libpci: $(LIBPCI_STAMPFILE)
-$(LIBPCI_STAMPFILE): pciutils-$(LIBPCI_VERSION).tar.bz2 $(NEWLIB_STAMPFILE)
$(ZLIB_STAMPFILE)
- tar xjf $<
+$(LIBPCI_STAMPFILE): pciutils-$(LIBPCI_VERSION) $(NEWLIB_STAMPFILE)
$(ZLIB_STAMPFILE)
( cd pciutils-$(LIBPCI_VERSION) && \
cp ../libpci.config.h lib/config.h && \
echo '#define PCILIB_VERSION "$(LIBPCI_VERSION)"' >> lib/config.h && \
cp ../libpci.config.mak lib/config.mk && \
- $(MAKE) CC="$(GNU_TARGET_ARCH)-xen-elf-gcc $(TARGET_CFLAGS)"
lib/libpci.a && \
+ $(MAKE) CC="$(CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -I$(realpath
$(MINI_OS)/include)" lib/libpci.a && \
$(INSTALL_DATA) lib/libpci.a
$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib/ && \
$(INSTALL_DIR) $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci
&& \
$(INSTALL_DATA) lib/{config,header,pci,types}.h
$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include/pci/ \
@@ -150,8 +139,13 @@ cross-libpci: $(LIBPCI_STAMPFILE)
# lwIP
######
-lwip-cvs:
- cvs -z 9 -d :pserver:anonymous@xxxxxxxxxxxxxxxxxxxxxxx:/sources/lwip co
-D $(LWIP_DATE) -d $@ lwip
+lwip-$(LWIP_VERSION).tar.gz:
+ $(WGET) http://download.savannah.gnu.org/releases/lwip/$@
+
+lwip: lwip-$(LWIP_VERSION).tar.gz
+ tar xzf $<
+ patch -d $@ -p0 < lwip.patch-cvs
+ touch $@
#######
# Links
@@ -160,9 +154,16 @@ lwip-cvs:
.PHONY: $(CROSS_ROOT)
$(CROSS_ROOT): cross-newlib cross-zlib cross-libpci
-.PHONY: mk-symlinks
-mk-symlinks:
- [ -h include ] || ln -sf ../tools/include .
+.PHONY: mk-headers
+mk-headers:
+ mkdir -p include/xen && \
+ ln -sf $(addprefix ../../,$(wildcard
$(XEN_ROOT)/xen/include/public/*.h)) include/xen && \
+ ln -sf $(addprefix ../../$(XEN_ROOT)/xen/include/public/,arch-ia64
arch-x86 hvm io xsm) include/xen && \
+ ( [ -h include/xen/sys ] || ln -sf
../../$(XEN_ROOT)/tools/include/xen-sys/MiniOS include/xen/sys ) && \
+ mkdir -p include/xen-foreign && \
+ ln -sf $(addprefix ../../,$(wildcard
$(XEN_ROOT)/tools/include/xen-foreign/*)) include/xen-foreign/ && \
+ $(MAKE) -C include/xen-foreign/ && \
+ ( [ -h include/xen/foreign ] || ln -sf ../xen-foreign
include/xen/foreign )
mkdir -p libxc
[ -h libxc/Makefile ] || ( cd libxc && \
ln -sf ../$(XEN_ROOT)/tools/libxc/*.h . && \
@@ -174,10 +175,21 @@ mk-symlinks:
ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.h . && \
ln -sf ../$(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/Makefile . )
mkdir -p ioemu
+ifeq ($(CONFIG_QEMU),ioemu)
[ -h ioemu/Makefile ] || ( cd ioemu && \
- ln -sf ../$(XEN_ROOT)/tools/ioemu/* . && \
- ([ ! -h config-host.h ] || rm -f config-host.h) && \
- ([ ! -h config-host.mak ] || rm -f config-host.mak) )
+ ln -sf ../$(XEN_ROOT)/tools/ioemu/* .)
+else
+ [ -h ioemu/Makefile ] || ( cd ioemu && \
+ ln -sf $(CONFIG_QEMU)/* . && \
+ rm -fr i386-dm && \
+ rm -fr i386-stubdom && \
+ mkdir i386-dm && \
+ mkdir i386-stubdom && \
+ ln -sf $(CONFIG_QEMU)/i386-dm/* i386-dm/ && \
+ ln -sf $(CONFIG_QEMU)/i386-stubdom/* i386-stubdom/ )
+endif
+ [ ! -h ioemu/config-host.h ] || rm -f ioemu/config-host.h
+ [ ! -h ioemu/config-host.mak ] || rm -f ioemu/config-host.mak
$(MAKE) -C $(MINI_OS) links
TARGETS_MINIOS=$(addprefix mini-os-,$(TARGETS))
@@ -193,82 +205,106 @@ TARGETS_MINIOS=$(addprefix mini-os-,$(TA
.PHONY: libxc
libxc: libxc/libxenctrl.a libxc/libxenguest.a
-libxc/libxenctrl.a libxc/libxenguest.a: cross-zlib mk-symlinks
- $(MAKE) -C libxc
+libxc/libxenctrl.a libxc/libxenguest.a:: cross-zlib mk-headers
+ CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C libxc
#######
# ioemu
#######
.PHONY: ioemu
-ioemu: cross-zlib cross-libpci mk-symlinks libxc
+ioemu: cross-zlib cross-libpci mk-headers libxc
+ifeq ($(CONFIG_QEMU),ioemu)
[ -f ioemu/config-host.mak ] || \
- ( cd ioemu ; XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) sh configure
--prefix=/usr --enable-stubdom $(IOEMU_OPTIONS))
- $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip-cvs
+ ( cd ioemu ; \
+ XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) CFLAGS="$(TARGET_CFLAGS)" sh
configure --prefix=/usr --enable-stubdom $(IOEMU_OPTIONS))
+ CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip
TOOLS=
+else
+ [ -f ioemu/config-host.mak ] || \
+ ( cd ioemu ; \
+ CONFIG_STUBDOM=yes XEN_ROOT=$(abspath $(XEN_ROOT))
XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) CFLAGS="$(TARGET_CFLAGS)" sh ./xen-setup
--cc=$(CC) --disable-gcc-check $(IOEMU_OPTIONS))
+ CPPFLAGS= TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C ioemu
LWIPDIR=$(CURDIR)/lwip TOOLS= CONFIG_STUBDOM=yes
+endif
######
# caml
######
.PHONY: caml
-caml: cross-newlib mk-symlinks
- $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-cvs
+caml: cross-newlib mk-headers
+ CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@
LWIPDIR=$(CURDIR)/lwip
###
# C
###
.PHONY: c
-c: cross-newlib mk-symlinks
- $(MAKE) -C $@ LWIPDIR=$(CURDIR)/lwip-cvs
+c: cross-newlib mk-headers
+ CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@
LWIPDIR=$(CURDIR)/lwip
######
# Grub
######
-grub-cvs:
- cvs -z 9 -d :pserver:anonymous@xxxxxxxxxxxxxx:/sources/grub co -D
$(GRUB_DATE) -d $@ grub
+grub-$(GRUB_VERSION).tar.gz:
+ $(WGET) ftp://alpha.gnu.org/gnu/grub/$@
+
+grub-upstream: grub-$(GRUB_VERSION).tar.gz
+ tar xzf $<
+ mv grub-$(GRUB_VERSION) $@
for i in grub.patches/* ; do \
patch -d $@ -p1 < $$i ; \
done
.PHONY: grub
-grub: grub-cvs cross-newlib mk-symlinks
- $(MAKE) -C $@
+grub: grub-upstream cross-newlib mk-headers
+ CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $@
########
# minios
########
.PHONY: ioemu-stubdom
-ioemu-stubdom: mini-os-ioemu lwip-cvs libxc ioemu
- DEF_CFLAGS=-DCONFIG_QEMU $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$<
LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS="$(CURDIR)/ioemu/i386-dm-stubdom/qemu.a
$(CURDIR)/ioemu/i386-dm-stubdom/libqemu.a"
+ifeq ($(CONFIG_QEMU),ioemu)
+ioemu-stubdom: APP_OBJS=$(CURDIR)/ioemu/i386-dm-stubdom/qemu.a
$(CURDIR)/ioemu/i386-dm-stubdom/libqemu.a
+else
+ioemu-stubdom: APP_OBJS=$(CURDIR)/ioemu/i386-stubdom/qemu.a
$(CURDIR)/ioemu/i386-stubdom/libqemu.a $(CURDIR)/ioemu/libqemu_common.a
+endif
+ioemu-stubdom: mini-os-ioemu lwip libxc ioemu
+ DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_QEMU
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS)
OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip APP_OBJS="$(APP_OBJS)"
CAMLLIB = $(shell ocamlc -where)
.PHONY: caml-stubdom
-caml-stubdom: mini-os-caml lwip-cvs libxc caml
- DEF_CFLAGS=-DCONFIG_CAML $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$<
LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS="$(CURDIR)/caml/main-caml.o
$(CURDIR)/caml/caml.o $(CAMLLIB)/libasmrun.a"
+caml-stubdom: mini-os-caml lwip libxc caml
+ DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_CAML
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS)
OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip
APP_OBJS="$(CURDIR)/caml/main-caml.o $(CURDIR)/caml/caml.o
$(CAMLLIB)/libasmrun.a"
.PHONY: c-stubdom
-c-stubdom: mini-os-c lwip-cvs libxc c
- DEF_CFLAGS=-DCONFIG_C $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$<
LWIPDIR=$(CURDIR)/lwip-cvs APP_OBJS=$(CURDIR)/c/main.a
+c-stubdom: mini-os-c lwip libxc c
+ DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_C
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS)
OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip APP_OBJS=$(CURDIR)/c/main.a
.PHONY: pv-grub
pv-grub: mini-os-grub libxc grub
- DEF_CFLAGS=-DCONFIG_GRUB $(MAKE) -C $(MINI_OS) OBJ_DIR=$(CURDIR)/$<
APP_OBJS=$(CURDIR)/grub/main.a
+ DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_GRUB
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS)
OBJ_DIR=$(CURDIR)/$< APP_OBJS=$(CURDIR)/grub/main.a
#########
# install
#########
+ifeq ($(STUBDOM_SUPPORTED),1)
install: install-ioemu install-grub
-
-install-ioemu: mini-os-ioemu/mini-os.gz
+else
+install:
+endif
+
+install-ioemu: ioemu-stubdom
+ $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/bin"
$(INSTALL_PROG) stubdom-dm "$(DESTDIR)/usr/lib/xen/bin"
- $(INSTALL_PROG) $< "$(DESTDIR)/usr/lib/xen/boot/ioemu-stubdom.gz"
-
-install-grub: mini-os-grub/mini-os.gz
- $(INSTALL_PROG) $< "$(DESTDIR)/usr/lib/xen/boot/pv-grub.gz"
+ $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot"
+ $(INSTALL_PROG) mini-os-ioemu/mini-os.gz
"$(DESTDIR)/usr/lib/xen/boot/ioemu-stubdom.gz"
+
+install-grub: pv-grub
+ $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot"
+ $(INSTALL_PROG) mini-os-grub/mini-os.gz
"$(DESTDIR)/usr/lib/xen/boot/pv-grub.gz"
#######
# clean
@@ -290,25 +326,24 @@ clean:
.PHONY: crossclean
crossclean: clean
rm -fr $(CROSS_ROOT)
- rm -fr binutils-build gcc-build newlib-build
+ rm -fr newlib-build
rm -fr zlib-$(ZLIB_VERSION) pciutils-$(LIBPCI_VERSION)
# clean patched sources
.PHONY: patchclean
patchclean: crossclean
- rm -fr binutils-$(BINUTILS_VERSION)
- rm -fr gcc-$(GCC_VERSION)
- rm -fr newlib-cvs
- rm -fr lwip-cvs
- rm -fr grub-cvs
+ rm -fr newlib-$(NEWLIB_VERSION)
+ rm -fr lwip
+ rm -fr grub-upstream
# clean downloads
.PHONY: downloadclean
downloadclean: patchclean
- rm -f binutils-$(BINUTILS_VERSION).tar.bz2
- rm -f gcc-$(GCC_VERSION).tar.bz2
+ rm -f newlib-$(NEWLIB_VERSION).tar.gz
rm -f zlib-$(ZLIB_VERSION).tar.gz
rm -f pciutils-$(LIBPCI_VERSION).tar.bz2
+ rm -f grub-$(GRUB_VERSION).tar.gz
+ rm -f lwip-$(LWIP_VERSION).tar.gz
.PHONY: distclean
distclean: downloadclean
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/binutils.patch
--- a/stubdom/binutils.patch Tue Jul 08 11:41:43 2008 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-It looks like binutils has troubles with makeinfo and the doc generation.
-We don't need it anyway
-
---- binutils-2.18/bfd/Makefile.inorig 2008-01-16 16:17:43.004484000 +0000
-+++ binutils-2.18/bfd/Makefile.in 2008-01-16 16:17:50.505526000 +0000
-@@ -271,7 +271,7 @@
- INCDIR = $(srcdir)/../include
- CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
- MKDEP = gcc -MM
--SUBDIRS = doc po
-+SUBDIRS = po
- bfddocdir = doc
- bfdlib_LTLIBRARIES = libbfd.la
- AM_CFLAGS = $(WARN_CFLAGS)
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/gcc.patch
--- a/stubdom/gcc.patch Tue Jul 08 11:41:43 2008 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-Backported from later versions
-
---- gcc-4.2.2/gcc/config.gcc 2007-11-22 16:27:45.000000000 +0000
-+++ gcc-4.2.2/gcc/config.gcc 2007-11-22 16:23:00.000000000 +0000
-@@ -1033,6 +1033,11 @@
- tmake_file="i386/t-i386elf t-svr4"
- use_fixproto=yes
- ;;
-+x86_64-*-elf*)
-+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h
i386/i386elf.h i386/x86-64.h"
-+ tmake_file="i386/t-i386elf t-svr4"
-+ use_fixproto=yes
-+ ;;
- i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4*)
- if test x$gas = xyes
- then
-
-We don't have a libc yet at this stage. Unused anyway
-
---- gcc-4.2.2/gcc/unwind-generic.h.orig 2008-01-11 18:54:40.000000000 +0100
-+++ gcc-4.2.2/gcc/unwind-generic.h 2008-01-11 18:54:31.000000000 +0100
-@@ -203,7 +203,6 @@
- compatible with the standard ABI for IA-64, we inline these. */
-
- #ifdef __ia64__
--#include <stdlib.h>
-
- static inline _Unwind_Ptr
- _Unwind_GetDataRelBase (struct _Unwind_Context *_C)
-Backported from later versions
-
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub.patches/00cvs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stubdom/grub.patches/00cvs Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,1382 @@
+diff -uprN grub-0.97/acinclude.m4 grub/acinclude.m4
+--- grub-0.97/acinclude.m4 2004-04-27 21:48:06.000000000 +0100
++++ grub/acinclude.m4 2007-11-05 01:29:46.000000000 +0000
+@@ -57,7 +57,7 @@ else
+ fi
+ grub_cv_prog_objcopy_absolute=yes
+ for link_addr in 2000 8000 7C00; do
+- if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext
-Wl,$link_addr conftest.o -o conftest.exec]); then :
++ if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} ${LDFLAGS} -nostdlib -Wl,-N
-Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
+ else
+ AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
+ fi
+diff -uprN grub-0.97/ChangeLog grub/ChangeLog
+--- grub-0.97/ChangeLog 2005-05-08 03:47:02.000000000 +0100
++++ grub/ChangeLog 2008-05-20 12:04:18.000000000 +0100
+@@ -1,3 +1,127 @@
++2008-05-20 Robert Millan <rmh@xxxxxxxxxxx>
++
++ * netboot/cs89x0.c: Fix license violation.
++ * netboot/cs89x0.h: Likewise.
++
++2008-04-10 Pavel Roskin <proski@xxxxxxx>
++
++ * configure.ac: Always use "_cv_" in cache variables for
++ compatibility with Autoconf 2.62.
++
++2008-03-28 Robert Millan <rmh@xxxxxxxxxxx>
++
++ Surpass 1 TiB disk addressing limit. Note: there are no plans to handle
++ the 2 TiB disk limit in GRUB Legacy, since that would need considerable
++ rework. If you have >2TiB disks, use GRUB 2 instead.
++
++ * grub/asmstub.c (biosdisk): Add unsigned qualifier to `sector'.
++ * stage2/bios.c (biosdisk): Likewise.
++ * stage2/disk_io.c (rawread, devread, rawwrite, devwrite): Likewise.
++ * stage2/shared.h (rawread, devread, rawwrite, devwrite): Likewise.
++ * lib/device.c (get_drive_geometry): Replace BLKGETSIZE with
++ BLKGETSIZE64.
++
++2007-10-29 Pavel Roskin <proski@xxxxxxx>
++
++ * configure.ac: Test if '--build-id=none' is supported by the
++ linker and add it to LDFLAGS if possible. Build ID causes
++ objcopy to generate huge binary files.
++ * aclocal.m4 (grub_PROG_OBJCOPY_ABSOLUTE): Use LDFLAGS when
++ linking, so that build ID doesn't break the test.
++ * stage1/Makefile.am: Preserve LDFLAGS, use stage1_exec_LDFLAGS.
++
++2007-02-22 Pavel Roskin <proski@xxxxxxx>
++
++ * stage2/iso9660.h: Remove unnecessary packed attributes.
++
++2007-02-22 Robert Millan <rmh@xxxxxxxxxxx>
++
++ * util/mkbimage: Update my email address, and remove my name from
++ some places where unnecessary credit is given.
++
++2006-09-10 Pavel Roskin <proski@xxxxxxx>
++
++ * netboot/natsemi.c: Fix compile error with gcc 4.1.1. Cast
++ cannot make a variable volatile - it should be declared as such.
++ * netboot/sis900.c: Likewise.
++
++2006-09-08 Pavel Roskin <proski@xxxxxxx>
++
++ * netboot/etherboot.h: Remove incorrect extern declarations of
++ the variables later declared static. Move BOOTP_DATA_ADDR ...
++ * netboot/main.c: ... here. Eliminate end_of_rfc1533 - it's
++ write-only.
++
++2006-06-24 Yoshinori K. Okuji <okuji@xxxxxxxxx>
++
++ * docs/grub.texi: Changed the license term to the GNU Free
++ Documentation License 1.2.
++
++ * docs/multiboot.texi: Reformatted to show the license term
++ and the version number explicitly.
++
++ * docs/fdl.texi: New file.
++
++ * docs/Makefile.am (grub_TEXINFOS): Added fdl.texi.
++
++2006-06-24 Robert Millan <robertmh@xxxxxxx>
++
++ * lib/device.c (write_to_partition): /dev/ataraid/ and /dev/rd/
++ partitions have a "p" prefix. Add it.
++
++2006-06-24 Robert Millan <robertmh@xxxxxxx>
++
++ * lib/device.c (get_i2o_disk_name): New function.
++ (init_device_map) [__linux__]: Add support for I2O devices.
++
++2006-05-02 Pavel Roskin <proski@xxxxxxx>
++
++ * stage2/stage2.c (run_menu): Fix "savedefault" to save only top
++ level menu positions. Remember current position when calling a
++ submenu. Don't recalculate it when booting from a submenu.
++
++ * grub/main.c (main): Make sure the boot drive number doesn't
++ exceed 255.
++
++2006-05-02 Vesa Jaaskelainen <chaac@xxxxxx>
++
++ * stage2/shared.h (vbe_mode): Back ported aligment fix from GRUB 2
++ to GRUB Legacy. Problem reported by Gerardo Richarte.
++
++2006-04-23 Robert Millan <robertmh@xxxxxxx>
++
++ * grub/asmstub.c (get_diskinfo): Optimize sysctl routine.
++
++2006-04-20 Robert Millan <robertmh@xxxxxxx>
++
++ Fixes for kernel of FreeBSD:
++ * grub/asmstub.c (get_diskinfo): Toggle "kern.geom.debugflags" sysctl
++ before opening a device for writing.
++ * util/grub-install.in: Devices don't have this "r" prefix anymore.
++
++2006-04-16 Yoshinori K. Okuji <okuji@xxxxxxxxx>
++
++ * docs/multiboot.texi: Correct the offset of address
++ fields. Reported by Jeroen Dekkers.
++
++2006-03-21 Yoshinori K. Okuji <okuji@xxxxxxxxx>
++
++ * stage2/builtins.c (setup_func): Specify the size of DEVICE to
++ grub_strncat instead of a strange number 256. Reported by Vitaly
++ Fertman <vitaly@xxxxxxxxxxx>.
++
++2005-09-29 Yoshinori K. Okuji <okuji@xxxxxxxxx>
++
++ * docs/multiboot.texi: Fix a bug in the byte order of
++ boot_device. I hope this won't affect any OS image.
++ Increased the version number to 0.6.94.
++
++2005-09-28 Yoshinori K. Okuji <okuji@xxxxxxxxx>
++
++ * stage2/boot.c (load_image): Even if an OS image is an ELF
++ object, use the a.out kludge if MULTIBOOT_AOUT_KLUDGE is
++ specified.
++
+ 2005-05-08 Yoshinori K. Okuji <okuji@xxxxxxxxx>
+
+ * configure.ac (AC_INIT): Upgraded to 0.97.
+diff -uprN grub-0.97/configure grub/configure
+--- grub-0.97/configure 2005-05-08 03:48:12.000000000 +0100
++++ grub/configure 2007-11-05 01:29:46.000000000 +0000
+@@ -3694,6 +3694,64 @@ if test "x$undef_flag" = xyes; then
+ CPPFLAGS="$CPPFLAGS -Wundef"
+ fi
+
++# Check if build ID can be disabled in the linker
++echo "$as_me:$LINENO: checking whether linker accepts \`--build-id=none'" >&5
++echo $ECHO_N "checking whether linker accepts \`--build-id=none'... $ECHO_C"
>&6
++save_LDFLAGS="$LDFLAGS"
++LDFLAGS="$LDFLAGS -Wl,--build-id=none"
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++
++int
++main ()
++{
++
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
++ (eval $ac_link) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest$ac_exeext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ build_id_flag=yes
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++build_id_flag=no
++fi
++rm -f conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++echo "$as_me:$LINENO: result: $build_id_flag" >&5
++echo "${ECHO_T}$build_id_flag" >&6
++LDFLAGS="$save_LDFLAGS"
++if test "x$build_id_flag" = xyes; then
++ LDFLAGS="$LDFLAGS -Wl,--build-id=none"
++fi
++
+ if test "x$with_binutils" != x; then
+ # Extract the first word of "objcopy", so it can be a program name with
args.
+ set dummy objcopy; ac_word=$2
+@@ -3892,7 +3950,7 @@ echo "$as_me: error: ${CC-cc} cannot com
+ fi
+ grub_cv_prog_objcopy_absolute=yes
+ for link_addr in 2000 8000 7C00; do
+- if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr
conftest.o -o conftest.exec'
++ if { ac_try='${CC-cc} ${CFLAGS} ${LDFLAGS} -nostdlib -Wl,-N -Wl,-Ttext
-Wl,$link_addr conftest.o -o conftest.exec'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+diff -uprN grub-0.97/configure.ac grub/configure.ac
+--- grub-0.97/configure.ac 2005-05-08 03:36:03.000000000 +0100
++++ grub/configure.ac 2008-04-10 23:26:50.000000000 +0100
+@@ -86,13 +86,13 @@ if test "x$ac_cv_prog_gcc" = xyes; then
+ fi
+ STAGE1_CFLAGS="-O2"
+ GRUB_CFLAGS="-O2"
+- AC_CACHE_CHECK([whether optimization for size works], size_flag, [
++ AC_CACHE_CHECK([whether optimization for size works], grub_cv_cc_Os, [
+ saved_CFLAGS=$CFLAGS
+ CFLAGS="-Os -g"
+- AC_TRY_COMPILE(, , size_flag=yes, size_flag=no)
++ AC_TRY_COMPILE(, , grub_cv_cc_Os=yes, grub_cv_cc_Os=no)
+ CFLAGS=$saved_CFLAGS
+ ])
+- if test "x$size_flag" = xyes; then
++ if test "x$grub_cv_cc_Os" = xyes; then
+ STAGE2_CFLAGS="-Os"
+ else
+ STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops"
+@@ -100,16 +100,16 @@ if test "x$ac_cv_prog_gcc" = xyes; then
+ # OpenBSD has a GCC extension for protecting applications from
+ # stack smashing attacks, but GRUB doesn't want this feature.
+ AC_CACHE_CHECK([whether gcc has -fno-stack-protector],
+- no_stack_protector_flag, [
++ grub_cv_cc_no_stack_protector, [
+ saved_CFLAGS=$CFLAGS
+ CFLAGS="-fno-stack-protector"
+ AC_TRY_COMPILE(,
+ ,
+- no_stack_protector_flag=yes,
+- no_stack_protector_flag=no)
++ grub_cv_cc_no_stack_protector=yes,
++ grub_cv_cc_no_stack_protector=no)
+ CFLAGS=$saved_CFLAGS
+ ])
+- if test "x$no_stack_protector_flag" = xyes; then
++ if test "x$grub_cv_cc_no_stack_protector" = xyes; then
+ STAGE2_CFLAGS="$STAGE2_CFLAGS -fno-stack-protector"
+ fi
+ fi
+@@ -123,33 +123,44 @@ AC_SUBST(GRUB_CFLAGS)
+ CPPFLAGS="$CPPFLAGS -Wall -Wmissing-prototypes -Wunused -Wshadow"
+ CPPFLAGS="$CPPFLAGS -Wpointer-arith"
+
+-AC_CACHE_CHECK([whether -Wundef works], undef_flag, [
++AC_CACHE_CHECK([whether -Wundef works], grub_cv_cc_Wundef, [
+ saved_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="-Wundef"
+- AC_TRY_COMPILE(, , undef_flag=yes, undef_flag=no)
++ AC_TRY_COMPILE(, , grub_cv_cc_Wundef=yes, grub_cv_cc_Wundef=no)
+ CPPFLAGS="$saved_CPPFLAGS"
+ ])
+
+ # The options `-falign-*' are supported by gcc 3.0 or later.
+ # Probably it is sufficient to only check for -falign-loops.
+-AC_CACHE_CHECK([whether -falign-loops works], [falign_loop_flag], [
++AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
+ saved_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="-falign-loops=1"
+- AC_TRY_COMPILE(, , [falign_loop_flag=yes], [falign_loop_flag=no])
++ AC_TRY_COMPILE(, , [grub_cv_cc_falign_loop=yes],
[grub_cv_cc_falign_loop=no])
+ CPPFLAGS="$saved_CPPFLAGS"
+ ])
+
+ # Force no alignment to save space.
+-if test "x$falign_loop_flag" = xyes; then
++if test "x$grub_cv_cc_falign_loop" = xyes; then
+ CPPFLAGS="$CPPFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
+ else
+ CPPFLAGS="$CPPFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
+ fi
+
+-if test "x$undef_flag" = xyes; then
++if test "x$grub_cv_cc_Wundef" = xyes; then
+ CPPFLAGS="$CPPFLAGS -Wundef"
+ fi
+
++# Check if build ID can be disabled in the linker
++AC_MSG_CHECKING([whether linker accepts `--build-id=none'])
++save_LDFLAGS="$LDFLAGS"
++LDFLAGS="$LDFLAGS -Wl,--build-id=none"
++AC_TRY_LINK(, , build_id_flag=yes, build_id_flag=no)
++AC_MSG_RESULT([$build_id_flag])
++LDFLAGS="$save_LDFLAGS"
++if test "x$build_id_flag" = xyes; then
++ LDFLAGS="$LDFLAGS -Wl,--build-id=none"
++fi
++
+ if test "x$with_binutils" != x; then
+ dnl AC_PATH_TOOL(OBJCOPY, objcopy, , "$with_binutils:$PATH")
+ AC_PATH_PROG(OBJCOPY, objcopy, , "$with_binutils:$PATH")
+diff -uprN grub-0.97/docs/grub.8 grub/docs/grub.8
+--- grub-0.97/docs/grub.8 2005-05-08 03:48:56.000000000 +0100
++++ grub/docs/grub.8 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
+-.TH GRUB "8" "May 2005" "grub (GNU GRUB 0.97)" FSF
++.TH GRUB "8" "June 2006" "grub (GNU GRUB 0.97)" FSF
+ .SH NAME
+ grub \- the grub shell
+ .SH SYNOPSIS
+diff -uprN grub-0.97/docs/grub-install.8 grub/docs/grub-install.8
+--- grub-0.97/docs/grub-install.8 2005-05-08 03:48:56.000000000 +0100
++++ grub/docs/grub-install.8 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
+-.TH GRUB-INSTALL "8" "May 2005" "grub-install (GNU GRUB 0.97)" FSF
++.TH GRUB-INSTALL "8" "June 2006" "grub-install (GNU GRUB 0.97)" FSF
+ .SH NAME
+ grub-install \- install GRUB on your drive
+ .SH SYNOPSIS
+diff -uprN grub-0.97/docs/grub-md5-crypt.8 grub/docs/grub-md5-crypt.8
+--- grub-0.97/docs/grub-md5-crypt.8 2005-05-08 03:48:56.000000000 +0100
++++ grub/docs/grub-md5-crypt.8 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
+-.TH GRUB-MD5-CRYPT "8" "May 2005" "grub-md5-crypt (GNU GRUB )" FSF
++.TH GRUB-MD5-CRYPT "8" "June 2006" "grub-md5-crypt (GNU GRUB )" FSF
+ .SH NAME
+ grub-md5-crypt \- Encrypt a password in MD5 format
+ .SH SYNOPSIS
+diff -uprN grub-0.97/docs/grub-terminfo.8 grub/docs/grub-terminfo.8
+--- grub-0.97/docs/grub-terminfo.8 2005-05-08 03:48:56.000000000 +0100
++++ grub/docs/grub-terminfo.8 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
+-.TH GRUB-TERMINFO "8" "May 2005" "grub-terminfo (GNU GRUB 0.97)" FSF
++.TH GRUB-TERMINFO "8" "June 2006" "grub-terminfo (GNU GRUB 0.97)" FSF
+ .SH NAME
+ grub-terminfo \- Generate a terminfo command from a terminfo name
+ .SH SYNOPSIS
+diff -uprN grub-0.97/docs/grub.texi grub/docs/grub.texi
+--- grub-0.97/docs/grub.texi 2005-05-08 03:59:59.000000000 +0100
++++ grub/docs/grub.texi 2006-06-24 15:40:02.000000000 +0100
+@@ -2,22 +2,41 @@
+ @c -*-texinfo-*-
+ @c %**start of header
+ @setfilename grub.info
+-@settitle GRUB Manual
+-@c %**end of header
+-
+ @include version.texi
+-
++@settitle GNU GRUB Manual @value{VERSION}
+ @c Unify all our little indices for now.
+ @syncodeindex fn cp
+ @syncodeindex vr cp
+ @syncodeindex ky cp
+ @syncodeindex pg cp
+ @syncodeindex tp cp
++@c %**end of header
+
+ @footnotestyle separate
+ @paragraphindent 3
+ @finalout
+
++@copying
++This manual is for GNU GRUB (version @value{VERSION},
++@value{UPDATED}).
++
++Copyright @copyright{} 1999,2000,2001,2002,2004,2006 Free Software
Foundation, Inc.
++
++@quotation
++Permission is granted to copy, distribute and/or modify this document
++under the terms of the GNU Free Documentation License, Version 1.2 or
++any later version published by the Free Software Foundation; with no
++Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
++and with the Back-Cover Texts as in (a) below. A copy of the
++license is included in the section entitled ``GNU Free Documentation
++License.''
++
++(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
++this GNU Manual, like GNU software. Copies published by the Free
++Software Foundation raise funds for GNU development.''
++@end quotation
++@end copying
++
+ @dircategory Kernel
+ @direntry
+ * GRUB: (grub). The GRand Unified Bootloader
+@@ -34,53 +53,16 @@
+
+ @setchapternewpage odd
+
+-@ifinfo
+-Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc.
+-
+-Permission is granted to make and distribute verbatim copies of
+-this manual provided the copyright notice and this permission notice
+-are preserved on all copies.
+-
+-@ignore
+-Permission is granted to process this file through TeX and print the
+-results, provided the printed document carries a copying permission
+-notice identical to this one except for the removal of this paragraph
+-(this paragraph not being relevant to the printed manual).
+-
+-@end ignore
+-
+-Permission is granted to copy and distribute modified versions of this
+-manual under the conditions for verbatim copying, provided also that
+-the entire resulting derived work is distributed under the terms of a
+-permission notice identical to this one.
+-
+-Permission is granted to copy and distribute translations of this manual
+-into another language, under the above conditions for modified versions.
+-@end ifinfo
+-
+ @titlepage
+ @sp 10
+-@title the GRUB manual
++@title the GNU GRUB manual
+ @subtitle The GRand Unified Bootloader, version @value{VERSION},
@value{UPDATED}.
+ @author Gordon Matzigkeit
+ @author Yoshinori K. Okuji
+ @c The following two commands start the copyright page.
+ @page
+ @vskip 0pt plus 1filll
+-Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc.
+-
+-Permission is granted to make and distribute verbatim copies of
+-this manual provided the copyright notice and this permission notice
+-are preserved on all copies.
+-Permission is granted to copy and distribute modified versions of this
+-manual under the conditions for verbatim copying, provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-Permission is granted to copy and distribute translations of this manual
+-into another language, under the above conditions for modified versions,
+-except that this permission notice may be stated in a translation approved
+-by Free Software Foundation.
++@insertcopying
+ @end titlepage
+
+ @c Output the table of contents at the beginning.
+@@ -91,12 +73,14 @@ by Free Software Foundation.
+
+ @ifnottex
+ @node Top
+-@top GRUB manual
++@top GNU GRUB manual
+
+ This is the documentation of GNU GRUB, the GRand Unified Bootloader,
+ a flexible and powerful boot loader program for @sc{pc}s.
+
+ This edition documents version @value{VERSION}.
++
++@insertcopying
+ @end ifnottex
+
+ @menu
+@@ -124,6 +108,7 @@ This edition documents version @value{VE
+ * Reporting bugs:: Where you should send a bug report
+ * Future:: Some future plans on GRUB
+ * Internals:: Hacking GRUB
++* Copying This Manual:: Copying This Manual
+ * Index::
+ @end menu
+
+@@ -3965,6 +3950,16 @@ homepage}.
+ @include internals.texi
+
+
++@node Copying This Manual
++@appendix Copying This Manual
++
++@menu
++* GNU Free Documentation License:: License for copying this manual.
++@end menu
++
++@include fdl.texi
++
++
+ @node Index
+ @unnumbered Index
+
+diff -uprN grub-0.97/docs/Makefile.am grub/docs/Makefile.am
+--- grub-0.97/docs/Makefile.am 2003-07-09 12:45:35.000000000 +0100
++++ grub/docs/Makefile.am 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ info_TEXINFOS = grub.texi multiboot.texi
+-grub_TEXINFOS = internals.texi
++grub_TEXINFOS = internals.texi fdl.texi
+ EXAMPLES = boot.S kernel.c multiboot.h
+ multiboot_TEXINFOS = boot.S.texi kernel.c.texi multiboot.h.texi
+ man_MANS = grub.8 mbchk.1 grub-install.8 grub-md5-crypt.8 grub-terminfo.8
+diff -uprN grub-0.97/docs/Makefile.in grub/docs/Makefile.in
+--- grub-0.97/docs/Makefile.in 2005-05-08 03:42:34.000000000 +0100
++++ grub/docs/Makefile.in 2006-06-24 15:40:02.000000000 +0100
+@@ -202,7 +202,7 @@ sharedstatedir = @sharedstatedir@
+ sysconfdir = @sysconfdir@
+ target_alias = @target_alias@
+ info_TEXINFOS = grub.texi multiboot.texi
+-grub_TEXINFOS = internals.texi
++grub_TEXINFOS = internals.texi fdl.texi
+ EXAMPLES = boot.S kernel.c multiboot.h
+ multiboot_TEXINFOS = boot.S.texi kernel.c.texi multiboot.h.texi
+ man_MANS = grub.8 mbchk.1 grub-install.8 grub-md5-crypt.8 grub-terminfo.8
+diff -uprN grub-0.97/docs/mbchk.1 grub/docs/mbchk.1
+--- grub-0.97/docs/mbchk.1 2005-05-08 03:48:56.000000000 +0100
++++ grub/docs/mbchk.1 2006-06-24 15:40:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23.
+-.TH MBCHK "1" "May 2005" "mbchk (GNU GRUB 0.97)" FSF
++.TH MBCHK "1" "June 2006" "mbchk (GNU GRUB 0.97)" FSF
+ .SH NAME
+ mbchk \- check the format of a Multiboot kernel
+ .SH SYNOPSIS
+diff -uprN grub-0.97/docs/multiboot.texi grub/docs/multiboot.texi
+--- grub-0.97/docs/multiboot.texi 2003-07-09 12:45:36.000000000 +0100
++++ grub/docs/multiboot.texi 2006-06-24 15:40:02.000000000 +0100
+@@ -1,32 +1,28 @@
+ \input texinfo @c -*-texinfo-*-
+-@c -*-texinfo-*-
+ @c %**start of header
+ @setfilename multiboot.info
+-@settitle Multiboot Specification
+-@c %**end of header
+-
++@set VERSION 0.6.95
++@settitle Multiboot Specification version @value{VERSION}
+ @c Unify all our little indices for now.
+ @syncodeindex fn cp
+ @syncodeindex vr cp
+ @syncodeindex ky cp
+ @syncodeindex pg cp
+ @syncodeindex tp cp
++@c %**end of header
+
+ @footnotestyle separate
+ @paragraphindent 3
+ @finalout
+
++@copying
++Copyright @copyright{} 1995,96 Bryan Ford <baford@@cs.utah.edu>
+
+-@dircategory Kernel
+-@direntry
+-* Multiboot Specification: (multiboot). Multiboot Specification.
+-@end direntry
++Copyright @copyright{} 1995,96 Erich Stefan Boleyn <erich@@uruk.org>
+
+-@ifinfo
+-Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
+-Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
+-Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
++Copyright @copyright{} 1999,2000,2001,2002,2005,2006 Free Software
Foundation, Inc.
+
++@quotation
+ Permission is granted to make and distribute verbatim copies of
+ this manual provided the copyright notice and this permission notice
+ are preserved on all copies.
+@@ -36,7 +32,6 @@ Permission is granted to process this fi
+ results, provided the printed document carries a copying permission
+ notice identical to this one except for the removal of this paragraph
+ (this paragraph not being relevant to the printed manual).
+-
+ @end ignore
+
+ Permission is granted to copy and distribute modified versions of this
+@@ -45,31 +40,23 @@ the entire resulting derived work is dis
+ permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this manual
+-into another language, under the above conditions for modified versions.
+-@end ifinfo
++into another language, under the above conditions for modified
++versions.
++@end quotation
++@end copying
++
++@dircategory Kernel
++@direntry
++* Multiboot Specification: (multiboot). Multiboot Specification.
++@end direntry
+
+ @titlepage
+ @sp 10
+-@title The Multiboot Specification
++@title The Multiboot Specification version @value{VERSION}
+ @author Yoshinori K. Okuji, Bryan Ford, Erich Stefan Boleyn, Kunihiro Ishiguro
+ @page
+-
+ @vskip 0pt plus 1filll
+-Copyright @copyright{} 1995, 96 Bryan Ford <baford@@cs.utah.edu>
+-Copyright @copyright{} 1995, 96 Erich Stefan Boleyn <erich@@uruk.org>
+-Copyright @copyright{} 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+-
+-Permission is granted to make and distribute verbatim copies of
+-this manual provided the copyright notice and this permission notice
+-are preserved on all copies.
+-
+-Permission is granted to copy and distribute modified versions of this
+-manual under the conditions for verbatim copying, provided also that
+-the entire resulting derived work is distributed under the terms of a
+-permission notice identical to this one.
+-
+-Permission is granted to copy and distribute translations of this manual
+-into another language, under the above conditions for modified versions.
++@insertcopying
+ @end titlepage
+
+ @finalout
+@@ -80,7 +67,9 @@ into another language, under the above c
+ @top Multiboot Specification
+
+ This file documents Multiboot Specification, the proposal for the boot
+-sequence standard. This edition documents version 0.6.93.
++sequence standard. This edition documents version @value{VERSION}.
++
++@insertcopying
+ @end ifnottex
+
+ @menu
+@@ -426,7 +415,7 @@ mode table (@pxref{Boot information form
+ kernel.
+
+ If bit 16 in the @samp{flags} word is set, then the fields at offsets
+-8-24 in the Multiboot header are valid, and the boot loader should use
++12-28 in the Multiboot header are valid, and the boot loader should use
+ them instead of the fields in the actual executable header to calculate
+ where to load the OS image. This information does not need to be
+ provided if the kernel image is in @sc{elf} format, but it @emph{must}
+@@ -677,7 +666,7 @@ follows:
+ @example
+ @group
+ +-------+-------+-------+-------+
+-| drive | part1 | part2 | part3 |
++| part3 | part2 | part1 | drive |
+ +-------+-------+-------+-------+
+ @end group
+ @end example
+@@ -1197,6 +1186,17 @@ Rewritten, using more strict words.
+ @item
+ The maintainer changes to the GNU GRUB maintainer team
+ @email{bug-grub@@gnu.org}, from Bryan Ford and Erich Stefan Boleyn.
++
++@item
++The byte order of the @samp{boot_device} in Multiboot information is
++reversed. This was a mistake.
++
++@item
++The offset of the address fields were wrong.
++
++@item
++The format is adapted to a newer Texinfo, and the version number is
++specified more explicitly in the title.
+ @end itemize
+
+ @item 0.6
+diff -uprN grub-0.97/grub/asmstub.c grub/grub/asmstub.c
+--- grub-0.97/grub/asmstub.c 2005-02-16 20:45:14.000000000 +0000
++++ grub/grub/asmstub.c 2008-03-28 13:22:28.000000000 +0000
+@@ -55,6 +55,10 @@ int grub_stage2 (void);
+ # endif /* ! BLKFLSBUF */
+ #endif /* __linux__ */
+
++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
++# include <sys/sysctl.h>
++#endif
++
+ /* We want to prevent any circularararity in our stubs, as well as
+ libc name clashes. */
+ #define WITHOUT_LIBC_STUBS 1
+@@ -777,7 +781,39 @@ get_diskinfo (int drive, struct geometry
+
+ /* Open read/write, or read-only if that failed. */
+ if (! read_only)
+- disks[drive].flags = open (devname, O_RDWR);
++ {
++/* By default, kernel of FreeBSD does not allow overwriting MBR */
++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
++#define GEOM_SYSCTL "kern.geom.debugflags"
++ int old_flags, flags;
++ size_t sizeof_int = sizeof (int);
++
++ if (sysctlbyname (GEOM_SYSCTL, &old_flags, &sizeof_int, NULL, 0) != 0)
++ grub_printf ("failed to get " GEOM_SYSCTL "sysctl: %s\n", strerror
(errno));
++
++ if ((old_flags & 0x10) == 0)
++ {
++ /* "allow foot shooting", see geom(4) */
++ flags = old_flags | 0x10;
++
++ if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &flags, sizeof (int))
!= 0)
++ {
++ flags = old_flags;
++ grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n",
strerror (errno));
++ }
++ }
++ else
++ flags = old_flags;
++#endif
++ disks[drive].flags = open (devname, O_RDWR);
++#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
++ if (flags != old_flags)
++ {
++ if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &old_flags, sizeof
(int)) != 0)
++ grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n",
strerror (errno));
++ }
++#endif
++ }
+
+ if (disks[drive].flags == -1)
+ {
+@@ -926,7 +962,7 @@ hex_dump (void *buf, size_t size)
+
+ int
+ biosdisk (int subfunc, int drive, struct geometry *geometry,
+- int sector, int nsec, int segment)
++ unsigned int sector, int nsec, int segment)
+ {
+ char *buf;
+ int fd = geometry->flags;
+diff -uprN grub-0.97/grub/main.c grub/grub/main.c
+--- grub-0.97/grub/main.c 2003-07-09 12:45:36.000000000 +0100
++++ grub/grub/main.c 2006-05-05 22:43:46.000000000 +0100
+@@ -32,6 +32,7 @@ int grub_stage2 (void);
+ #define WITHOUT_LIBC_STUBS 1
+ #include <shared.h>
+ #include <term.h>
++#include <device.h>
+
+ char *program_name = 0;
+ int use_config_file = 1;
+@@ -192,6 +193,12 @@ main (int argc, char **argv)
+ perror ("strtoul");
+ exit (1);
+ }
++ if (boot_drive >= NUM_DISKS)
++ {
++ fprintf (stderr, "boot_drive should be from 0 to %d\n",
++ NUM_DISKS - 1);
++ exit (1);
++ }
+ break;
+
+ case OPT_NO_CONFIG_FILE:
+diff -uprN grub-0.97/lib/device.c grub/lib/device.c
+--- grub-0.97/lib/device.c 2005-03-28 00:14:25.000000000 +0100
++++ grub/lib/device.c 2008-03-28 13:22:28.000000000 +0000
+@@ -69,9 +69,9 @@ struct hd_geometry
+ # ifndef CDROM_GET_CAPABILITY
+ # define CDROM_GET_CAPABILITY 0x5331 /* get capabilities */
+ # endif /* ! CDROM_GET_CAPABILITY */
+-# ifndef BLKGETSIZE
+-# define BLKGETSIZE _IO(0x12,96) /* return device size */
+-# endif /* ! BLKGETSIZE */
++# ifndef BLKGETSIZE64
++# define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size */
++# endif /* ! BLKGETSIZE64 */
+ #endif /* __linux__ */
+
+ /* Use __FreeBSD_kernel__ instead of __FreeBSD__ for compatibility with
+@@ -152,19 +152,19 @@ get_drive_geometry (struct geometry *geo
+ /* Linux */
+ {
+ struct hd_geometry hdg;
+- unsigned long nr;
++ unsigned long long nr;
+
+ if (ioctl (fd, HDIO_GETGEO, &hdg))
+ goto fail;
+
+- if (ioctl (fd, BLKGETSIZE, &nr))
++ if (ioctl (fd, BLKGETSIZE64, &nr))
+ goto fail;
+
+ /* Got the geometry, so save it. */
+ geom->cylinders = hdg.cylinders;
+ geom->heads = hdg.heads;
+ geom->sectors = hdg.sectors;
+- geom->total_sectors = nr;
++ geom->total_sectors = nr / 512;
+
+ goto success;
+ }
+@@ -407,6 +407,12 @@ get_ataraid_disk_name (char *name, int u
+ {
+ sprintf (name, "/dev/ataraid/d%c", unit + '0');
+ }
++
++static void
++get_i2o_disk_name (char *name, char unit)
++{
++ sprintf (name, "/dev/i2o/hd%c", unit);
++}
+ #endif
+
+ /* Check if DEVICE can be read. If an error occurs, return zero,
+@@ -801,6 +807,29 @@ init_device_map (char ***map, const char
+ }
+ }
+ }
++
++ /* This is for I2O - we have /dev/i2o/hd<logical drive><partition> */
++ {
++ int unit;
++
++ for (unit = 'a'; unit < 'f'; unit++)
++ {
++ char name[24];
++
++ get_i2o_disk_name (name, unit);
++ if (check_device (name))
++ {
++ (*map)[num_hd + 0x80] = strdup (name);
++ assert ((*map)[num_hd + 0x80]);
++
++ /* If the device map file is opened, write the map. */
++ if (fp)
++ fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
++
++ num_hd++;
++ }
++ }
++ }
+ #endif /* __linux__ */
+
+ /* OK, close the device map file if opened. */
+@@ -861,6 +890,12 @@ write_to_partition (char **map, int driv
+ if (strcmp (dev + strlen(dev) - 5, "/disc") == 0)
+ strcpy (dev + strlen(dev) - 5, "/part");
+ }
++ else
++ {
++ if ((strncmp (dev, "/dev/ataraid/", 13) == 0) ||
++ (strncmp (dev, "/dev/rd/", 8) == 0))
++ strcpy (dev + strlen(dev), "p");
++ }
+ sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1);
+
+ /* Open the partition. */
+diff -uprN grub-0.97/netboot/3c509.c grub/netboot/3c509.c
+--- grub-0.97/netboot/3c509.c 2003-07-09 12:45:37.000000000 +0100
++++ grub/netboot/3c509.c 2002-01-02 21:56:40.000000000 +0000
+@@ -18,7 +18,7 @@ Author: Martin Renters.
+
+ 3c509 support added by Serge Babkin (babkin@xxxxxxxxxxxxxx)
+
+-$Id: 3c509.c,v 1.4 2002/01/02 21:56:40 okuji Exp $
++$Id: 3c509.c 609 2002-01-02 21:56:40Z okuji $
+
+ ***************************************************************************/
+
+diff -uprN grub-0.97/netboot/cs89x0.c grub/netboot/cs89x0.c
+--- grub-0.97/netboot/cs89x0.c 2003-07-09 12:45:37.000000000 +0100
++++ grub/netboot/cs89x0.c 2008-05-20 12:04:18.000000000 +0100
+@@ -1,3 +1,21 @@
++/**
++ Per an email message from Russ Nelson <nelson@xxxxxxxxxx> on
++ 18 March 2008 this file is now licensed under GPL Version 2.
++
++ From: Russ Nelson <nelson@xxxxxxxxxx>
++ Date: Tue, 18 Mar 2008 12:42:00 -0400
++ Subject: Re: [Etherboot-developers] cs89x0 driver in etherboot
++ -- quote from email
++ As copyright holder, if I say it doesn't conflict with the GPL,
++ then it doesn't conflict with the GPL.
++
++ However, there's no point in causing people's brains to overheat,
++ so yes, I grant permission for the code to be relicensed under the
++ GPLv2. Please make sure that this change in licensing makes its
++ way upstream. -russ
++ -- quote from email
++**/
++
+ /* cs89x0.c: A Crystal Semiconductor CS89[02]0 driver for etherboot. */
+ /*
+ Permission is granted to distribute the enclosed cs89x0.[ch] driver
+diff -uprN grub-0.97/netboot/cs89x0.h grub/netboot/cs89x0.h
+--- grub-0.97/netboot/cs89x0.h 2003-07-09 12:45:37.000000000 +0100
++++ grub/netboot/cs89x0.h 2008-05-20 12:04:18.000000000 +0100
+@@ -1,3 +1,21 @@
++/**
++ Per an email message from Russ Nelson <nelson@xxxxxxxxxx> on
++ 18 March 2008 this file is now licensed under GPL Version 2.
++
++ From: Russ Nelson <nelson@xxxxxxxxxx>
++ Date: Tue, 18 Mar 2008 12:42:00 -0400
++ Subject: Re: [Etherboot-developers] cs89x0 driver in etherboot
++ -- quote from email
++ As copyright holder, if I say it doesn't conflict with the GPL,
++ then it doesn't conflict with the GPL.
++
++ However, there's no point in causing people's brains to overheat,
++ so yes, I grant permission for the code to be relicensed under the
++ GPLv2. Please make sure that this change in licensing makes its
++ way upstream. -russ
++ -- quote from email
++**/
++
+ /* Copyright, 1988-1992, Russell Nelson, Crynwr Software
+
+ This program is free software; you can redistribute it and/or modify
+diff -uprN grub-0.97/netboot/etherboot.h grub/netboot/etherboot.h
+--- grub-0.97/netboot/etherboot.h 2003-07-09 12:45:37.000000000 +0100
++++ grub/netboot/etherboot.h 2006-09-08 13:56:22.000000000 +0100
+@@ -531,9 +531,6 @@ extern int ip_abort;
+ extern int network_ready;
+ extern struct rom_info rom;
+ extern struct arptable_t arptable[MAX_ARP];
+-extern struct bootpd_t bootp_data;
+-#define BOOTP_DATA_ADDR (&bootp_data)
+-extern unsigned char *end_of_rfc1533;
+
+ /* config.c */
+ extern struct nic nic;
+diff -uprN grub-0.97/netboot/main.c grub/netboot/main.c
+--- grub-0.97/netboot/main.c 2004-05-20 23:19:33.000000000 +0100
++++ grub/netboot/main.c 2006-09-08 13:56:22.000000000 +0100
+@@ -56,7 +56,8 @@ static int vendorext_isvalid;
+ static unsigned long netmask;
+ static struct bootpd_t bootp_data;
+ static unsigned long xid;
+-static unsigned char *end_of_rfc1533 = NULL;
++
++#define BOOTP_DATA_ADDR (&bootp_data)
+
+ #ifndef NO_DHCP_SUPPORT
+ #endif /* NO_DHCP_SUPPORT */
+@@ -967,7 +968,6 @@ decode_rfc1533 (unsigned char *p, int bl
+
+ if (block == 0)
+ {
+- end_of_rfc1533 = NULL;
+ vendorext_isvalid = 0;
+
+ if (grub_memcmp (p, rfc1533_cookie, 4))
+@@ -1021,7 +1021,7 @@ decode_rfc1533 (unsigned char *p, int bl
+ }
+ else if (c == RFC1533_END)
+ {
+- end_of_rfc1533 = endp = p;
++ endp = p;
+ continue;
+ }
+ else if (c == RFC1533_NETMASK)
+diff -uprN grub-0.97/netboot/natsemi.c grub/netboot/natsemi.c
+--- grub-0.97/netboot/natsemi.c 2003-07-09 12:45:38.000000000 +0100
++++ grub/netboot/natsemi.c 2006-09-10 08:26:10.000000000 +0100
+@@ -608,7 +608,7 @@ natsemi_transmit(struct nic *nic,
+ const char *p) /* Packet */
+ {
+ u32 status, to, nstype;
+- u32 tx_status;
++ volatile u32 tx_status;
+
+ /* Stop the transmitter */
+ outl(TxOff, ioaddr + ChipCmd);
+@@ -647,7 +647,7 @@ natsemi_transmit(struct nic *nic,
+
+ to = currticks() + TX_TIMEOUT;
+
+- while ((((volatile u32) tx_status=txd.cmdsts) & OWN) && (currticks() <
to))
++ while (((tx_status=txd.cmdsts) & OWN) && (currticks() < to))
+ /* wait */ ;
+
+ if (currticks() >= to) {
+diff -uprN grub-0.97/netboot/sis900.c grub/netboot/sis900.c
+--- grub-0.97/netboot/sis900.c 2003-07-09 12:45:38.000000000 +0100
++++ grub/netboot/sis900.c 2006-09-10 08:26:10.000000000 +0100
+@@ -901,7 +901,7 @@ sis900_transmit(struct nic *nic,
+ const char *p) /* Packet */
+ {
+ u32 status, to, nstype;
+- u32 tx_status;
++ volatile u32 tx_status;
+
+ /* Stop the transmitter */
+ outl(TxDIS, ioaddr + cr);
+@@ -940,7 +940,7 @@ sis900_transmit(struct nic *nic,
+
+ to = currticks() + TX_TIMEOUT;
+
+- while ((((volatile u32) tx_status=txd.cmdsts) & OWN) && (currticks() <
to))
++ while (((tx_status=txd.cmdsts) & OWN) && (currticks() < to))
+ /* wait */ ;
+
+ if (currticks() >= to) {
+diff -uprN grub-0.97/netboot/sk_g16.c grub/netboot/sk_g16.c
+--- grub-0.97/netboot/sk_g16.c 2003-07-09 12:45:38.000000000 +0100
++++ grub/netboot/sk_g16.c 2002-01-02 21:56:40.000000000 +0000
+@@ -13,12 +13,12 @@ Changes to make it work with Etherboot b
+ *
+ * Module : sk_g16.c
+ *
+- * Version : $Revision: 1.4 $
++ * Version : $Revision: 609 $
+ *
+ * Author : Patrick J.D. Weichmann
+ *
+ * Date Created : 94/05/26
+- * Last Updated : $Date: 2002/01/02 21:56:40 $
++ * Last Updated : $Date: 2002-01-02 21:56:40 +0000 (mer 02 jan 2002) $
+ *
+ * Description : Schneider & Koch G16 Ethernet Device Driver for
+ * Linux Kernel >= 1.1.22
+diff -uprN grub-0.97/netboot/sk_g16.h grub/netboot/sk_g16.h
+--- grub-0.97/netboot/sk_g16.h 2003-07-09 12:45:38.000000000 +0100
++++ grub/netboot/sk_g16.h 2000-07-29 20:22:54.000000000 +0100
+@@ -4,7 +4,7 @@
+ * of the GNU Public License, incorporated herein by reference.
+ *
+ * Module : sk_g16.h
+- * Version : $Revision: 1.3 $
++ * Version : $Revision: 388 $
+ *
+ * Author : M.Hipp (mhipp@xxxxxxxxxxxxxxxxxxxxxxxx)
+ * changes by : Patrick J.D. Weichmann
+@@ -15,8 +15,8 @@
+ * the am7990 (LANCE) chip used for writing a
+ * network device driver which uses this chip
+ *
+- * $Log: sk_g16.h,v $
+- * Revision 1.3 2000/07/29 19:22:54 okuji
++ * $Log$
++ * Revision 1.3 2000-07-29 19:22:54 okuji
+ * update the network support to etherboot-4.6.4.
+ *
+ -*/
+diff -uprN grub-0.97/stage1/Makefile.am grub/stage1/Makefile.am
+--- grub-0.97/stage1/Makefile.am 2004-07-16 12:44:56.000000000 +0100
++++ grub/stage1/Makefile.am 2007-11-05 01:29:46.000000000 +0000
+@@ -5,7 +5,7 @@ CLEANFILES = $(nodist_pkglib_DATA)
+
+ # We can't use builtins or standard includes.
+ AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
+-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
++stage1_exec_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
+
+ noinst_PROGRAMS = stage1.exec
+ stage1_exec_SOURCES = stage1.S stage1.h
+diff -uprN grub-0.97/stage1/Makefile.in grub/stage1/Makefile.in
+--- grub-0.97/stage1/Makefile.in 2005-05-08 03:42:36.000000000 +0100
++++ grub/stage1/Makefile.in 2007-11-05 01:29:46.000000000 +0000
+@@ -110,7 +110,7 @@ INSTALL_DATA = @INSTALL_DATA@
+ INSTALL_PROGRAM = @INSTALL_PROGRAM@
+ INSTALL_SCRIPT = @INSTALL_SCRIPT@
+ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
++LDFLAGS = @LDFLAGS@
+ LIBOBJS = @LIBOBJS@
+ LIBS = @LIBS@
+ LTLIBOBJS = @LTLIBOBJS@
+@@ -188,6 +188,7 @@ CLEANFILES = $(nodist_pkglib_DATA)
+
+ # We can't use builtins or standard includes.
+ AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
++stage1_exec_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
+ stage1_exec_SOURCES = stage1.S stage1.h
+ SUFFIXES = .exec
+ all: all-am
+diff -uprN grub-0.97/stage2/bios.c grub/stage2/bios.c
+--- grub-0.97/stage2/bios.c 2004-03-27 16:34:04.000000000 +0000
++++ grub/stage2/bios.c 2008-03-28 13:22:28.000000000 +0000
+@@ -47,7 +47,7 @@ extern int get_diskinfo_floppy (int driv
+ return the error number. Otherwise, return 0. */
+ int
+ biosdisk (int read, int drive, struct geometry *geometry,
+- int sector, int nsec, int segment)
++ unsigned int sector, int nsec, int segment)
+ {
+ int err;
+
+diff -uprN grub-0.97/stage2/boot.c grub/stage2/boot.c
+--- grub-0.97/stage2/boot.c 2004-03-30 12:44:08.000000000 +0100
++++ grub/stage2/boot.c 2005-09-28 22:47:55.000000000 +0100
+@@ -1,7 +1,7 @@
+ /* boot.c - load and bootstrap a kernel */
+ /*
+ * GRUB -- GRand Unified Bootloader
+- * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation,
Inc.
++ * Copyright (C) 1999,2000,2001,2002,2003,2004,2005 Free Software
Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -96,7 +96,7 @@ load_image (char *kernel, char *arg, ker
+ lh = (struct linux_kernel_header *) buffer;
+
+ /* ELF loading supported if multiboot, FreeBSD and NetBSD. */
+- if ((type == KERNEL_TYPE_MULTIBOOT
++ if (((type == KERNEL_TYPE_MULTIBOOT && ! (flags & MULTIBOOT_AOUT_KLUDGE))
+ || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD
+ || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0
+ || suggested_type == KERNEL_TYPE_NETBSD)
+diff -uprN grub-0.97/stage2/builtins.c grub/stage2/builtins.c
+--- grub-0.97/stage2/builtins.c 2005-02-15 21:58:23.000000000 +0000
++++ grub/stage2/builtins.c 2006-03-21 20:51:58.000000000 +0000
+@@ -3830,15 +3830,15 @@ setup_func (char *arg, int flags)
+ {
+ char tmp[16];
+ grub_sprintf (tmp, ",%d", (partition >> 16) & 0xFF);
+- grub_strncat (device, tmp, 256);
++ grub_strncat (device, tmp, sizeof (device));
+ }
+ if ((partition & 0x00FF00) != 0x00FF00)
+ {
+ char tmp[16];
+ grub_sprintf (tmp, ",%c", 'a' + ((partition >> 8) & 0xFF));
+- grub_strncat (device, tmp, 256);
++ grub_strncat (device, tmp, sizeof (device));
+ }
+- grub_strncat (device, ")", 256);
++ grub_strncat (device, ")", sizeof (device));
+ }
+
+ int embed_stage1_5 (char *stage1_5, int drive, int partition)
+diff -uprN grub-0.97/stage2/disk_io.c grub/stage2/disk_io.c
+--- grub-0.97/stage2/disk_io.c 2004-05-23 17:35:24.000000000 +0100
++++ grub/stage2/disk_io.c 2008-03-28 13:22:28.000000000 +0000
+@@ -137,7 +137,7 @@ log2 (unsigned long word)
+ }
+
+ int
+-rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
++rawread (int drive, unsigned int sector, int byte_offset, int byte_len, char
*buf)
+ {
+ int slen, sectors_per_vtrack;
+ int sector_size_bits = log2 (buf_geom.sector_size);
+@@ -261,7 +261,7 @@ rawread (int drive, int sector, int byte
+ */
+ if (disk_read_func)
+ {
+- int sector_num = sector;
++ unsigned int sector_num = sector;
+ int length = buf_geom.sector_size - byte_offset;
+ if (length > size)
+ length = size;
+@@ -291,7 +291,7 @@ rawread (int drive, int sector, int byte
+
+
+ int
+-devread (int sector, int byte_offset, int byte_len, char *buf)
++devread (unsigned int sector, int byte_offset, int byte_len, char *buf)
+ {
+ /*
+ * Check partition boundaries
+@@ -330,7 +330,7 @@ devread (int sector, int byte_offset, in
+
+ #ifndef STAGE1_5
+ int
+-rawwrite (int drive, int sector, char *buf)
++rawwrite (int drive, unsigned int sector, char *buf)
+ {
+ if (sector == 0)
+ {
+@@ -363,7 +363,7 @@ rawwrite (int drive, int sector, char *b
+ }
+
+ int
+-devwrite (int sector, int sector_count, char *buf)
++devwrite (unsigned int sector, int sector_count, char *buf)
+ {
+ #if defined(GRUB_UTIL) && defined(__linux__)
+ if (current_partition != 0xFFFFFF
+diff -uprN grub-0.97/stage2/fsys_ffs.c grub/stage2/fsys_ffs.c
+--- grub-0.97/stage2/fsys_ffs.c 2003-07-09 12:45:52.000000000 +0100
++++ grub/stage2/fsys_ffs.c 2001-11-12 06:57:29.000000000 +0000
+@@ -50,7 +50,7 @@
+ * the rights to redistribute these changes.
+ *
+ * from: Mach, Revision 2.2 92/04/04 11:35:49 rpd
+- * $Id: fsys_ffs.c,v 1.10 2001/11/12 06:57:29 okuji Exp $
++ * $Id: fsys_ffs.c 594 2001-11-12 06:57:29Z okuji $
+ */
+
+ #ifdef FSYS_FFS
+diff -uprN grub-0.97/stage2/fsys_ufs2.c grub/stage2/fsys_ufs2.c
+--- grub-0.97/stage2/fsys_ufs2.c 2004-06-19 13:17:52.000000000 +0100
++++ grub/stage2/fsys_ufs2.c 2004-06-19 13:17:52.000000000 +0100
+@@ -51,7 +51,7 @@
+ * the rights to redistribute these changes.
+ *
+ * from: Mach, Revision 2.2 92/04/04 11:35:49 rpd
+- * $Id: fsys_ufs2.c,v 1.2 2004/06/19 12:17:52 okuji Exp $
++ * $Id: fsys_ufs2.c 841 2004-06-19 12:17:52Z okuji $
+ */
+
+ #ifdef FSYS_UFS2
+diff -uprN grub-0.97/stage2/imgact_aout.h grub/stage2/imgact_aout.h
+--- grub-0.97/stage2/imgact_aout.h 2003-07-09 12:45:53.000000000 +0100
++++ grub/stage2/imgact_aout.h 1999-06-24 01:03:29.000000000 +0100
+@@ -32,7 +32,7 @@
+ * SUCH DAMAGE.
+ *
+ * from: @(#)exec.h 8.1 (Berkeley) 6/11/93
+- * $Id: imgact_aout.h,v 1.1 1999/06/24 00:03:22 okuji Exp $
++ * $Id: imgact_aout.h 98 1999-06-24 00:03:29Z okuji $
+ */
+ /*
+ * 11/23/95 - Kludge to get "ntohl" null macro added. -- ESB
+diff -uprN grub-0.97/stage2/iso9660.h grub/stage2/iso9660.h
+--- grub-0.97/stage2/iso9660.h 2004-03-27 16:02:38.000000000 +0000
++++ grub/stage2/iso9660.h 2007-02-22 23:40:25.000000000 +0000
+@@ -73,11 +73,11 @@ typedef union {
+
+ typedef struct __iso_16bit {
+ u_int16_t l, b;
+-} iso_16bit_t __attribute__ ((packed));
++} iso_16bit_t;
+
+ typedef struct __iso_32bit {
+ u_int32_t l, b;
+-} iso_32bit_t __attribute__ ((packed));
++} iso_32bit_t;
+
+ typedef u_int8_t iso_date_t[7];
+
+diff -uprN grub-0.97/stage2/shared.h grub/stage2/shared.h
+--- grub-0.97/stage2/shared.h 2004-06-19 17:40:09.000000000 +0100
++++ grub/stage2/shared.h 2008-03-28 13:22:28.000000000 +0000
+@@ -499,7 +499,11 @@ struct vbe_mode
+ unsigned char linear_reserved_field_position;
+ unsigned long max_pixel_clock;
+
+- unsigned char reserved3[189];
++ /* Reserved field to make structure to be 256 bytes long, VESA BIOS
++ Extension 3.0 Specification says to reserve 189 bytes here but
++ that doesn't make structure to be 256 bytes. So additional one is
++ added here. */
++ unsigned char reserved3[189 + 1];
+ } __attribute__ ((packed));
+
+
+@@ -807,7 +811,7 @@ int checkkey (void);
+ /* Low-level disk I/O */
+ int get_diskinfo (int drive, struct geometry *geometry);
+ int biosdisk (int subfunc, int drive, struct geometry *geometry,
+- int sector, int nsec, int segment);
++ unsigned int sector, int nsec, int segment);
+ void stop_floppy (void);
+
+ /* Command-line interface functions. */
+@@ -920,10 +924,10 @@ int gunzip_test_header (void);
+ int gunzip_read (char *buf, int len);
+ #endif /* NO_DECOMPRESSION */
+
+-int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf);
+-int devread (int sector, int byte_offset, int byte_len, char *buf);
+-int rawwrite (int drive, int sector, char *buf);
+-int devwrite (int sector, int sector_len, char *buf);
++int rawread (int drive, unsigned int sector, int byte_offset, int byte_len,
char *buf);
++int devread (unsigned int sector, int byte_offset, int byte_len, char *buf);
++int rawwrite (int drive, unsigned int sector, char *buf);
++int devwrite (unsigned int sector, int sector_len, char *buf);
+
+ /* Parse a device string and initialize the global parameters. */
+ char *set_device (char *device);
+diff -uprN grub-0.97/stage2/stage2.c grub/stage2/stage2.c
+--- grub-0.97/stage2/stage2.c 2005-03-19 17:51:57.000000000 +0000
++++ grub/stage2/stage2.c 2006-05-05 23:06:31.000000000 +0100
+@@ -651,7 +651,10 @@ restart:
+ *(new_heap++) = 0;
+
+ if (config_entries)
+- run_menu (heap, NULL, new_num_entries, new_heap, 0);
++ {
++ current_entryno = first_entry + entryno;
++ run_menu (heap, NULL, new_num_entries, new_heap, 0);
++ }
+ else
+ {
+ cls ();
+@@ -727,7 +730,8 @@ restart:
+ cur_entry = get_entry (config_entries, first_entry + entryno, 1);
+
+ /* Set CURRENT_ENTRYNO for the command "savedefault". */
+- current_entryno = first_entry + entryno;
++ if (config_entries)
++ current_entryno = first_entry + entryno;
+
+ if (run_script (cur_entry, heap))
+ {
+diff -uprN grub-0.97/stage2/tparm.c grub/stage2/tparm.c
+--- grub-0.97/stage2/tparm.c 2003-07-09 12:45:53.000000000 +0100
++++ grub/stage2/tparm.c 2002-11-29 20:39:24.000000000 +0000
+@@ -63,7 +63,7 @@ typedef char grub_bool;
+ #define MAX_FORMAT_LEN 256
+ #define max(a,b) ((a) > (b) ? (a) : (b))
+
+-//MODULE_ID("$Id: tparm.c,v 1.1 2002/11/29 20:39:24 okuji Exp $")
++//MODULE_ID("$Id: tparm.c 708 2002-11-29 20:39:24Z okuji $")
+
+ /*
+ * char *
+diff -uprN grub-0.97/stamp-h.in grub/stamp-h.in
+--- grub-0.97/stamp-h.in 1970-01-01 01:00:00.000000000 +0100
++++ grub/stamp-h.in 1999-09-13 14:32:31.000000000 +0100
+@@ -0,0 +1 @@
++timestamp
+diff -uprN grub-0.97/THANKS grub/THANKS
+--- grub-0.97/THANKS 2005-05-08 03:17:43.000000000 +0100
++++ grub/THANKS 2006-03-21 20:51:58.000000000 +0000
+@@ -121,3 +121,4 @@ Vesa Jaaskelainen <jaaskela@tietomyrsky.
+ Yedidyah Bar-David <didi@xxxxxxxxxxxxxx>
+ Yury V. Umanets <umka@xxxxxxxxxxx>
+ Yuri Zaporogets <yuriz@xxxxxxx>
++Vitaly Fertman <vitaly@xxxxxxxxxxx>
+diff -uprN grub-0.97/util/grub-install.in grub/util/grub-install.in
+--- grub-0.97/util/grub-install.in 2004-07-24 19:57:31.000000000 +0100
++++ grub/util/grub-install.in 2006-04-20 14:46:46.000000000 +0100
+@@ -112,8 +112,8 @@ convert () {
+ tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
+ tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
+ freebsd* | kfreebsd*-gnu)
+- tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
+- | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
++ tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \
++ | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'`
+ tmp_part=`echo "$1" \
+ | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
+ | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
+diff -uprN grub-0.97/util/mkbimage grub/util/mkbimage
+--- grub-0.97/util/mkbimage 2004-07-24 19:57:31.000000000 +0100
++++ grub/util/mkbimage 2007-02-22 16:01:03.000000000 +0000
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+ # MaKe a Bootable IMAGE --- 1.44, 2.88 and El Torito no-emulation mode
+ # C) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx>
+-# C) 2001,2002,2003 Robert Millan <robertmh@xxxxxxx>
++# C) 2001,2002,2003 Robert Millan <rmh@xxxxxxxxxxx>
+
+
+ # This program is free software; you can redistribute it and/or modify
+@@ -19,7 +19,7 @@
+ # program's maintainer or write to: The Free Software Foundation,
+ # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+
+-# $Id: mkbimage,v 1.19 2004/07/21 14:43:04 robertmh Exp $
++# $Id: mkbimage 1233 2007-02-22 16:01:03Z robertmh $
+
+ # Global variables
+ tarfile=
+@@ -58,7 +58,7 @@ stage2_os_name=
+
+ # Name by which this script was invoked.
+ program=`echo "$0" | sed -e 's/[^\/]*\///g'`
+-version_number='$Revision: 1.19 $'
++version_number='$Revision: 1233 $'
+
+ usage="
+ Usage: $program [-hVF] [-t TYPE] [-d DIRECTORY] [-s FS_TYPE] -f TAR_FILE
+@@ -94,15 +94,13 @@ Options:
+ display Version information and exit
+
+ Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx>.
+-Copyright (c) 2001,2002 Robert Millan <zeratul2@xxxxxxxxxx>.
+ GPLed."
+
+ version="mkbimage $version_number
+
+-Written by Thierry Laronde and Robert Millan.
++Written by Thierry Laronde.
+
+ Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@xxxxxxxxxxx>.
+-Copyright (c) 2001,2002,2003 Robert Millan <zeratul2@xxxxxxxxxx>.
+
+ This is free software under the GPL version 2 or later; see the source for
+ copying conditions. There is NO warranty, not even for MERCHANTABILITY or
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub.patches/99minios
--- a/stubdom/grub.patches/99minios Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/grub.patches/99minios Fri Jul 18 12:12:41 2008 +0900
@@ -1465,3 +1465,31 @@ Index: grub/stage2/stage2.c
# endif /* SUPPORT_DISKLESS */
static int preset_menu_offset;
+Index: grub/stage2/fsys_xfs.c
+===================================================================
+RCS file: /sources/grub/grub/stage2/fsys_xfs.c,v
+retrieving revision 1.5
+diff -u -p -r1.5 fsys_xfs.c
+--- grub/stage2/fsys_xfs.c 8 May 2005 02:18:14 -0000 1.5
++++ grub/stage2/fsys_xfs.c 10 Jul 2008 13:09:50 -0000
+@@ -101,7 +101,7 @@ static inline __const__ xfs_uint16_t
+ le16 (xfs_uint16_t x)
+ {
+ __asm__("xchgb %b0,%h0" \
+- : "=q" (x) \
++ : "=Q" (x) \
+ : "0" (x)); \
+ return x;
+ }
+@@ -109,9 +109,9 @@ le16 (xfs_uint16_t x)
+ static inline __const__ xfs_uint32_t
+ le32 (xfs_uint32_t x)
+ {
+-#if 0
++#if 1
+ /* 386 doesn't have bswap. */
+- __asm__("bswap %0" : "=r" (x) : "0" (x));
++ __asm__("bswapl %k0" : "=r" (x) : "0" (x));
+ #else
+ /* This is slower but this works on all x86 architectures. */
+ __asm__("xchgb %b0, %h0" \
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub/Makefile
--- a/stubdom/grub/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/grub/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -1,14 +1,14 @@ XEN_ROOT = ../..
XEN_ROOT = ../..
include $(XEN_ROOT)/Config.mk
-vpath %.c ../grub-cvs
+vpath %.c ../grub-upstream
BOOT=boot-$(XEN_TARGET_ARCH).o
DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libxc -I$(XEN_ROOT)/tools/include -I.
-DEF_CPPFLAGS += -I../grub-cvs/stage1
-DEF_CPPFLAGS += -I../grub-cvs/stage2
-DEF_CPPFLAGS += -I../grub-cvs/netboot
+DEF_CPPFLAGS += -I../grub-upstream/stage1
+DEF_CPPFLAGS += -I../grub-upstream/stage2
+DEF_CPPFLAGS += -I../grub-upstream/netboot
DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/firmware/vgabios
DEF_CPPFLAGS += -DWITHOUT_LIBC_STUBS
DEF_CPPFLAGS += -DSUPPORT_NETBOOT
@@ -51,10 +51,8 @@ STAGE2_SOURCES+=fsys_vstafs.c
STAGE2_SOURCES+=fsys_vstafs.c
CPPFLAGS += -DFSYS_VSTAFS=1
-ifeq (0,1)
STAGE2_SOURCES+=fsys_xfs.c
CPPFLAGS += -DFSYS_XFS=1
-endif
STAGE2_SOURCES:=$(addprefix stage2/,$(STAGE2_SOURCES))
NETBOOT_SOURCES:=$(addprefix netboot/,$(NETBOOT_SOURCES))
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/grub/mini-os.c
--- a/stubdom/grub/mini-os.c Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/grub/mini-os.c Fri Jul 18 12:12:41 2008 +0900
@@ -681,7 +681,9 @@ int main(int argc, char *argv[])
config_file[sizeof(config_file) - 1] = 0;
if (!strncmp(config_file, "(nd)", 4))
preset_menu = "dhcp";
- } else
+ } else if (start_info.mod_len)
+ preset_menu = (void*) start_info.mod_start;
+ else
preset_menu = "dhcp --with-configfile";
mbi.drives_addr = BOOTSEC_LOCATION + (60 * 1024);
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/libpci.config.h
--- a/stubdom/libpci.config.h Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/libpci.config.h Fri Jul 18 12:12:41 2008 +0900
@@ -1,4 +1,4 @@
-#define PCI_OS_STUBDOM
+#define PCI_OS_MINIOS
#define PCI_HAVE_STDINT_H
#define PCI_PATH_IDS_DIR "."
#define PCI_COMPRESSED_IDS
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/libpci.config.mak
--- a/stubdom/libpci.config.mak Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/libpci.config.mak Fri Jul 18 12:12:41 2008 +0900
@@ -1,2 +1,7 @@ LIBZ=-lz
LIBZ=-lz
LDLIBS+=$(LIBZ)
+PCI_OS_MINIOS=1
+PCI_HAVE_STDINT_H=1
+PCI_PATH_IDS_DIR=.
+PCI_COMPRESSED_IDS=1
+PCI_IDS=pci.ids.gz
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/lwip.patch-cvs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stubdom/lwip.patch-cvs Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,2398 @@
+? .ChangeLog.swp
+? ChangeLog
+Index: CHANGELOG
+===================================================================
+RCS file: /sources/lwip/lwip/CHANGELOG,v
+retrieving revision 1.300
+retrieving revision 1.318
+diff -u -p -r1.300 -r1.318
+--- CHANGELOG 23 Mar 2008 13:49:39 -0000 1.300
++++ CHANGELOG 14 Jul 2008 20:12:36 -0000 1.318
+@@ -19,9 +19,77 @@ HISTORY
+
+ ++ New features:
+
++ 2008-06-30 Simon Goldschmidt
++ * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from
++ interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
allows
++ mem_free to run between mem_malloc iterations. Added illegal counter for
++ mem stats.
++
++ 2008-06-27 Simon Goldschmidt
++ * stats.h/.c, some other files: patch #6483: stats module improvement:
++ Added defines to display each module's statistic individually, added stats
++ defines for MEM, MEMP and SYS modules, removed (unused) rexmit counter.
++
++ 2008-06-17 Simon Goldschmidt
++ * err.h: patch #6459: Made err_t overridable to use a more efficient type
++ (define LWIP_ERR_T in cc.h)
++
++ 2008-06-17 Simon Goldschmidt
++ * slipif.c: patch #6480: Added a configuration option for slipif for
symmetry
++ to loopif
++
++ 2008-06-17 Simon Goldschmidt (patch by Luca Ceresoli)
++ * netif.c, loopif.c, ip.c, netif.h, loopif.h, opt.h: Checked in slightly
++ modified version of patch # 6370: Moved loopif code to netif.c so that
++ loopback traffic is supported on all netifs (all local IPs).
++ Added option to limit loopback packets for each netifs.
++
+
+ ++ Bugfixes:
+
++ 2008-08-14 Simon Goldschmidt
++ * api_msg.c: fixed bug #23847: do_close_internal references freed memory
(when
++ tcp_close returns != ERR_OK)
++
++ 2008-07-08 Frédéric Bernon
++ * stats.h: Fix some build bugs introduced with patch #6483 (missing some
parameters
++ in macros, mainly if MEM_STATS=0 and MEMP_STATS=0).
++
++ 2008-06-24 Jonathan Larmour
++ * tcp_in.c: Fix for bug #23693 as suggested by Art R. Ensure cseg is unused
++ if tcp_seg_copy fails.
++
++ 2008-06-17 Simon Goldschmidt
++ * inet_chksum.c: Checked in some ideas of patch #6460 (loop optimizations)
++ and created defines for swapping bytes and folding u32 to u16.
++
++ 2008-05-30 Kieran Mansley
++ * tcp_in.c Remove redundant "if" statement, and use real rcv_wnd
++ rather than rcv_ann_wnd when deciding if packets are in-window.
++ Contributed by <arasmussen@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
++
++ 2008-05-30 Kieran Mansley
++ * mem.h: Fix BUG#23254. Change macro definition of mem_* to allow
++ passing as function pointers when MEM_LIBC_MALLOC is defined.
++
++ 2008-05-09 Jonathan Larmour
++ * err.h, err.c, sockets.c: Fix bug #23119: Reorder timeout error code to
++ stop it being treated as a fatal error.
++
++ 2008-04-15 Simon Goldschmidt
++ * dhcp.c: fixed bug #22804: dhcp_stop doesn't clear NETIF_FLAG_DHCP
++ (flag now cleared)
++
++ 2008-03-27 Simon Goldschmidt
++ * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling
mem_free/pbuf_free
++ from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1
++ in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free
pbufs
++ or heap memory from interrupt context
++
++ 2008-03-26 Simon Goldschmidt
++ * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a
remote
++ host sent a zero mss as TCP option.
++
+
+ (STABLE-1.3.0)
+
+Index: src/api/api_msg.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/api/api_msg.c,v
+retrieving revision 1.102
+retrieving revision 1.104
+diff -u -p -r1.102 -r1.104
+--- src/api/api_msg.c 21 Mar 2008 16:23:14 -0000 1.102
++++ src/api/api_msg.c 15 Jul 2008 11:18:58 -0000 1.104
+@@ -598,11 +598,16 @@ do_close_internal(struct netconn *conn)
+ LWIP_ASSERT("pcb already closed", (conn->pcb.tcp != NULL));
+
+ /* Set back some callback pointers */
++ tcp_arg(conn->pcb.tcp, NULL);
+ if (conn->pcb.tcp->state == LISTEN) {
+- tcp_arg(conn->pcb.tcp, NULL);
+ tcp_accept(conn->pcb.tcp, NULL);
+ } else {
+ tcp_recv(conn->pcb.tcp, NULL);
++ tcp_accept(conn->pcb.tcp, NULL);
++ /* some callbacks have to be reset if tcp_close is not successful */
++ tcp_sent(conn->pcb.tcp, NULL);
++ tcp_poll(conn->pcb.tcp, NULL, 4);
++ tcp_err(conn->pcb.tcp, NULL);
+ }
+ /* Try to close the connection */
+ err = tcp_close(conn->pcb.tcp);
+@@ -610,11 +615,6 @@ do_close_internal(struct netconn *conn)
+ /* Closing succeeded */
+ conn->state = NETCONN_NONE;
+ /* Set back some callback pointers as conn is going away */
+- tcp_err(conn->pcb.tcp, NULL);
+- tcp_poll(conn->pcb.tcp, NULL, 4);
+- tcp_sent(conn->pcb.tcp, NULL);
+- tcp_recv(conn->pcb.tcp, NULL);
+- tcp_arg(conn->pcb.tcp, NULL);
+ conn->pcb.tcp = NULL;
+ conn->err = ERR_OK;
+ /* Trigger select() in socket layer. This send should something else so
the
+@@ -623,6 +623,14 @@ do_close_internal(struct netconn *conn)
+ API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
+ /* wake up the application task */
+ sys_sem_signal(conn->op_completed);
++ } else {
++ /* Closing failed, restore some of the callbacks */
++ /* Closing of listen pcb will never fail! */
++ LWIP_ASSERT("Closing a listen pcb may not fail!", (conn->pcb.tcp->state
!= LISTEN));
++ tcp_sent(conn->pcb.tcp, sent_tcp);
++ tcp_poll(conn->pcb.tcp, poll_tcp, 4);
++ tcp_err(conn->pcb.tcp, err_tcp);
++ tcp_arg(conn->pcb.tcp, conn);
+ }
+ /* If closing didn't succeed, we get called again either
+ from poll_tcp or from sent_tcp */
+Index: src/api/err.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/api/err.c,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -p -r1.11 -r1.12
+--- src/api/err.c 13 Dec 2007 23:06:50 -0000 1.11
++++ src/api/err.c 9 May 2008 12:14:23 -0000 1.12
+@@ -44,17 +44,17 @@ static const char *err_strerr[] = {
+ "Ok.", /* ERR_OK 0 */
+ "Out of memory error.", /* ERR_MEM -1 */
+ "Buffer error.", /* ERR_BUF -2 */
+- "Routing problem.", /* ERR_RTE -3 */
+- "Connection aborted.", /* ERR_ABRT -4 */
+- "Connection reset.", /* ERR_RST -5 */
+- "Connection closed.", /* ERR_CLSD -6 */
+- "Not connected.", /* ERR_CONN -7 */
+- "Illegal value.", /* ERR_VAL -8 */
+- "Illegal argument.", /* ERR_ARG -9 */
+- "Address in use.", /* ERR_USE -10 */
+- "Low-level netif error.", /* ERR_IF -11 */
+- "Already connected.", /* ERR_ISCONN -12 */
+- "Timeout.", /* ERR_TIMEOUT -13 */
++ "Timeout.", /* ERR_TIMEOUT -3 */
++ "Routing problem.", /* ERR_RTE -4 */
++ "Connection aborted.", /* ERR_ABRT -5 */
++ "Connection reset.", /* ERR_RST -6 */
++ "Connection closed.", /* ERR_CLSD -7 */
++ "Not connected.", /* ERR_CONN -8 */
++ "Illegal value.", /* ERR_VAL -9 */
++ "Illegal argument.", /* ERR_ARG -10 */
++ "Address in use.", /* ERR_USE -11 */
++ "Low-level netif error.", /* ERR_IF -12 */
++ "Already connected.", /* ERR_ISCONN -13 */
+ "Operation in progress." /* ERR_INPROGRESS -14 */
+ };
+
+Index: src/api/netdb.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/api/netdb.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -p -r1.4 -r1.5
+--- src/api/netdb.c 26 Jan 2008 16:11:39 -0000 1.4
++++ src/api/netdb.c 16 Jul 2008 20:36:12 -0000 1.5
+@@ -326,7 +326,8 @@ lwip_getaddrinfo(const char *nodename, c
+ if (nodename != NULL) {
+ /* copy nodename to canonname if specified */
+ size_t namelen = strlen(nodename);
+- ai->ai_canonname = mem_malloc(namelen + 1);
++ LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1);
++ ai->ai_canonname = mem_malloc((mem_size_t)(namelen + 1));
+ if (ai->ai_canonname == NULL) {
+ goto memerr;
+ }
+Index: src/api/sockets.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/api/sockets.c,v
+retrieving revision 1.116
+retrieving revision 1.117
+diff -u -p -r1.116 -r1.117
+--- src/api/sockets.c 13 Mar 2008 20:03:57 -0000 1.116
++++ src/api/sockets.c 9 May 2008 12:14:24 -0000 1.117
+@@ -128,17 +128,17 @@ static const int err_to_errno_table[] =
+ 0, /* ERR_OK 0 No error, everything OK. */
+ ENOMEM, /* ERR_MEM -1 Out of memory error. */
+ ENOBUFS, /* ERR_BUF -2 Buffer error. */
+- EHOSTUNREACH, /* ERR_RTE -3 Routing problem. */
+- ECONNABORTED, /* ERR_ABRT -4 Connection aborted. */
+- ECONNRESET, /* ERR_RST -5 Connection reset. */
+- ESHUTDOWN, /* ERR_CLSD -6 Connection closed. */
+- ENOTCONN, /* ERR_CONN -7 Not connected. */
+- EINVAL, /* ERR_VAL -8 Illegal value. */
+- EIO, /* ERR_ARG -9 Illegal argument. */
+- EADDRINUSE, /* ERR_USE -10 Address in use. */
+- -1, /* ERR_IF -11 Low-level netif error */
+- -1, /* ERR_ISCONN -12 Already connected. */
+- ETIMEDOUT, /* ERR_TIMEOUT -13 Timeout */
++ ETIMEDOUT, /* ERR_TIMEOUT -3 Timeout */
++ EHOSTUNREACH, /* ERR_RTE -4 Routing problem. */
++ ECONNABORTED, /* ERR_ABRT -5 Connection aborted. */
++ ECONNRESET, /* ERR_RST -6 Connection reset. */
++ ESHUTDOWN, /* ERR_CLSD -7 Connection closed. */
++ ENOTCONN, /* ERR_CONN -8 Not connected. */
++ EINVAL, /* ERR_VAL -9 Illegal value. */
++ EIO, /* ERR_ARG -10 Illegal argument. */
++ EADDRINUSE, /* ERR_USE -11 Address in use. */
++ -1, /* ERR_IF -12 Low-level netif error */
++ -1, /* ERR_ISCONN -13 Already connected. */
+ EINPROGRESS /* ERR_INPROGRESS -14 Operation in progress */
+ };
+
+Index: src/api/tcpip.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/api/tcpip.c,v
+retrieving revision 1.70
+retrieving revision 1.73
+diff -u -p -r1.70 -r1.73
+--- src/api/tcpip.c 12 Jan 2008 11:52:22 -0000 1.70
++++ src/api/tcpip.c 27 Jun 2008 20:34:51 -0000 1.73
+@@ -518,4 +518,42 @@ tcpip_init(void (* initfunc)(void *), vo
+ sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL,
TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
+ }
+
++/**
++ * Simple callback function used with tcpip_callback to free a pbuf
++ * (pbuf_free has a wrong signature for tcpip_callback)
++ *
++ * @param p The pbuf (chain) to be dereferenced.
++ */
++static void
++pbuf_free_int(void *p)
++{
++ struct pbuf *q = p;
++ pbuf_free(q);
++}
++
++/**
++ * A simple wrapper function that allows you to free a pbuf from interrupt
context.
++ *
++ * @param p The pbuf (chain) to be dereferenced.
++ * @return ERR_OK if callback could be enqueued, an err_t if not
++ */
++err_t
++pbuf_free_callback(struct pbuf *p)
++{
++ return tcpip_callback_with_block(pbuf_free_int, p, 0);
++}
++
++/**
++ * A simple wrapper function that allows you to free heap memory from
++ * interrupt context.
++ *
++ * @param m the heap memory to free
++ * @return ERR_OK if callback could be enqueued, an err_t if not
++ */
++err_t
++mem_free_callback(void *m)
++{
++ return tcpip_callback_with_block(mem_free, m, 0);
++}
++
+ #endif /* !NO_SYS */
+Index: src/core/dhcp.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/dhcp.c,v
+retrieving revision 1.86
+retrieving revision 1.87
+diff -u -p -r1.86 -r1.87
+--- src/core/dhcp.c 4 Mar 2008 14:25:58 -0000 1.86
++++ src/core/dhcp.c 15 Apr 2008 17:24:55 -0000 1.87
+@@ -568,6 +568,8 @@ dhcp_start(struct netif *netif)
+ LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;);
+ dhcp = netif->dhcp;
+ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0],
netif->name[1], (u16_t)netif->num));
++ /* Remove the flag that says this netif is handled by DHCP,
++ it is set when we succeeded starting. */
+ netif->flags &= ~NETIF_FLAG_DHCP;
+
+ /* no DHCP client attached yet? */
+@@ -609,6 +611,7 @@ dhcp_start(struct netif *netif)
+ dhcp_stop(netif);
+ return ERR_MEM;
+ }
++ /* Set the flag that says this netif is handled by DHCP. */
+ netif->flags |= NETIF_FLAG_DHCP;
+ return result;
+ }
+@@ -1063,6 +1066,8 @@ dhcp_stop(struct netif *netif)
+ {
+ struct dhcp *dhcp = netif->dhcp;
+ LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
++ /* Remove the flag that says this netif is handled by DHCP. */
++ netif->flags &= ~NETIF_FLAG_DHCP;
+
+ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | 3, ("dhcp_stop()\n"));
+ /* netif is DHCP configured? */
+Index: src/core/mem.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/mem.c,v
+retrieving revision 1.59
+retrieving revision 1.62
+diff -u -p -r1.59 -r1.62
+--- src/core/mem.c 4 Mar 2008 16:31:32 -0000 1.59
++++ src/core/mem.c 30 Jun 2008 18:16:51 -0000 1.62
+@@ -177,9 +177,36 @@ static u8_t *ram;
+ static struct mem *ram_end;
+ /** pointer to the lowest free block, this is used for faster search */
+ static struct mem *lfree;
++
+ /** concurrent access protection */
+ static sys_sem_t mem_sem;
+
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++
++static volatile u8_t mem_free_count;
++
++/* Allow mem_free from other (e.g. interrupt) context */
++#define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free)
++#define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free)
++#define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free)
++#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc)
++#define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc)
++#define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc)
++
++#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++
++/* Protect the heap only by using a semaphore */
++#define LWIP_MEM_FREE_DECL_PROTECT()
++#define LWIP_MEM_FREE_PROTECT() sys_arch_sem_wait(mem_sem, 0)
++#define LWIP_MEM_FREE_UNPROTECT() sys_sem_signal(mem_sem)
++/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */
++#define LWIP_MEM_ALLOC_DECL_PROTECT()
++#define LWIP_MEM_ALLOC_PROTECT()
++#define LWIP_MEM_ALLOC_UNPROTECT()
++
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++
++
+ /**
+ * "Plug holes" by combining adjacent empty struct mems.
+ * After this function is through, there should not exist
+@@ -255,9 +282,7 @@ mem_init(void)
+ /* initialize the lowest-free pointer to the start of the heap */
+ lfree = (struct mem *)ram;
+
+-#if MEM_STATS
+- lwip_stats.mem.avail = MEM_SIZE_ALIGNED;
+-#endif /* MEM_STATS */
++ MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
+ }
+
+ /**
+@@ -270,6 +295,7 @@ void
+ mem_free(void *rmem)
+ {
+ struct mem *mem;
++ LWIP_MEM_FREE_DECL_PROTECT();
+
+ if (rmem == NULL) {
+ LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | 2, ("mem_free(p == NULL) was
called.\n"));
+@@ -277,20 +303,20 @@ mem_free(void *rmem)
+ }
+ LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) &
(MEM_ALIGNMENT-1)) == 0);
+
+- /* protect the heap from concurrent access */
+- sys_arch_sem_wait(mem_sem, 0);
+-
+ LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
+ (u8_t *)rmem < (u8_t *)ram_end);
+
+ if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
++ SYS_ARCH_DECL_PROTECT(lev);
+ LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_free: illegal memory\n"));
+-#if MEM_STATS
+- ++lwip_stats.mem.err;
+-#endif /* MEM_STATS */
+- sys_sem_signal(mem_sem);
++ /* protect mem stats from concurrent access */
++ SYS_ARCH_PROTECT(lev);
++ MEM_STATS_INC(illegal);
++ SYS_ARCH_UNPROTECT(lev);
+ return;
+ }
++ /* protect the heap from concurrent access */
++ LWIP_MEM_FREE_PROTECT();
+ /* Get the corresponding struct mem ... */
+ mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
+ /* ... which has to be in a used state ... */
+@@ -303,13 +329,14 @@ mem_free(void *rmem)
+ lfree = mem;
+ }
+
+-#if MEM_STATS
+- lwip_stats.mem.used -= mem->next - ((u8_t *)mem - ram);
+-#endif /* MEM_STATS */
++ MEM_STATS_DEC_USED(used, mem->next - ((u8_t *)mem - ram));
+
+ /* finally, see if prev or next are free also */
+ plug_holes(mem);
+- sys_sem_signal(mem_sem);
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ mem_free_count = 1;
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++ LWIP_MEM_FREE_UNPROTECT();
+ }
+
+ /**
+@@ -321,6 +348,8 @@ mem_free(void *rmem)
+ * @param newsize required size after shrinking (needs to be smaller than or
+ * equal to the previous size)
+ * @return for compatibility reasons: is always == rmem, at the moment
++ * or NULL if newsize is > old size, in which case rmem is NOT touched
++ * or freed!
+ */
+ void *
+ mem_realloc(void *rmem, mem_size_t newsize)
+@@ -328,6 +357,8 @@ mem_realloc(void *rmem, mem_size_t newsi
+ mem_size_t size;
+ mem_size_t ptr, ptr2;
+ struct mem *mem, *mem2;
++ /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
++ LWIP_MEM_FREE_DECL_PROTECT();
+
+ /* Expand the size of the allocated memory region so that we can
+ adjust for alignment. */
+@@ -346,7 +377,12 @@ mem_realloc(void *rmem, mem_size_t newsi
+ (u8_t *)rmem < (u8_t *)ram_end);
+
+ if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
++ SYS_ARCH_DECL_PROTECT(lev);
+ LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_realloc: illegal memory\n"));
++ /* protect mem stats from concurrent access */
++ SYS_ARCH_PROTECT(lev);
++ MEM_STATS_INC(illegal);
++ SYS_ARCH_UNPROTECT(lev);
+ return rmem;
+ }
+ /* Get the corresponding struct mem ... */
+@@ -366,11 +402,9 @@ mem_realloc(void *rmem, mem_size_t newsi
+ }
+
+ /* protect the heap from concurrent access */
+- sys_arch_sem_wait(mem_sem, 0);
++ LWIP_MEM_FREE_PROTECT();
+
+-#if MEM_STATS
+- lwip_stats.mem.used -= (size - newsize);
+-#endif /* MEM_STATS */
++ MEM_STATS_DEC_USED(used, (size - newsize));
+
+ mem2 = (struct mem *)&ram[mem->next];
+ if(mem2->used == 0) {
+@@ -426,7 +460,10 @@ mem_realloc(void *rmem, mem_size_t newsi
+ -> don't do anyhting.
+ -> the remaining space stays unused since it is too small
+ } */
+- sys_sem_signal(mem_sem);
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ mem_free_count = 1;
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++ LWIP_MEM_FREE_UNPROTECT();
+ return rmem;
+ }
+
+@@ -444,6 +481,10 @@ mem_malloc(mem_size_t size)
+ {
+ mem_size_t ptr, ptr2;
+ struct mem *mem, *mem2;
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ u8_t local_mem_free_count = 0;
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++ LWIP_MEM_ALLOC_DECL_PROTECT();
+
+ if (size == 0) {
+ return NULL;
+@@ -464,88 +505,101 @@ mem_malloc(mem_size_t size)
+
+ /* protect the heap from concurrent access */
+ sys_arch_sem_wait(mem_sem, 0);
++ LWIP_MEM_ALLOC_PROTECT();
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ /* run as long as a mem_free disturbed mem_malloc */
++ do {
++ local_mem_free_count = 0;
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
++
++ /* Scan through the heap searching for a free block that is big enough,
++ * beginning with the lowest free block.
++ */
++ for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size;
++ ptr = ((struct mem *)&ram[ptr])->next) {
++ mem = (struct mem *)&ram[ptr];
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ mem_free_count = 0;
++ LWIP_MEM_ALLOC_UNPROTECT();
++ /* allow mem_free to run */
++ LWIP_MEM_ALLOC_PROTECT();
++ if (mem_free_count != 0) {
++ local_mem_free_count = mem_free_count;
++ }
++ mem_free_count = 0;
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
+
+- /* Scan through the heap searching for a free block that is big enough,
+- * beginning with the lowest free block.
+- */
+- for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size;
+- ptr = ((struct mem *)&ram[ptr])->next) {
+- mem = (struct mem *)&ram[ptr];
+-
+- if ((!mem->used) &&
+- (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
+- /* mem is not used and at least perfect fit is possible:
+- * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size'
of mem */
+-
+- if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM
+ MIN_SIZE_ALIGNED)) {
+- /* (in addition to the above, we test if another struct mem
(SIZEOF_STRUCT_MEM) containing
+- * at least MIN_SIZE_ALIGNED of data also fits in the 'user data
space' of 'mem')
+- * -> split large block, create empty remainder,
+- * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if
+- * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size,
+- * struct mem would fit in but no data between mem2 and mem2->next
+- * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty
+- * region that couldn't hold data, but when mem->next gets
freed,
+- * the 2 regions would be combined, resulting in more free
memory
+- */
+- ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
+- /* create mem2 struct */
+- mem2 = (struct mem *)&ram[ptr2];
+- mem2->used = 0;
+- mem2->next = mem->next;
+- mem2->prev = ptr;
+- /* and insert it between mem and mem->next */
+- mem->next = ptr2;
+- mem->used = 1;
+-
+- if (mem2->next != MEM_SIZE_ALIGNED) {
+- ((struct mem *)&ram[mem2->next])->prev = ptr2;
+- }
+-#if MEM_STATS
+- lwip_stats.mem.used += (size + SIZEOF_STRUCT_MEM);
+- if (lwip_stats.mem.max < lwip_stats.mem.used) {
+- lwip_stats.mem.max = lwip_stats.mem.used;
++ if ((!mem->used) &&
++ (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
++ /* mem is not used and at least perfect fit is possible:
++ * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data
size' of mem */
++
++ if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size +
SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
++ /* (in addition to the above, we test if another struct mem
(SIZEOF_STRUCT_MEM) containing
++ * at least MIN_SIZE_ALIGNED of data also fits in the 'user data
space' of 'mem')
++ * -> split large block, create empty remainder,
++ * remainder must be large enough to contain MIN_SIZE_ALIGNED data:
if
++ * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size,
++ * struct mem would fit in but no data between mem2 and mem2->next
++ * @todo we could leave out MIN_SIZE_ALIGNED. We would create an
empty
++ * region that couldn't hold data, but when mem->next gets
freed,
++ * the 2 regions would be combined, resulting in more free
memory
++ */
++ ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
++ /* create mem2 struct */
++ mem2 = (struct mem *)&ram[ptr2];
++ mem2->used = 0;
++ mem2->next = mem->next;
++ mem2->prev = ptr;
++ /* and insert it between mem and mem->next */
++ mem->next = ptr2;
++ mem->used = 1;
++
++ if (mem2->next != MEM_SIZE_ALIGNED) {
++ ((struct mem *)&ram[mem2->next])->prev = ptr2;
++ }
++ MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM));
++ } else {
++ /* (a mem2 struct does no fit into the user data space of mem and
mem->next will always
++ * be used at this point: if not we have 2 unused structs in a row,
plug_holes should have
++ * take care of this).
++ * -> near fit or excact fit: do not split, no mem2 creation
++ * also can't move mem->next directly behind mem, since mem->next
++ * will always be used at this point!
++ */
++ mem->used = 1;
++ MEM_STATS_INC_USED(used, mem->next - ((u8_t *)mem - ram));
+ }
+-#endif /* MEM_STATS */
+- } else {
+- /* (a mem2 struct does no fit into the user data space of mem and
mem->next will always
+- * be used at this point: if not we have 2 unused structs in a row,
plug_holes should have
+- * take care of this).
+- * -> near fit or excact fit: do not split, no mem2 creation
+- * also can't move mem->next directly behind mem, since mem->next
+- * will always be used at this point!
+- */
+- mem->used = 1;
+-#if MEM_STATS
+- lwip_stats.mem.used += mem->next - ((u8_t *)mem - ram);
+- if (lwip_stats.mem.max < lwip_stats.mem.used) {
+- lwip_stats.mem.max = lwip_stats.mem.used;
+- }
+-#endif /* MEM_STATS */
+- }
+
+- if (mem == lfree) {
+- /* Find next free block after mem and update lowest free pointer */
+- while (lfree->used && lfree != ram_end) {
+- lfree = (struct mem *)&ram[lfree->next];
++ if (mem == lfree) {
++ /* Find next free block after mem and update lowest free pointer */
++ while (lfree->used && lfree != ram_end) {
++ LWIP_MEM_ALLOC_UNPROTECT();
++ /* prevent high interrupt latency... */
++ LWIP_MEM_ALLOC_PROTECT();
++ lfree = (struct mem *)&ram[lfree->next];
++ }
++ LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) ||
(!lfree->used)));
+ }
+- LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) ||
(!lfree->used)));
+- }
+- sys_sem_signal(mem_sem);
+- LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
+- (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
+- LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
+- (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
+- LWIP_ASSERT("mem_malloc: sanity check alignment",
+- (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
++ LWIP_MEM_ALLOC_UNPROTECT();
++ sys_sem_signal(mem_sem);
++ LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
++ (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
++ LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
++ (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT ==
0);
++ LWIP_ASSERT("mem_malloc: sanity check alignment",
++ (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);
+
+- return (u8_t *)mem + SIZEOF_STRUCT_MEM;
++ return (u8_t *)mem + SIZEOF_STRUCT_MEM;
++ }
+ }
+- }
++#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++ /* if we got interrupted by a mem_free, try again */
++ } while(local_mem_free_count != 0);
++#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
+ LWIP_DEBUGF(MEM_DEBUG | 2, ("mem_malloc: could not allocate %"S16_F"
bytes\n", (s16_t)size));
+-#if MEM_STATS
+- ++lwip_stats.mem.err;
+-#endif /* MEM_STATS */
++ MEM_STATS_INC(err);
++ LWIP_MEM_ALLOC_UNPROTECT();
+ sys_sem_signal(mem_sem);
+ return NULL;
+ }
+Index: src/core/memp.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/memp.c,v
+retrieving revision 1.55
+retrieving revision 1.56
+diff -u -p -r1.55 -r1.56
+--- src/core/memp.c 25 Nov 2007 10:43:28 -0000 1.55
++++ src/core/memp.c 27 Jun 2008 18:37:54 -0000 1.56
+@@ -252,13 +252,12 @@ memp_init(void)
+ struct memp *memp;
+ u16_t i, j;
+
+-#if MEMP_STATS
+ for (i = 0; i < MEMP_MAX; ++i) {
+- lwip_stats.memp[i].used = lwip_stats.memp[i].max =
+- lwip_stats.memp[i].err = 0;
+- lwip_stats.memp[i].avail = memp_num[i];
++ MEMP_STATS_AVAIL(used, i, 0);
++ MEMP_STATS_AVAIL(max, i, 0);
++ MEMP_STATS_AVAIL(err, i, 0);
++ MEMP_STATS_AVAIL(avail, i, memp_num[i]);
+ }
+-#endif /* MEMP_STATS */
+
+ memp = LWIP_MEM_ALIGN(memp_memory);
+ /* for every pool: */
+@@ -315,20 +314,13 @@ memp_malloc_fn(memp_t type, const char*
+ memp->file = file;
+ memp->line = line;
+ #endif /* MEMP_OVERFLOW_CHECK */
+-#if MEMP_STATS
+- ++lwip_stats.memp[type].used;
+- if (lwip_stats.memp[type].used > lwip_stats.memp[type].max) {
+- lwip_stats.memp[type].max = lwip_stats.memp[type].used;
+- }
+-#endif /* MEMP_STATS */
++ MEMP_STATS_INC_USED(used, type);
+ LWIP_ASSERT("memp_malloc: memp properly aligned",
+ ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
+ memp = (struct memp*)((u8_t*)memp + MEMP_SIZE);
+ } else {
+ LWIP_DEBUGF(MEMP_DEBUG | 2, ("memp_malloc: out of memory in pool %s\n",
memp_desc[type]));
+-#if MEMP_STATS
+- ++lwip_stats.memp[type].err;
+-#endif /* MEMP_STATS */
++ MEMP_STATS_INC(err, type);
+ }
+
+ SYS_ARCH_UNPROTECT(old_level);
+@@ -365,9 +357,7 @@ memp_free(memp_t type, void *mem)
+ #endif /* MEMP_OVERFLOW_CHECK >= 2 */
+ #endif /* MEMP_OVERFLOW_CHECK */
+
+-#if MEMP_STATS
+- lwip_stats.memp[type].used--;
+-#endif /* MEMP_STATS */
++ MEMP_STATS_DEC(used, type);
+
+ memp->next = memp_tab[type];
+ memp_tab[type] = memp;
+Index: src/core/netif.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/netif.c,v
+retrieving revision 1.65
+retrieving revision 1.68
+diff -u -p -r1.65 -r1.68
+--- src/core/netif.c 9 Oct 2007 20:00:55 -0000 1.65
++++ src/core/netif.c 19 Jun 2008 16:27:18 -0000 1.68
+@@ -45,6 +45,12 @@
+ #include "lwip/snmp.h"
+ #include "lwip/igmp.h"
+ #include "netif/etharp.h"
++#if ENABLE_LOOPBACK
++#include "lwip/sys.h"
++#if LWIP_NETIF_LOOPBACK_MULTITHREADING
++#include "lwip/tcpip.h"
++#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
++#endif /* ENABLE_LOOPBACK */
+
+ #if LWIP_NETIF_STATUS_CALLBACK
+ #define NETIF_STATUS_CALLBACK(n) { if (n->status_callback)
(n->status_callback)(n); }
+@@ -106,6 +112,10 @@ netif_add(struct netif *netif, struct ip
+ #if LWIP_IGMP
+ netif->igmp_mac_filter = NULL;
+ #endif /* LWIP_IGMP */
++#if ENABLE_LOOPBACK
++ netif->loop_first = NULL;
++ netif->loop_last = NULL;
++#endif /* ENABLE_LOOPBACK */
+
+ /* remember netif specific state information data */
+ netif->state = state;
+@@ -114,6 +124,9 @@ netif_add(struct netif *netif, struct ip
+ #if LWIP_NETIF_HWADDRHINT
+ netif->addr_hint = NULL;
+ #endif /* LWIP_NETIF_HWADDRHINT*/
++#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
++ netif->loop_cnt_current = 0;
++#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
+
+ netif_set_addr(netif, ipaddr, netmask, gw);
+
+@@ -493,7 +506,158 @@ u8_t netif_is_link_up(struct netif *neti
+ */
+ void netif_set_link_callback(struct netif *netif, void (*
link_callback)(struct netif *netif ))
+ {
+- if ( netif )
+- netif->link_callback = link_callback;
++ if (netif) {
++ netif->link_callback = link_callback;
++ }
+ }
+ #endif /* LWIP_NETIF_LINK_CALLBACK */
++
++#if ENABLE_LOOPBACK
++/**
++ * Send an IP packet to be received on the same netif (loopif-like).
++ * The pbuf is simply copied and handed back to netif->input.
++ * In multithreaded mode, this is done directly since netif->input must put
++ * the packet on a queue.
++ * In callback mode, the packet is put on an internal queue and is fed to
++ * netif->input by netif_poll().
++ *
++ * @param netif the lwip network interface structure
++ * @param p the (IP) packet to 'send'
++ * @param ipaddr the ip address to send the packet to (not used)
++ * @return ERR_OK if the packet has been sent
++ * ERR_MEM if the pbuf used to copy the packet couldn't be allocated
++ */
++err_t
++netif_loop_output(struct netif *netif, struct pbuf *p,
++ struct ip_addr *ipaddr)
++{
++ struct pbuf *r;
++ err_t err;
++ struct pbuf *last;
++#if LWIP_LOOPBACK_MAX_PBUFS
++ u8_t clen = 0;
++#endif /* LWIP_LOOPBACK_MAX_PBUFS */
++ SYS_ARCH_DECL_PROTECT(lev);
++ LWIP_UNUSED_ARG(ipaddr);
++
++ /* Allocate a new pbuf */
++ r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
++ if (r == NULL) {
++ return ERR_MEM;
++ }
++#if LWIP_LOOPBACK_MAX_PBUFS
++ clen = pbuf_clen(r);
++ /* check for overflow or too many pbuf on queue */
++ if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) ||
++ ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) {
++ pbuf_free(r);
++ r = NULL;
++ return ERR_MEM;
++ }
++ netif->loop_cnt_current += clen;
++#endif /* LWIP_LOOPBACK_MAX_PBUFS */
++
++ /* Copy the whole pbuf queue p into the single pbuf r */
++ if ((err = pbuf_copy(r, p)) != ERR_OK) {
++ pbuf_free(r);
++ r = NULL;
++ return err;
++ }
++
++ /* Put the packet on a linked list which gets emptied through calling
++ netif_poll(). */
++
++ /* let last point to the last pbuf in chain r */
++ for (last = r; last->next != NULL; last = last->next);
++
++ SYS_ARCH_PROTECT(lev);
++ if(netif->loop_first != NULL) {
++ LWIP_ASSERT("if first != NULL, last must also be != NULL",
netif->loop_last != NULL);
++ netif->loop_last->next = r;
++ netif->loop_last = last;
++ } else {
++ netif->loop_first = r;
++ netif->loop_last = last;
++ }
++ SYS_ARCH_UNPROTECT(lev);
++
++#if LWIP_NETIF_LOOPBACK_MULTITHREADING
++ /* For multithreading environment, schedule a call to netif_poll */
++ tcpip_callback(netif_poll, netif);
++#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
++
++ return ERR_OK;
++}
++
++/**
++ * Call netif_poll() in the main loop of your application. This is to prevent
++ * reentering non-reentrant functions like tcp_input(). Packets passed to
++ * netif_loop_output() are put on a list that is passed to netif->input() by
++ * netif_poll().
++ */
++void
++netif_poll(struct netif *netif)
++{
++ struct pbuf *in;
++ SYS_ARCH_DECL_PROTECT(lev);
++
++ do {
++ /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is
protected */
++ SYS_ARCH_PROTECT(lev);
++ in = netif->loop_first;
++ if(in != NULL) {
++ struct pbuf *in_end = in;
++#if LWIP_LOOPBACK_MAX_PBUFS
++ u8_t clen = pbuf_clen(in);
++ /* adjust the number of pbufs on queue */
++ LWIP_ASSERT("netif->loop_cnt_current underflow",
++ ((netif->loop_cnt_current - clen) < netif->loop_cnt_current));
++ netif->loop_cnt_current -= clen;
++#endif /* LWIP_LOOPBACK_MAX_PBUFS */
++ while(in_end->len != in_end->tot_len) {
++ LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!",
in_end->next != NULL);
++ in_end = in_end->next;
++ }
++ /* 'in_end' now points to the last pbuf from 'in' */
++ if(in_end == netif->loop_last) {
++ /* this was the last pbuf in the list */
++ netif->loop_first = netif->loop_last = NULL;
++ } else {
++ /* pop the pbuf off the list */
++ netif->loop_first = in_end->next;
++ LWIP_ASSERT("should not be null since first != last!",
netif->loop_first != NULL);
++ }
++ /* De-queue the pbuf from its successors on the 'loop_' list. */
++ in_end->next = NULL;
++ }
++ SYS_ARCH_UNPROTECT(lev);
++
++ if(in != NULL) {
++ /* loopback packets are always IP packets! */
++ if(ip_input(in, netif) != ERR_OK) {
++ pbuf_free(in);
++ }
++ /* Don't reference the packet any more! */
++ in = NULL;
++ }
++ /* go on while there is a packet on the list */
++ } while(netif->loop_first != NULL);
++}
++
++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
++/**
++ * Calls netif_poll() for every netif on the netif_list.
++ */
++void
++netif_poll_all(void)
++{
++ struct netif *netif = netif_list;
++ /* loop through netifs */
++ while (netif != NULL) {
++ netif_poll(netif);
++ /* proceed to next network interface */
++ netif = netif->next;
++ }
++}
++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
++#endif /* ENABLE_LOOPBACK */
+Index: src/core/pbuf.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/pbuf.c,v
+retrieving revision 1.127
+retrieving revision 1.128
+diff -u -p -r1.127 -r1.128
+--- src/core/pbuf.c 4 Mar 2008 16:37:46 -0000 1.127
++++ src/core/pbuf.c 1 Apr 2008 19:05:40 -0000 1.128
+@@ -667,8 +667,8 @@ pbuf_dechain(struct pbuf *p)
+ *
+ * @note Only one packet is copied, no packet queue!
+ *
+- * @param p_to pbuf source of the copy
+- * @param p_from pbuf destination of the copy
++ * @param p_to pbuf destination of the copy
++ * @param p_from pbuf source of the copy
+ *
+ * @return ERR_OK if pbuf was copied
+ * ERR_ARG if one of the pbufs is NULL or p_to is not big
+Index: src/core/stats.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/stats.c,v
+retrieving revision 1.27
+retrieving revision 1.28
+diff -u -p -r1.27 -r1.28
+--- src/core/stats.c 4 Mar 2008 16:31:32 -0000 1.27
++++ src/core/stats.c 27 Jun 2008 18:37:54 -0000 1.28
+@@ -54,7 +54,6 @@ stats_display_proto(struct stats_proto *
+ {
+ LWIP_PLATFORM_DIAG(("\n%s\n\t", name));
+ LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit));
+- LWIP_PLATFORM_DIAG(("rexmit: %"STAT_COUNTER_F"\n\t", proto->rexmit));
+ LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv));
+ LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw));
+ LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop));
+@@ -68,6 +67,7 @@ stats_display_proto(struct stats_proto *
+ LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit));
+ }
+
++#if IGMP_STATS
+ void
+ stats_display_igmp(struct stats_igmp *igmp)
+ {
+@@ -82,7 +82,9 @@ stats_display_igmp(struct stats_igmp *ig
+ LWIP_PLATFORM_DIAG(("report_rxed: %"STAT_COUNTER_F"\n\t",
igmp->report_rxed));
+ LWIP_PLATFORM_DIAG(("group_query_rxed: %"STAT_COUNTER_F"\n",
igmp->group_query_rxed));
+ }
++#endif /* IGMP_STATS */
+
++#if MEM_STATS || MEMP_STATS
+ void
+ stats_display_mem(struct stats_mem *mem, char *name)
+ {
+@@ -93,48 +95,53 @@ stats_display_mem(struct stats_mem *mem,
+ LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err));
+ }
+
++#if MEMP_STATS
+ void
+-stats_display(void)
++stats_display_memp(struct stats_mem *mem, int index)
+ {
+-#if MEMP_STATS
+- s16_t i;
+ char * memp_names[] = {
+ #define LWIP_MEMPOOL(name,num,size,desc) desc,
+ #include "lwip/memp_std.h"
+ };
+-#endif
+-#if LINK_STATS
+- stats_display_proto(&lwip_stats.link, "LINK");
+-#endif
+-#if ETHARP_STATS
+- stats_display_proto(&lwip_stats.etharp, "ETHARP");
+-#endif
+-#if IPFRAG_STATS
+- stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG");
+-#endif
+-#if IP_STATS
+- stats_display_proto(&lwip_stats.ip, "IP");
+-#endif
+-#if ICMP_STATS
+- stats_display_proto(&lwip_stats.icmp, "ICMP");
+-#endif
+-#if IGMP_STATS
+- stats_display_igmp(&lwip_stats.igmp);
+-#endif
+-#if UDP_STATS
+- stats_display_proto(&lwip_stats.udp, "UDP");
+-#endif
+-#if TCP_STATS
+- stats_display_proto(&lwip_stats.tcp, "TCP");
+-#endif
+-#if MEM_STATS
+- stats_display_mem(&lwip_stats.mem, "HEAP");
+-#endif
+-#if MEMP_STATS
++ if(index < MEMP_MAX) {
++ stats_display_mem(mem, memp_names[index]);
++ }
++}
++#endif /* MEMP_STATS */
++#endif /* MEM_STATS || MEMP_STATS */
++
++#if SYS_STATS
++void
++stats_display_sys(struct stats_sys *sys)
++{
++ LWIP_PLATFORM_DIAG(("\nSYS\n\t"));
++ LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used));
++ LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max));
++ LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err));
++ LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used));
++ LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max));
++ LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err));
++}
++#endif /* SYS_STATS */
++
++void
++stats_display(void)
++{
++ s16_t i;
++
++ LINK_STATS_DISPLAY();
++ ETHARP_STATS_DISPLAY();
++ IPFRAG_STATS_DISPLAY();
++ IP_STATS_DISPLAY();
++ IGMP_STATS_DISPLAY();
++ ICMP_STATS_DISPLAY();
++ UDP_STATS_DISPLAY();
++ TCP_STATS_DISPLAY();
++ MEM_STATS_DISPLAY();
+ for (i = 0; i < MEMP_MAX; i++) {
+- stats_display_mem(&lwip_stats.memp[i], memp_names[i]);
++ MEMP_STATS_DISPLAY(i);
+ }
+-#endif
++ SYS_STATS_DISPLAY();
+ }
+ #endif /* LWIP_STATS_DISPLAY */
+
+Index: src/core/sys.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/sys.c,v
+retrieving revision 1.32
+retrieving revision 1.33
+diff -u -p -r1.32 -r1.33
+--- src/core/sys.c 25 Nov 2007 13:57:05 -0000 1.32
++++ src/core/sys.c 16 Jul 2008 20:36:12 -0000 1.33
+@@ -65,7 +65,7 @@ struct sswt_cb
+ void
+ sys_mbox_fetch(sys_mbox_t mbox, void **msg)
+ {
+- u32_t time;
++ u32_t time_needed;
+ struct sys_timeouts *timeouts;
+ struct sys_timeo *tmptimeout;
+ sys_timeout_handler h;
+@@ -76,18 +76,18 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m
+
+ if (!timeouts || !timeouts->next) {
+ UNLOCK_TCPIP_CORE();
+- time = sys_arch_mbox_fetch(mbox, msg, 0);
++ time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
+ LOCK_TCPIP_CORE();
+ } else {
+ if (timeouts->next->time > 0) {
+ UNLOCK_TCPIP_CORE();
+- time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
++ time_needed = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
+ LOCK_TCPIP_CORE();
+ } else {
+- time = SYS_ARCH_TIMEOUT;
++ time_needed = SYS_ARCH_TIMEOUT;
+ }
+
+- if (time == SYS_ARCH_TIMEOUT) {
++ if (time_needed == SYS_ARCH_TIMEOUT) {
+ /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
+ could be fetched. We should now call the timeout handler and
+ deallocate the memory allocated for the timeout. */
+@@ -107,8 +107,8 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m
+ /* If time != SYS_ARCH_TIMEOUT, a message was received before the
timeout
+ occured. The time variable is set to the number of
+ milliseconds we waited for the message. */
+- if (time < timeouts->next->time) {
+- timeouts->next->time -= time;
++ if (time_needed < timeouts->next->time) {
++ timeouts->next->time -= time_needed;
+ } else {
+ timeouts->next->time = 0;
+ }
+@@ -125,7 +125,7 @@ sys_mbox_fetch(sys_mbox_t mbox, void **m
+ void
+ sys_sem_wait(sys_sem_t sem)
+ {
+- u32_t time;
++ u32_t time_needed;
+ struct sys_timeouts *timeouts;
+ struct sys_timeo *tmptimeout;
+ sys_timeout_handler h;
+@@ -139,12 +139,12 @@ sys_sem_wait(sys_sem_t sem)
+ sys_arch_sem_wait(sem, 0);
+ } else {
+ if (timeouts->next->time > 0) {
+- time = sys_arch_sem_wait(sem, timeouts->next->time);
++ time_needed = sys_arch_sem_wait(sem, timeouts->next->time);
+ } else {
+- time = SYS_ARCH_TIMEOUT;
++ time_needed = SYS_ARCH_TIMEOUT;
+ }
+
+- if (time == SYS_ARCH_TIMEOUT) {
++ if (time_needed == SYS_ARCH_TIMEOUT) {
+ /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
+ could be fetched. We should now call the timeout handler and
+ deallocate the memory allocated for the timeout. */
+@@ -164,8 +164,8 @@ sys_sem_wait(sys_sem_t sem)
+ /* If time != SYS_ARCH_TIMEOUT, a message was received before the
timeout
+ occured. The time variable is set to the number of
+ milliseconds we waited for the message. */
+- if (time < timeouts->next->time) {
+- timeouts->next->time -= time;
++ if (time_needed < timeouts->next->time) {
++ timeouts->next->time -= time_needed;
+ } else {
+ timeouts->next->time = 0;
+ }
+Index: src/core/tcp.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/tcp.c,v
+retrieving revision 1.85
+retrieving revision 1.86
+diff -u -p -r1.85 -r1.86
+--- src/core/tcp.c 22 Jan 2008 21:15:15 -0000 1.85
++++ src/core/tcp.c 26 Mar 2008 11:57:13 -0000 1.86
+@@ -509,7 +509,8 @@ tcp_connect(struct tcp_pcb *pcb, struct
+ pcb->rcv_wnd = TCP_WND;
+ pcb->rcv_ann_wnd = TCP_WND;
+ pcb->snd_wnd = TCP_WND;
+- /* The send MSS is updated when an MSS option is received. */
++ /* As initial send MSS, we use TCP_MSS but limit it to 536.
++ The send MSS is updated when an MSS option is received. */
+ pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
+ #if TCP_CALCULATE_EFF_SEND_MSS
+ pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr);
+@@ -991,7 +992,8 @@ tcp_alloc(u8_t prio)
+ pcb->rcv_ann_wnd = TCP_WND;
+ pcb->tos = 0;
+ pcb->ttl = TCP_TTL;
+- /* The send MSS is updated when an MSS option is received. */
++ /* As initial send MSS, we use TCP_MSS but limit it to 536.
++ The send MSS is updated when an MSS option is received. */
+ pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
+ pcb->rto = 3000 / TCP_SLOW_INTERVAL;
+ pcb->sa = 0;
+Index: src/core/tcp_in.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/tcp_in.c,v
+retrieving revision 1.97
+retrieving revision 1.100
+diff -u -p -r1.97 -r1.100
+--- src/core/tcp_in.c 22 Jan 2008 21:15:15 -0000 1.97
++++ src/core/tcp_in.c 24 Jun 2008 15:46:39 -0000 1.100
+@@ -511,7 +511,7 @@ tcp_process(struct tcp_pcb *pcb)
+ }
+ } else {
+ if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
+- pcb->rcv_nxt+pcb->rcv_ann_wnd)) {
++ pcb->rcv_nxt+pcb->rcv_wnd)) {
+ acceptable = 1;
+ }
+ }
+@@ -1038,7 +1038,7 @@ tcp_receive(struct tcp_pcb *pcb)
+ and below rcv_nxt + rcv_wnd) in order to be further
+ processed. */
+ if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
+- pcb->rcv_nxt + pcb->rcv_ann_wnd - 1)){
++ pcb->rcv_nxt + pcb->rcv_wnd - 1)){
+ if (pcb->rcv_nxt == seqno) {
+ accepted_inseq = 1;
+ /* The incoming segment is the next in sequence. We check if
+@@ -1195,14 +1195,14 @@ tcp_receive(struct tcp_pcb *pcb)
+ } else {
+ pcb->ooseq = cseg;
+ }
+- }
+- tcp_seg_free(next);
+- if (cseg->next != NULL) {
+- next = cseg->next;
+- if (TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
+- /* We need to trim the incoming segment. */
+- cseg->len = (u16_t)(next->tcphdr->seqno - seqno);
+- pbuf_realloc(cseg->p, cseg->len);
++ tcp_seg_free(next);
++ if (cseg->next != NULL) {
++ next = cseg->next;
++ if (TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
++ /* We need to trim the incoming segment. */
++ cseg->len = (u16_t)(next->tcphdr->seqno - seqno);
++ pbuf_realloc(cseg->p, cseg->len);
++ }
+ }
+ }
+ break;
+@@ -1282,10 +1282,7 @@ tcp_receive(struct tcp_pcb *pcb)
+
+ }
+ } else {
+- if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
+- pcb->rcv_nxt + pcb->rcv_ann_wnd-1)){
+- tcp_ack_now(pcb);
+- }
++ tcp_ack_now(pcb);
+ }
+ } else {
+ /* Segments with length 0 is taken care of here. Segments that
+@@ -1331,7 +1328,8 @@ tcp_parseopt(struct tcp_pcb *pcb)
+ opts[c + 1] == 0x04) {
+ /* An MSS option with the right option length. */
+ mss = (opts[c + 2] << 8) | opts[c + 3];
+- pcb->mss = mss > TCP_MSS? TCP_MSS: mss;
++ /* Limit the mss to the configured TCP_MSS and prevent division by
zero */
++ pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;
+
+ /* And we are done processing options. */
+ break;
+Index: src/core/ipv4/autoip.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/ipv4/autoip.c,v
+retrieving revision 1.16
+retrieving revision 1.17
+diff -u -p -r1.16 -r1.17
+--- src/core/ipv4/autoip.c 26 Jan 2008 16:11:40 -0000 1.16
++++ src/core/ipv4/autoip.c 17 Jun 2008 20:16:23 -0000 1.17
+@@ -395,8 +395,8 @@ autoip_arp_reply(struct netif *netif, st
+ /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
+ * structure packing (not using structure copy which breaks
strict-aliasing rules).
+ */
+- MEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr));
+- MEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr));
++ SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr));
++ SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr));
+
+ if ((netif->autoip->state == AUTOIP_STATE_PROBING) ||
+ ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) &&
+Index: src/core/ipv4/inet_chksum.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/ipv4/inet_chksum.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -p -r1.4 -r1.5
+--- src/core/ipv4/inet_chksum.c 10 Mar 2008 16:12:31 -0000 1.4
++++ src/core/ipv4/inet_chksum.c 17 Jun 2008 20:06:25 -0000 1.5
+@@ -41,8 +41,6 @@
+ #include "lwip/inet_chksum.h"
+ #include "lwip/inet.h"
+
+-#include <string.h>
+-
+ /* These are some reference implementations of the checksum algorithm, with
the
+ * aim of being simple, correct and fully portable. Checksumming is the
+ * first thing you would want to optimize for your platform. If you create
+@@ -65,6 +63,11 @@
+ # define LWIP_CHKSUM_ALGORITHM 0
+ #endif
+
++/** Like the name says... */
++#define SWAP_BYTES_IN_WORD(w) ((w & 0xff) << 8) | ((w & 0xff00) >> 8)
++/** Split an u32_t in two u16_ts and add them up */
++#define FOLD_U32T(u) ((u >> 16) + (u & 0x0000ffffUL))
++
+ #if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */
+ /**
+ * lwip checksum
+@@ -86,8 +89,7 @@ lwip_standard_chksum(void *dataptr, u16_
+ acc = 0;
+ /* dataptr may be at odd or even addresses */
+ octetptr = (u8_t*)dataptr;
+- while (len > 1)
+- {
++ while (len > 1) {
+ /* declare first octet as most significant
+ thus assume network order, ignoring host order */
+ src = (*octetptr) << 8;
+@@ -98,8 +100,7 @@ lwip_standard_chksum(void *dataptr, u16_
+ acc += src;
+ len -= 2;
+ }
+- if (len > 0)
+- {
++ if (len > 0) {
+ /* accumulate remaining octet */
+ src = (*octetptr) << 8;
+ acc += src;
+@@ -154,19 +155,22 @@ lwip_standard_chksum(void *dataptr, int
+ }
+
+ /* Consume left-over byte, if any */
+- if (len > 0)
++ if (len > 0) {
+ ((u8_t *)&t)[0] = *(u8_t *)ps;;
++ }
+
+ /* Add end bytes */
+ sum += t;
+
+- /* Fold 32-bit sum to 16 bits */
+- while ((sum >> 16) != 0)
+- sum = (sum & 0xffff) + (sum >> 16);
++ /* Fold 32-bit sum to 16 bits
++ calling this twice is propably faster than if statements... */
++ sum = FOLD_U32T(sum);
++ sum = FOLD_U32T(sum);
+
+ /* Swap if alignment was odd */
+- if (odd)
+- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8);
++ if (odd) {
++ sum = SWAP_BYTES_IN_WORD(sum);
++ }
+
+ return sum;
+ }
+@@ -211,18 +215,20 @@ lwip_standard_chksum(void *dataptr, int
+
+ while (len > 7) {
+ tmp = sum + *pl++; /* ping */
+- if (tmp < sum)
++ if (tmp < sum) {
+ tmp++; /* add back carry */
++ }
+
+ sum = tmp + *pl++; /* pong */
+- if (sum < tmp)
++ if (sum < tmp) {
+ sum++; /* add back carry */
++ }
+
+ len -= 8;
+ }
+
+ /* make room in upper bits */
+- sum = (sum >> 16) + (sum & 0xffff);
++ sum = FOLD_U32T(sum);
+
+ ps = (u16_t *)pl;
+
+@@ -233,16 +239,20 @@ lwip_standard_chksum(void *dataptr, int
+ }
+
+ /* dangling tail byte remaining? */
+- if (len > 0) /* include odd byte */
++ if (len > 0) { /* include odd byte */
+ ((u8_t *)&t)[0] = *(u8_t *)ps;
++ }
+
+ sum += t; /* add end bytes */
+
+- while ((sum >> 16) != 0) /* combine halves */
+- sum = (sum >> 16) + (sum & 0xffff);
++ /* Fold 32-bit sum to 16 bits
++ calling this twice is propably faster than if statements... */
++ sum = FOLD_U32T(sum);
++ sum = FOLD_U32T(sum);
+
+- if (odd)
+- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8);
++ if (odd) {
++ sum = SWAP_BYTES_IN_WORD(sum);
++ }
+
+ return sum;
+ }
+@@ -277,18 +287,18 @@ inet_chksum_pseudo(struct pbuf *p,
+ (void *)q, (void *)q->next));
+ acc += LWIP_CHKSUM(q->payload, q->len);
+ /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped
lwip_chksum()=%"X32_F" \n", acc));*/
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffffUL) + (acc >> 16);
+- }
++ /* just executing this next line is probably faster that the if statement
needed
++ to check whether we really need to execute it, and does no harm */
++ acc = FOLD_U32T(acc);
+ if (q->len % 2 != 0) {
+ swapped = 1 - swapped;
+- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped
lwip_chksum()=%"X32_F" \n", acc));*/
+ }
+
+ if (swapped) {
+- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ acc += (src->addr & 0xffffUL);
+ acc += ((src->addr >> 16) & 0xffffUL);
+@@ -297,9 +307,10 @@ inet_chksum_pseudo(struct pbuf *p,
+ acc += (u32_t)htons((u16_t)proto);
+ acc += (u32_t)htons(proto_len);
+
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffffUL) + (acc >> 16);
+- }
++ /* Fold 32-bit sum to 16 bits
++ calling this twice is propably faster than if statements... */
++ acc = FOLD_U32T(acc);
++ acc = FOLD_U32T(acc);
+ LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain
lwip_chksum()=%"X32_F"\n", acc));
+ return (u16_t)~(acc & 0xffffUL);
+ }
+@@ -340,18 +351,17 @@ inet_chksum_pseudo_partial(struct pbuf *
+ chksum_len -= chklen;
+ LWIP_ASSERT("delete me", chksum_len < 0x7fff);
+ /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped
lwip_chksum()=%"X32_F" \n", acc));*/
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffffUL) + (acc >> 16);
+- }
++ /* fold the upper bit down */
++ acc = FOLD_U32T(acc);
+ if (q->len % 2 != 0) {
+ swapped = 1 - swapped;
+- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped
lwip_chksum()=%"X32_F" \n", acc));*/
+ }
+
+ if (swapped) {
+- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ acc += (src->addr & 0xffffUL);
+ acc += ((src->addr >> 16) & 0xffffUL);
+@@ -360,9 +370,10 @@ inet_chksum_pseudo_partial(struct pbuf *
+ acc += (u32_t)htons((u16_t)proto);
+ acc += (u32_t)htons(proto_len);
+
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffffUL) + (acc >> 16);
+- }
++ /* Fold 32-bit sum to 16 bits
++ calling this twice is propably faster than if statements... */
++ acc = FOLD_U32T(acc);
++ acc = FOLD_U32T(acc);
+ LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain
lwip_chksum()=%"X32_F"\n", acc));
+ return (u16_t)~(acc & 0xffffUL);
+ }
+@@ -380,13 +391,7 @@ inet_chksum_pseudo_partial(struct pbuf *
+ u16_t
+ inet_chksum(void *dataptr, u16_t len)
+ {
+- u32_t acc;
+-
+- acc = LWIP_CHKSUM(dataptr, len);
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffff) + (acc >> 16);
+- }
+- return (u16_t)~(acc & 0xffff);
++ return ~LWIP_CHKSUM(dataptr, len);
+ }
+
+ /**
+@@ -407,17 +412,15 @@ inet_chksum_pbuf(struct pbuf *p)
+ swapped = 0;
+ for(q = p; q != NULL; q = q->next) {
+ acc += LWIP_CHKSUM(q->payload, q->len);
+- while ((acc >> 16) != 0) {
+- acc = (acc & 0xffffUL) + (acc >> 16);
+- }
++ acc = FOLD_U32T(acc);
+ if (q->len % 2 != 0) {
+ swapped = 1 - swapped;
+- acc = (acc & 0x00ffUL << 8) | (acc & 0xff00UL >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ }
+
+ if (swapped) {
+- acc = ((acc & 0x00ffUL) << 8) | ((acc & 0xff00UL) >> 8);
++ acc = SWAP_BYTES_IN_WORD(acc);
+ }
+ return (u16_t)~(acc & 0xffffUL);
+ }
+Index: src/core/ipv4/ip.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/core/ipv4/ip.c,v
+retrieving revision 1.66
+retrieving revision 1.68
+diff -u -p -r1.66 -r1.68
+--- src/core/ipv4/ip.c 14 Jan 2008 20:53:23 -0000 1.66
++++ src/core/ipv4/ip.c 17 Jun 2008 19:39:22 -0000 1.68
+@@ -531,9 +531,19 @@ ip_output_if(struct pbuf *p, struct ip_a
+ LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0],
netif->name[1], netif->num));
+ ip_debug_print(p);
+
+- LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
++#if (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)
++ if (ip_addr_cmp(dest, &netif->ip_addr)) {
++ /* Packet to self, enqueue it for loopback */
++ LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()"));
++
++ return netif_loop_output(netif, p, dest);
++ } else
++#endif /* (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) */
++ {
++ LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
+
+- return netif->output(netif, p, dest);
++ return netif->output(netif, p, dest);
++ }
+ }
+
+ /**
+Index: src/include/lwip/debug.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/debug.h,v
+retrieving revision 1.37
+retrieving revision 1.39
+diff -u -p -r1.37 -r1.39
+--- src/include/lwip/debug.h 22 Sep 2007 11:16:07 -0000 1.37
++++ src/include/lwip/debug.h 16 Jul 2008 20:36:22 -0000 1.39
+@@ -61,26 +61,28 @@
+ #define LWIP_DBG_HALT 0x08U
+
+ #ifndef LWIP_NOASSERT
+-#define LWIP_ASSERT(x,y) do { if(!(y)) LWIP_PLATFORM_ASSERT(x); } while(0)
++#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \
++ LWIP_PLATFORM_ASSERT(message); } while(0)
+ #else /* LWIP_NOASSERT */
+-#define LWIP_ASSERT(x,y)
++#define LWIP_ASSERT(message, assertion)
+ #endif /* LWIP_NOASSERT */
+
+-/** print "m" message only if "e" is true, and execute "h" expression */
++/** if "expression" isn't true, then print "message" and execute "handler"
expression */
+ #ifndef LWIP_ERROR
+-#define LWIP_ERROR(m,e,h) do { if (!(e)) { LWIP_PLATFORM_ASSERT(m); h;}}
while(0)
++#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
++ LWIP_PLATFORM_ASSERT(message); handler;}} while(0)
+ #endif /* LWIP_ERROR */
+
+ #ifdef LWIP_DEBUG
+ /** print debug message only if debug message type is enabled...
+ * AND is of correct type AND is at least LWIP_DBG_LEVEL
+ */
+-#define LWIP_DEBUGF(debug,x) do { \
++#define LWIP_DEBUGF(debug, message) do { \
+ if ( \
+ ((debug) & LWIP_DBG_ON) && \
+ ((debug) & LWIP_DBG_TYPES_ON) && \
+ ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >=
LWIP_DBG_MIN_LEVEL)) { \
+- LWIP_PLATFORM_DIAG(x); \
++ LWIP_PLATFORM_DIAG(message); \
+ if ((debug) & LWIP_DBG_HALT) { \
+ while(1); \
+ } \
+@@ -88,7 +90,7 @@
+ } while(0)
+
+ #else /* LWIP_DEBUG */
+-#define LWIP_DEBUGF(debug,x)
++#define LWIP_DEBUGF(debug, message)
+ #endif /* LWIP_DEBUG */
+
+ #endif /* __LWIP_DEBUG_H__ */
+Index: src/include/lwip/err.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/err.h,v
+retrieving revision 1.13
+retrieving revision 1.15
+diff -u -p -r1.13 -r1.15
+--- src/include/lwip/err.h 13 Dec 2007 23:06:50 -0000 1.13
++++ src/include/lwip/err.h 17 Jun 2008 20:27:32 -0000 1.15
+@@ -33,37 +33,43 @@
+ #define __LWIP_ERR_H__
+
+ #include "lwip/opt.h"
++#include "lwip/arch.h"
+
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+
+-typedef s8_t err_t;
++/** Define LWIP_ERR_T in cc.h if you want to use
++ * a different type for your platform (must be signed). */
++#ifdef LWIP_ERR_T
++typedef LWIP_ERR_T err_t;
++#else /* LWIP_ERR_T */
++ typedef s8_t err_t;
++#endif /* LWIP_ERR_T*/
+
+ /* Definitions for error constants. */
+
+ #define ERR_OK 0 /* No error, everything OK. */
+ #define ERR_MEM -1 /* Out of memory error. */
+ #define ERR_BUF -2 /* Buffer error. */
+-#define ERR_RTE -3 /* Routing problem. */
++#define ERR_TIMEOUT -3 /* Timeout. */
++#define ERR_RTE -4 /* Routing problem. */
+
+ #define ERR_IS_FATAL(e) ((e) < ERR_RTE)
+
+-#define ERR_ABRT -4 /* Connection aborted. */
+-#define ERR_RST -5 /* Connection reset. */
+-#define ERR_CLSD -6 /* Connection closed. */
+-#define ERR_CONN -7 /* Not connected. */
++#define ERR_ABRT -5 /* Connection aborted. */
++#define ERR_RST -6 /* Connection reset. */
++#define ERR_CLSD -7 /* Connection closed. */
++#define ERR_CONN -8 /* Not connected. */
+
+-#define ERR_VAL -8 /* Illegal value. */
++#define ERR_VAL -9 /* Illegal value. */
+
+-#define ERR_ARG -9 /* Illegal argument. */
++#define ERR_ARG -10 /* Illegal argument. */
+
+-#define ERR_USE -10 /* Address in use. */
++#define ERR_USE -11 /* Address in use. */
+
+-#define ERR_IF -11 /* Low-level netif error */
+-#define ERR_ISCONN -12 /* Already connected. */
+-
+-#define ERR_TIMEOUT -13 /* Timeout. */
++#define ERR_IF -12 /* Low-level netif error */
++#define ERR_ISCONN -13 /* Already connected. */
+
+ #define ERR_INPROGRESS -14 /* Operation in progress */
+
+Index: src/include/lwip/mem.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/mem.h,v
+retrieving revision 1.21
+retrieving revision 1.22
+diff -u -p -r1.21 -r1.22
+--- src/include/lwip/mem.h 4 Mar 2008 16:31:32 -0000 1.21
++++ src/include/lwip/mem.h 30 May 2008 11:37:15 -0000 1.22
+@@ -50,16 +50,16 @@ typedef size_t mem_size_t;
+ * allow these defines to be overridden.
+ */
+ #ifndef mem_free
+-#define mem_free(x) free(x)
++#define mem_free free
+ #endif
+ #ifndef mem_malloc
+-#define mem_malloc(x) malloc(x)
++#define mem_malloc malloc
+ #endif
+ #ifndef mem_calloc
+-#define mem_calloc(x, y) calloc(x, y)
++#define mem_calloc calloc
+ #endif
+ #ifndef mem_realloc
+-#define mem_realloc(x, size) (x)
++#define mem_realloc realloc
+ #endif
+ #else /* MEM_LIBC_MALLOC */
+
+Index: src/include/lwip/netif.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/netif.h,v
+retrieving revision 1.43
+retrieving revision 1.46
+diff -u -p -r1.43 -r1.46
+--- src/include/lwip/netif.h 9 Oct 2007 19:59:59 -0000 1.43
++++ src/include/lwip/netif.h 19 Jun 2008 16:27:23 -0000 1.46
+@@ -34,6 +34,8 @@
+
+ #include "lwip/opt.h"
+
++#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)
++
+ #include "lwip/err.h"
+
+ #include "lwip/ip_addr.h"
+@@ -165,6 +167,14 @@ struct netif {
+ #if LWIP_NETIF_HWADDRHINT
+ u8_t *addr_hint;
+ #endif /* LWIP_NETIF_HWADDRHINT */
++#if ENABLE_LOOPBACK
++ /* List of packets to be queued for ourselves. */
++ struct pbuf *loop_first;
++ struct pbuf *loop_last;
++#if LWIP_LOOPBACK_MAX_PBUFS
++ u16_t loop_cnt_current;
++#endif /* LWIP_LOOPBACK_MAX_PBUFS */
++#endif /* ENABLE_LOOPBACK */
+ };
+
+ #if LWIP_SNMP
+@@ -242,4 +252,12 @@ void netif_set_link_callback(struct neti
+ }
+ #endif
+
++#if ENABLE_LOOPBACK
++err_t netif_loop_output(struct netif *netif, struct pbuf *p, struct ip_addr
*dest_ip);
++void netif_poll(struct netif *netif);
++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
++void netif_poll_all(void);
++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
++#endif /* ENABLE_LOOPBACK */
++
+ #endif /* __LWIP_NETIF_H__ */
+Index: src/include/lwip/opt.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/opt.h,v
+retrieving revision 1.116
+retrieving revision 1.122
+diff -u -p -r1.116 -r1.122
+--- src/include/lwip/opt.h 31 Jan 2008 18:19:29 -0000 1.116
++++ src/include/lwip/opt.h 30 Jun 2008 18:16:52 -0000 1.122
+@@ -155,6 +155,27 @@
+ #define MEMP_USE_CUSTOM_POOLS 0
+ #endif
+
++/**
++ * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from
++ * interrupt context (or another context that doesn't allow waiting for a
++ * semaphore).
++ * If set to 1, mem_malloc will be protected by a semaphore and
SYS_ARCH_PROTECT,
++ * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc
SYS_ARCH_UNPROTECTs
++ * with each loop so that mem_free can run.
++ *
++ * ATTENTION: As you can see from the above description, this leads to dis-/
++ * enabling interrupts often, which can be slow! Also, on low memory,
mem_malloc
++ * can need longer.
++ *
++ * If you don't want that, at least for NO_SYS=0, you can still use the
following
++ * functions to enqueue a deallocation call which then runs in the
tcpip_thread
++ * context:
++ * - pbuf_free_callback(p);
++ * - mem_free_callback(m);
++ */
++#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
++#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
++#endif
+
+ /*
+ ------------------------------------------------
+@@ -815,6 +836,39 @@
+ #define LWIP_NETIF_HWADDRHINT 0
+ #endif
+
++/**
++ * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP
++ * address equal to the netif IP address, looping them back up the stack.
++ */
++#ifndef LWIP_NETIF_LOOPBACK
++#define LWIP_NETIF_LOOPBACK 0
++#endif
++
++/**
++ * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback
++ * sending for each netif (0 = disabled)
++ */
++#ifndef LWIP_LOOPBACK_MAX_PBUFS
++#define LWIP_LOOPBACK_MAX_PBUFS 0
++#endif
++
++/**
++ * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled
in
++ * the system, as netifs must change how they behave depending on this setting
++ * for the LWIP_NETIF_LOOPBACK option to work.
++ * Setting this is needed to avoid reentering non-reentrant functions like
++ * tcp_input().
++ * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using
a
++ * multithreaded environment like tcpip.c. In this case, netif->input()
++ * is called directly.
++ * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS)
setup.
++ * The packets are put on a list and netif_poll() must be called in
++ * the main application loop.
++ */
++#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING
++#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
++#endif
++
+ /*
+ ------------------------------------
+ ---------- LOOPIF options ----------
+@@ -827,20 +881,16 @@
+ #define LWIP_HAVE_LOOPIF 0
+ #endif
+
++/*
++ ------------------------------------
++ ---------- SLIPIF options ----------
++ ------------------------------------
++*/
+ /**
+- * LWIP_LOOPIF_MULTITHREADING: Indicates whether threading is enabled in
+- * the system, as LOOPIF must change how it behaves depending on this setting.
+- * Setting this is needed to avoid reentering non-reentrant functions like
+- * tcp_input().
+- * LWIP_LOOPIF_MULTITHREADING==1: Indicates that the user is using a
+- * multithreaded environment like tcpip.c. In this case, netif->input()
+- * is called directly.
+- * LWIP_LOOPIF_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup.
+- * The packets are put on a list and loopif_poll() must be called in
+- * the main application loop.
++ * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c
+ */
+-#ifndef LWIP_LOOPIF_MULTITHREADING
+-#define LWIP_LOOPIF_MULTITHREADING 1
++#ifndef LWIP_HAVE_SLIPIF
++#define LWIP_HAVE_SLIPIF 0
+ #endif
+
+ /*
+Index: src/include/lwip/sio.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/sio.h,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -p -r1.7 -r1.8
+--- src/include/lwip/sio.h 6 Sep 2007 16:43:44 -0000 1.7
++++ src/include/lwip/sio.h 27 Mar 2008 18:06:02 -0000 1.8
+@@ -32,16 +32,24 @@
+ * It needs to be implemented by those platforms which need SLIP or PPP
+ */
+
++#ifndef __SIO_H__
++#define __SIO_H__
++
+ #include "lwip/arch.h"
+
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+
++/* If you want to define sio_fd_t elsewhere or differently,
++ define this in your cc.h file. */
+ #ifndef __sio_fd_t_defined
+ typedef void * sio_fd_t;
+ #endif
+
++/* The following functions can be defined to something else in your cc.h file
++ or be implemented in your custom sio.c file. */
++
+ #ifndef sio_open
+ sio_fd_t sio_open(u8_t);
+ #endif
+@@ -69,3 +77,5 @@ void sio_read_abort(sio_fd_t);
+ #ifdef __cplusplus
+ }
+ #endif
++
++#endif /* __SIO_H__ */
+Index: src/include/lwip/sockets.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/sockets.h,v
+retrieving revision 1.38
+retrieving revision 1.39
+diff -u -p -r1.38 -r1.39
+--- src/include/lwip/sockets.h 2 Dec 2007 15:24:02 -0000 1.38
++++ src/include/lwip/sockets.h 26 Apr 2008 10:46:23 -0000 1.39
+@@ -177,7 +177,22 @@ typedef struct ip_mreq {
+ } ip_mreq;
+ #endif /* LWIP_IGMP */
+
+-/* Unimplemented for now... */
++/*
++ * The Type of Service provides an indication of the abstract
++ * parameters of the quality of service desired. These parameters are
++ * to be used to guide the selection of the actual service parameters
++ * when transmitting a datagram through a particular network. Several
++ * networks offer service precedence, which somehow treats high
++ * precedence traffic as more important than other traffic (generally
++ * by accepting only traffic above a certain precedence at time of high
++ * load). The major choice is a three way tradeoff between low-delay,
++ * high-reliability, and high-throughput.
++ * The use of the Delay, Throughput, and Reliability indications may
++ * increase the cost (in some sense) of the service. In many networks
++ * better performance for one of these parameters is coupled with worse
++ * performance on another. Except for very unusual cases at most two
++ * of these three indications should be set.
++ */
+ #define IPTOS_TOS_MASK 0x1E
+ #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
+ #define IPTOS_LOWDELAY 0x10
+@@ -187,7 +202,13 @@ typedef struct ip_mreq {
+ #define IPTOS_MINCOST IPTOS_LOWCOST
+
+ /*
+- * Definitions for IP precedence (also in ip_tos) (Unimplemented)
++ * The Network Control precedence designation is intended to be used
++ * within a network only. The actual use and control of that
++ * designation is up to each network. The Internetwork Control
++ * designation is intended for use by gateway control originators only.
++ * If the actual use of these precedence designations is of concern to
++ * a particular network, it is the responsibility of that network to
++ * control the access to, and use of, those precedence designations.
+ */
+ #define IPTOS_PREC_MASK 0xe0
+ #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
+Index: src/include/lwip/stats.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/stats.h,v
+retrieving revision 1.19
+retrieving revision 1.23
+diff -u -p -r1.19 -r1.23
+--- src/include/lwip/stats.h 28 Nov 2007 21:25:07 -0000 1.19
++++ src/include/lwip/stats.h 8 Jul 2008 09:15:57 -0000 1.23
+@@ -57,7 +57,6 @@ extern "C" {
+
+ struct stats_proto {
+ STAT_COUNTER xmit; /* Transmitted packets. */
+- STAT_COUNTER rexmit; /* Retransmitted packets. */
+ STAT_COUNTER recv; /* Received packets. */
+ STAT_COUNTER fw; /* Forwarded packets. */
+ STAT_COUNTER drop; /* Dropped packets. */
+@@ -87,7 +86,8 @@ struct stats_mem {
+ mem_size_t avail;
+ mem_size_t used;
+ mem_size_t max;
+- mem_size_t err;
++ STAT_COUNTER err;
++ STAT_COUNTER illegal;
+ };
+
+ struct stats_syselem {
+@@ -142,64 +142,138 @@ extern struct stats_ lwip_stats;
+ #define stats_init() /* Compatibility define, not init needed. */
+
+ #define STATS_INC(x) ++lwip_stats.x
++#define STATS_DEC(x) --lwip_stats.x
+ #else
+ #define stats_init()
+ #define STATS_INC(x)
++#define STATS_DEC(x)
+ #endif /* LWIP_STATS */
+
+ #if TCP_STATS
+ #define TCP_STATS_INC(x) STATS_INC(x)
++#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP")
+ #else
+ #define TCP_STATS_INC(x)
++#define TCP_STATS_DISPLAY()
+ #endif
+
+ #if UDP_STATS
+ #define UDP_STATS_INC(x) STATS_INC(x)
++#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP")
+ #else
+ #define UDP_STATS_INC(x)
++#define UDP_STATS_DISPLAY()
+ #endif
+
+ #if ICMP_STATS
+ #define ICMP_STATS_INC(x) STATS_INC(x)
++#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP")
+ #else
+ #define ICMP_STATS_INC(x)
++#define ICMP_STATS_DISPLAY()
+ #endif
+
+ #if IGMP_STATS
+ #define IGMP_STATS_INC(x) STATS_INC(x)
++#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp)
+ #else
+ #define IGMP_STATS_INC(x)
++#define IGMP_STATS_DISPLAY()
+ #endif
+
+ #if IP_STATS
+ #define IP_STATS_INC(x) STATS_INC(x)
++#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP")
+ #else
+ #define IP_STATS_INC(x)
++#define IP_STATS_DISPLAY()
+ #endif
+
+ #if IPFRAG_STATS
+ #define IPFRAG_STATS_INC(x) STATS_INC(x)
++#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag,
"IP_FRAG")
+ #else
+ #define IPFRAG_STATS_INC(x)
++#define IPFRAG_STATS_DISPLAY()
+ #endif
+
+ #if ETHARP_STATS
+ #define ETHARP_STATS_INC(x) STATS_INC(x)
++#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp,
"ETHARP")
+ #else
+ #define ETHARP_STATS_INC(x)
++#define ETHARP_STATS_DISPLAY()
+ #endif
+
+ #if LINK_STATS
+ #define LINK_STATS_INC(x) STATS_INC(x)
++#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK")
+ #else
+ #define LINK_STATS_INC(x)
++#define LINK_STATS_DISPLAY()
++#endif
++
++#if MEM_STATS
++#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y
++#define MEM_STATS_INC(x) STATS_INC(mem.x)
++#define MEM_STATS_INC_USED(x, y) do { lwip_stats.mem.used += y; \
++ if (lwip_stats.mem.max <
lwip_stats.mem.used) { \
++ lwip_stats.mem.max =
lwip_stats.mem.used; \
++ } \
++ } while(0)
++#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y
++#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
++#else
++#define MEM_STATS_AVAIL(x, y)
++#define MEM_STATS_INC(x)
++#define MEM_STATS_INC_USED(x, y)
++#define MEM_STATS_DEC_USED(x, y)
++#define MEM_STATS_DISPLAY()
++#endif
++
++#if MEMP_STATS
++#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y
++#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x)
++#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x)
++#define MEMP_STATS_INC_USED(x, i) do { ++lwip_stats.memp[i].used; \
++ if (lwip_stats.memp[i].max <
lwip_stats.memp[i].used) { \
++ lwip_stats.memp[i].max =
lwip_stats.memp[i].used; \
++ } \
++ } while(0)
++#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i)
++#else
++#define MEMP_STATS_AVAIL(x, i, y)
++#define MEMP_STATS_INC(x, i)
++#define MEMP_STATS_DEC(x, i)
++#define MEMP_STATS_INC_USED(x, i)
++#define MEMP_STATS_DISPLAY(i)
++#endif
++
++#if SYS_STATS
++#define SYS_STATS_INC(x) STATS_INC(sys.x)
++#define SYS_STATS_DEC(x) STATS_DEC(sys.x)
++#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
++#else
++#define SYS_STATS_INC(x)
++#define SYS_STATS_DEC(x)
++#define SYS_STATS_DISPLAY()
+ #endif
+
+ /* Display of statistics */
+ #if LWIP_STATS_DISPLAY
+ void stats_display(void);
++void stats_display_proto(struct stats_proto *proto, char *name);
++void stats_display_igmp(struct stats_igmp *igmp);
++void stats_display_mem(struct stats_mem *mem, char *name);
++void stats_display_memp(struct stats_mem *mem, int index);
++void stats_display_sys(struct stats_sys *sys);
+ #else
+ #define stats_display()
++#define stats_display_proto(proto, name)
++#define stats_display_igmp(igmp)
++#define stats_display_mem(mem, name)
++#define stats_display_memp(mem, index)
++#define stats_display_sys(sys)
+ #endif /* LWIP_STATS_DISPLAY */
+
+ #ifdef __cplusplus
+Index: src/include/lwip/tcpip.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/lwip/tcpip.h,v
+retrieving revision 1.24
+retrieving revision 1.27
+diff -u -p -r1.24 -r1.27
+--- src/include/lwip/tcpip.h 12 Jan 2008 11:52:22 -0000 1.24
++++ src/include/lwip/tcpip.h 27 Jun 2008 20:34:55 -0000 1.27
+@@ -83,7 +83,11 @@ err_t tcpip_netifapi_lock(struct netifap
+ #endif /* LWIP_NETIF_API */
+
+ err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block);
+-#define tcpip_callback(f,ctx) tcpip_callback_with_block(f,ctx,1)
++#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx,
1)
++
++/* free pbufs or heap memory from another context without blocking */
++err_t pbuf_free_callback(struct pbuf *p);
++err_t mem_free_callback(void *m);
+
+ err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
+ #define tcpip_untimeout(h, arg) tcpip_timeout(0xffffffff, h, arg)
+Index: src/include/netif/loopif.h
+===================================================================
+RCS file: /sources/lwip/lwip/src/include/netif/loopif.h,v
+retrieving revision 1.7
+retrieving revision 1.9
+diff -u -p -r1.7 -r1.9
+--- src/include/netif/loopif.h 10 May 2007 10:59:20 -0000 1.7
++++ src/include/netif/loopif.h 17 Jun 2008 20:12:22 -0000 1.9
+@@ -32,6 +32,7 @@
+ #ifndef __NETIF_LOOPIF_H__
+ #define __NETIF_LOOPIF_H__
+
++#include "lwip/opt.h"
+ #include "lwip/netif.h"
+ #include "lwip/err.h"
+
+@@ -39,9 +40,9 @@
+ extern "C" {
+ #endif
+
+-#if !LWIP_LOOPIF_MULTITHREADING
+-void loopif_poll(struct netif *netif);
+-#endif
++#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
++#define loopif_poll netif_poll
++#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
+
+ err_t loopif_init(struct netif *netif);
+
+Index: src/netif/etharp.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/netif/etharp.c,v
+retrieving revision 1.145
+retrieving revision 1.148
+diff -u -p -r1.145 -r1.148
+--- src/netif/etharp.c 4 Mar 2008 13:41:24 -0000 1.145
++++ src/netif/etharp.c 19 Jun 2008 16:40:59 -0000 1.148
+@@ -353,7 +353,7 @@ find_entry(struct ip_addr *ipaddr, u8_t
+ * 1) empty entry
+ * 2) oldest stable entry
+ * 3) oldest pending entry without queued packets
+- * 4) oldest pending entry without queued packets
++ * 4) oldest pending entry with queued packets
+ *
+ * { ETHARP_TRY_HARD is set at this point }
+ */
+@@ -1130,7 +1130,14 @@ ethernet_input(struct pbuf *p, struct ne
+
+ /* points to packet payload, which starts with an Ethernet header */
+ ethhdr = p->payload;
+-
++ LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
++ ("ethernet_input: dest:%02x:%02x:%02x:%02x:%02x:%02x,
src:%02x:%02x:%02x:%02x:%02x:%02x, type:%2hx\n",
++ (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1],
(unsigned)ethhdr->dest.addr[2],
++ (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4],
(unsigned)ethhdr->dest.addr[5],
++ (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1],
(unsigned)ethhdr->src.addr[2],
++ (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4],
(unsigned)ethhdr->src.addr[5],
++ (unsigned)htons(ethhdr->type)));
++
+ switch (htons(ethhdr->type)) {
+ /* IP packet? */
+ case ETHTYPE_IP:
+@@ -1165,6 +1172,8 @@ ethernet_input(struct pbuf *p, struct ne
+ #endif /* PPPOE_SUPPORT */
+
+ default:
++ ETHARP_STATS_INC(etharp.proterr);
++ ETHARP_STATS_INC(etharp.drop);
+ pbuf_free(p);
+ p = NULL;
+ break;
+Index: src/netif/loopif.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/netif/loopif.c,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -p -r1.26 -r1.27
+--- src/netif/loopif.c 31 Aug 2007 10:14:09 -0000 1.26
++++ src/netif/loopif.c 12 Jun 2008 20:10:10 -0000 1.27
+@@ -40,149 +40,8 @@
+ #if LWIP_HAVE_LOOPIF
+
+ #include "netif/loopif.h"
+-#include "lwip/pbuf.h"
+ #include "lwip/snmp.h"
+
+-#include <string.h>
+-
+-#if !LWIP_LOOPIF_MULTITHREADING
+-
+-#include "lwip/sys.h"
+-#include "lwip/mem.h"
+-
+-/* helper struct for the linked list of pbufs */
+-struct loopif_private {
+- struct pbuf *first;
+- struct pbuf *last;
+-};
+-
+-/**
+- * Call loopif_poll() in the main loop of your application. This is to prevent
+- * reentering non-reentrant functions like tcp_input(). Packets passed to
+- * loopif_output() are put on a list that is passed to netif->input() by
+- * loopif_poll().
+- *
+- * @param netif the lwip network interface structure for this loopif
+- */
+-void
+-loopif_poll(struct netif *netif)
+-{
+- SYS_ARCH_DECL_PROTECT(lev);
+- struct pbuf *in, *in_end;
+- struct loopif_private *priv = (struct loopif_private*)netif->state;
+-
+- LWIP_ERROR("priv != NULL", (priv != NULL), return;);
+-
+- do {
+- /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is
protected */
+- SYS_ARCH_PROTECT(lev);
+- in = priv->first;
+- if(in) {
+- in_end = in;
+- while(in_end->len != in_end->tot_len) {
+- LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!",
in_end->next != NULL);
+- in_end = in_end->next;
+- }
+- /* 'in_end' now points to the last pbuf from 'in' */
+- if(in_end == priv->last) {
+- /* this was the last pbuf in the list */
+- priv->first = priv->last = NULL;
+- } else {
+- /* pop the pbuf off the list */
+- priv->first = in_end->next;
+- LWIP_ASSERT("should not be null since first != last!", priv->first !=
NULL);
+- }
+- }
+- SYS_ARCH_UNPROTECT(lev);
+-
+- if(in != NULL) {
+- if(in_end->next != NULL) {
+- /* De-queue the pbuf from its successors on the 'priv' list. */
+- in_end->next = NULL;
+- }
+- if(netif->input(in, netif) != ERR_OK) {
+- pbuf_free(in);
+- }
+- /* Don't reference the packet any more! */
+- in = NULL;
+- in_end = NULL;
+- }
+- /* go on while there is a packet on the list */
+- } while(priv->first != NULL);
+-}
+-#endif /* LWIP_LOOPIF_MULTITHREADING */
+-
+-/**
+- * Send an IP packet over the loopback interface.
+- * The pbuf is simply copied and handed back to netif->input.
+- * In multithreaded mode, this is done directly since netif->input must put
+- * the packet on a queue.
+- * In callback mode, the packet is put on an internal queue and is fed to
+- * netif->input by loopif_poll().
+- *
+- * @param netif the lwip network interface structure for this loopif
+- * @param p the (IP) packet to 'send'
+- * @param ipaddr the ip address to send the packet to (not used for loopif)
+- * @return ERR_OK if the packet has been sent
+- * ERR_MEM if the pbuf used to copy the packet couldn't be allocated
+- */
+-static err_t
+-loopif_output(struct netif *netif, struct pbuf *p,
+- struct ip_addr *ipaddr)
+-{
+-#if !LWIP_LOOPIF_MULTITHREADING
+- SYS_ARCH_DECL_PROTECT(lev);
+- struct loopif_private *priv;
+- struct pbuf *last;
+-#endif /* LWIP_LOOPIF_MULTITHREADING */
+- struct pbuf *r;
+- err_t err;
+-
+- LWIP_UNUSED_ARG(ipaddr);
+-
+- /* Allocate a new pbuf */
+- r = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
+- if (r == NULL) {
+- return ERR_MEM;
+- }
+-
+- /* Copy the whole pbuf queue p into the single pbuf r */
+- if ((err = pbuf_copy(r, p)) != ERR_OK) {
+- pbuf_free(r);
+- r = NULL;
+- return err;
+- }
+-
+-#if LWIP_LOOPIF_MULTITHREADING
+- /* Multithreading environment, netif->input() is supposed to put the packet
+- into a mailbox, so we can safely call it here without risking to re-enter
+- functions that are not reentrant (TCP!!!) */
+- if(netif->input(r, netif) != ERR_OK) {
+- pbuf_free(r);
+- r = NULL;
+- }
+-#else /* LWIP_LOOPIF_MULTITHREADING */
+- /* Raw API without threads: put the packet on a linked list which gets
emptied
+- through calling loopif_poll(). */
+- priv = (struct loopif_private*)netif->state;
+-
+- /* let last point to the last pbuf in chain r */
+- for (last = r; last->next != NULL; last = last->next);
+- SYS_ARCH_PROTECT(lev);
+- if(priv->first != NULL) {
+- LWIP_ASSERT("if first != NULL, last must also be != NULL", priv->last !=
NULL);
+- priv->last->next = r;
+- priv->last = last;
+- } else {
+- priv->first = r;
+- priv->last = last;
+- }
+- SYS_ARCH_UNPROTECT(lev);
+-#endif /* LWIP_LOOPIF_MULTITHREADING */
+-
+- return ERR_OK;
+-}
+-
+ /**
+ * Initialize a lwip network interface structure for a loopback interface
+ *
+@@ -193,16 +52,6 @@ loopif_output(struct netif *netif, struc
+ err_t
+ loopif_init(struct netif *netif)
+ {
+-#if !LWIP_LOOPIF_MULTITHREADING
+- struct loopif_private *priv;
+-
+- priv = (struct loopif_private*)mem_malloc(sizeof(struct loopif_private));
+- if(priv == NULL)
+- return ERR_MEM;
+- priv->first = priv->last = NULL;
+- netif->state = priv;
+-#endif /* LWIP_LOOPIF_MULTITHREADING */
+-
+ /* initialize the snmp variables and counters inside the struct netif
+ * ifSpeed: no assumption can be made!
+ */
+@@ -210,7 +59,7 @@ loopif_init(struct netif *netif)
+
+ netif->name[0] = 'l';
+ netif->name[1] = 'o';
+- netif->output = loopif_output;
++ netif->output = netif_loop_output;
+ return ERR_OK;
+ }
+
+Index: src/netif/slipif.c
+===================================================================
+RCS file: /sources/lwip/lwip/src/netif/slipif.c,v
+retrieving revision 1.29
+retrieving revision 1.30
+diff -u -p -r1.29 -r1.30
+--- src/netif/slipif.c 30 Nov 2007 17:22:21 -0000 1.29
++++ src/netif/slipif.c 17 Jun 2008 20:14:05 -0000 1.30
+@@ -44,6 +44,9 @@
+
+ #include "netif/slipif.h"
+ #include "lwip/opt.h"
++
++#if LWIP_HAVE_SLIPIF
++
+ #include "lwip/def.h"
+ #include "lwip/pbuf.h"
+ #include "lwip/sys.h"
+@@ -273,3 +276,4 @@ slipif_init(struct netif *netif)
+ sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop, netif,
SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);
+ return ERR_OK;
+ }
++#endif /* LWIP_HAVE_SLIPIF */
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/newlib.patch
--- a/stubdom/newlib.patch Tue Jul 08 11:41:43 2008 +0900
+++ b/stubdom/newlib.patch Fri Jul 18 12:12:41 2008 +0900
@@ -201,3 +201,429 @@ diff -u -p -r1.1 memcpy.S
ret
+--- newlib/libc/machine/x86_64/x86_64mach.h.orig 2008-07-11
14:57:23.062269000 +0100
++++ newlib/libc/machine/x86_64/x86_64mach.h 2008-07-11 14:58:01.262503000
+0100
+@@ -22,81 +22,81 @@
+
+ #define REG(x) CONCAT1(__REG_PREFIX__, x)
+
+-#define rax REG(rax)
+-#define rbx REG(rbx)
+-#define rcx REG(rcx)
+-#define rdx REG(rdx)
+-#define rsi REG(rsi)
+-#define rdi REG(rdi)
+-#define rbp REG(rbp)
+-#define rsp REG(rsp)
+-
+-#define r8 REG(r8)
+-#define r9 REG(r9)
+-#define r10 REG(r10)
+-#define r11 REG(r11)
+-#define r12 REG(r12)
+-#define r13 REG(r13)
+-#define r14 REG(r14)
+-#define r15 REG(r15)
+-
+-#define eax REG(eax)
+-#define ebx REG(ebx)
+-#define ecx REG(ecx)
+-#define edx REG(edx)
+-#define esi REG(esi)
+-#define edi REG(edi)
+-#define ebp REG(ebp)
+-#define esp REG(esp)
+-
+-#define st0 REG(st)
+-#define st1 REG(st(1))
+-#define st2 REG(st(2))
+-#define st3 REG(st(3))
+-#define st4 REG(st(4))
+-#define st5 REG(st(5))
+-#define st6 REG(st(6))
+-#define st7 REG(st(7))
+-
+-#define ax REG(ax)
+-#define bx REG(bx)
+-#define cx REG(cx)
+-#define dx REG(dx)
+-
+-#define ah REG(ah)
+-#define bh REG(bh)
+-#define ch REG(ch)
+-#define dh REG(dh)
+-
+-#define al REG(al)
+-#define bl REG(bl)
+-#define cl REG(cl)
+-#define dl REG(dl)
+-
+-#define sil REG(sil)
+-
+-#define mm1 REG(mm1)
+-#define mm2 REG(mm2)
+-#define mm3 REG(mm3)
+-#define mm4 REG(mm4)
+-#define mm5 REG(mm5)
+-#define mm6 REG(mm6)
+-#define mm7 REG(mm7)
+-
+-#define xmm0 REG(xmm0)
+-#define xmm1 REG(xmm1)
+-#define xmm2 REG(xmm2)
+-#define xmm3 REG(xmm3)
+-#define xmm4 REG(xmm4)
+-#define xmm5 REG(xmm5)
+-#define xmm6 REG(xmm6)
+-#define xmm7 REG(xmm7)
+-
+-#define cr0 REG(cr0)
+-#define cr1 REG(cr1)
+-#define cr2 REG(cr2)
+-#define cr3 REG(cr3)
+-#define cr4 REG(cr4)
++#define rax %rax
++#define rbx %rbx
++#define rcx %rcx
++#define rdx %rdx
++#define rsi %rsi
++#define rdi %rdi
++#define rbp %rbp
++#define rsp %rsp
++
++#define r8 %r8
++#define r9 %r9
++#define r10 %r10
++#define r11 %r11
++#define r12 %r12
++#define r13 %r13
++#define r14 %r14
++#define r15 %r15
++
++#define eax %eax
++#define ebx %ebx
++#define ecx %ecx
++#define edx %edx
++#define esi %esi
++#define edi %edi
++#define ebp %ebp
++#define esp %esp
++
++#define st0 %st
++#define st1 %st(1)
++#define st2 %st(2)
++#define st3 %st(3)
++#define st4 %st(4)
++#define st5 %st(5)
++#define st6 %st(6)
++#define st7 %st(7)
++
++#define ax %ax
++#define bx %bx
++#define cx %cx
++#define dx %dx
++
++#define ah %ah
++#define bh %bh
++#define ch %ch
++#define dh %dh
++
++#define al %al
++#define bl %bl
++#define cl %cl
++#define dl %dl
++
++#define sil %sil
++
++#define mm1 %mm1
++#define mm2 %mm2
++#define mm3 %mm3
++#define mm4 %mm4
++#define mm5 %mm5
++#define mm6 %mm6
++#define mm7 %mm7
++
++#define xmm0 %xmm0
++#define xmm1 %xmm1
++#define xmm2 %xmm2
++#define xmm3 %xmm3
++#define xmm4 %xmm4
++#define xmm5 %xmm5
++#define xmm6 %xmm6
++#define xmm7 %xmm7
++
++#define cr0 %cr0
++#define cr1 %cr1
++#define cr2 %cr2
++#define cr3 %cr3
++#define cr4 %cr4
+
+ #ifdef _I386MACH_NEED_SOTYPE_FUNCTION
+ #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function
+--- newlib/libc/machine/x86_64/memcpy.S.orig 2008-07-11 15:12:27.494693000
+0100
++++ newlib/libc/machine/x86_64/memcpy.S 2008-07-11 15:12:29.448706000
+0100
+@@ -60,14 +60,14 @@
+ movq 48 (rsi), r13
+ movq 56 (rsi), r14
+
+- movntiq rax, (rdi)
+- movntiq r8 , 8 (rdi)
+- movntiq r9 , 16 (rdi)
+- movntiq r10, 24 (rdi)
+- movntiq r11, 32 (rdi)
+- movntiq r12, 40 (rdi)
+- movntiq r13, 48 (rdi)
+- movntiq r14, 56 (rdi)
++ movnti rax, (rdi)
++ movnti r8 , 8 (rdi)
++ movnti r9 , 16 (rdi)
++ movnti r10, 24 (rdi)
++ movnti r11, 32 (rdi)
++ movnti r12, 40 (rdi)
++ movnti r13, 48 (rdi)
++ movnti r14, 56 (rdi)
+
+ movq 64 (rsi), rax
+ movq 72 (rsi), r8
+@@ -78,14 +78,14 @@
+ movq 112 (rsi), r13
+ movq 120 (rsi), r14
+
+- movntiq rax, 64 (rdi)
+- movntiq r8 , 72 (rdi)
+- movntiq r9 , 80 (rdi)
+- movntiq r10, 88 (rdi)
+- movntiq r11, 96 (rdi)
+- movntiq r12, 104 (rdi)
+- movntiq r13, 112 (rdi)
+- movntiq r14, 120 (rdi)
++ movnti rax, 64 (rdi)
++ movnti r8 , 72 (rdi)
++ movnti r9 , 80 (rdi)
++ movnti r10, 88 (rdi)
++ movnti r11, 96 (rdi)
++ movnti r12, 104 (rdi)
++ movnti r13, 112 (rdi)
++ movnti r14, 120 (rdi)
+
+ leaq 128 (rsi), rsi
+ leaq 128 (rdi), rdi
+--- newlib/libc/machine/i386/i386mach.h 2000-08-28 18:50:06.000000000
+0100
++++ newlib/libc/machine/i386/i386mach.h 2008-07-11 15:17:13.874409000
+0100
+@@ -27,46 +27,46 @@
+
+ #define REG(x) CONCAT1(__REG_PREFIX__, x)
+
+-#define eax REG(eax)
+-#define ebx REG(ebx)
+-#define ecx REG(ecx)
+-#define edx REG(edx)
+-#define esi REG(esi)
+-#define edi REG(edi)
+-#define ebp REG(ebp)
+-#define esp REG(esp)
+-
+-#define st0 REG(st)
+-#define st1 REG(st(1))
+-#define st2 REG(st(2))
+-#define st3 REG(st(3))
+-#define st4 REG(st(4))
+-#define st5 REG(st(5))
+-#define st6 REG(st(6))
+-#define st7 REG(st(7))
+-
+-#define ax REG(ax)
+-#define bx REG(bx)
+-#define cx REG(cx)
+-#define dx REG(dx)
+-
+-#define ah REG(ah)
+-#define bh REG(bh)
+-#define ch REG(ch)
+-#define dh REG(dh)
+-
+-#define al REG(al)
+-#define bl REG(bl)
+-#define cl REG(cl)
+-#define dl REG(dl)
+-
+-#define mm1 REG(mm1)
+-#define mm2 REG(mm2)
+-#define mm3 REG(mm3)
+-#define mm4 REG(mm4)
+-#define mm5 REG(mm5)
+-#define mm6 REG(mm6)
+-#define mm7 REG(mm7)
++#define eax %eax
++#define ebx %ebx
++#define ecx %ecx
++#define edx %edx
++#define esi %esi
++#define edi %edi
++#define ebp %ebp
++#define esp %esp
++
++#define st0 %st
++#define st1 %st(1)
++#define st2 %st(2)
++#define st3 %st(3)
++#define st4 %st(4)
++#define st5 %st(5)
++#define st6 %st(6)
++#define st7 %st(7)
++
++#define ax %ax
++#define bx %bx
++#define cx %cx
++#define dx %dx
++
++#define ah %ah
++#define bh %bh
++#define ch %ch
++#define dh %dh
++
++#define al %al
++#define bl %bl
++#define cl %cl
++#define dl %dl
++
++#define mm1 %mm1
++#define mm2 %mm2
++#define mm3 %mm3
++#define mm4 %mm4
++#define mm5 %mm5
++#define mm6 %mm6
++#define mm7 %mm7
+
+ #ifdef _I386MACH_NEED_SOTYPE_FUNCTION
+ #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function
+--- newlib/libc/machine/x86_64/memset.S 2007-08-28 22:56:49.000000000
+0100
++++ newlib/libc/machine/x86_64/memset.S 2008-07-11 15:16:59.098320000
+0100
+@@ -40,22 +40,22 @@
+
+ .p2align 4
+ loop:
+- movntiq rax, (rdi)
+- movntiq rax, 8 (rdi)
+- movntiq rax, 16 (rdi)
+- movntiq rax, 24 (rdi)
+- movntiq rax, 32 (rdi)
+- movntiq rax, 40 (rdi)
+- movntiq rax, 48 (rdi)
+- movntiq rax, 56 (rdi)
+- movntiq rax, 64 (rdi)
+- movntiq rax, 72 (rdi)
+- movntiq rax, 80 (rdi)
+- movntiq rax, 88 (rdi)
+- movntiq rax, 96 (rdi)
+- movntiq rax, 104 (rdi)
+- movntiq rax, 112 (rdi)
+- movntiq rax, 120 (rdi)
++ movnti rax, (rdi)
++ movnti rax, 8 (rdi)
++ movnti rax, 16 (rdi)
++ movnti rax, 24 (rdi)
++ movnti rax, 32 (rdi)
++ movnti rax, 40 (rdi)
++ movnti rax, 48 (rdi)
++ movnti rax, 56 (rdi)
++ movnti rax, 64 (rdi)
++ movnti rax, 72 (rdi)
++ movnti rax, 80 (rdi)
++ movnti rax, 88 (rdi)
++ movnti rax, 96 (rdi)
++ movnti rax, 104 (rdi)
++ movnti rax, 112 (rdi)
++ movnti rax, 120 (rdi)
+
+ leaq 128 (rdi), rdi
+
+--- newlib/libm/machine/i386/i386mach.h.orig 2008-07-11 15:30:37.367227000
+0100
++++ newlib/libm/machine/i386/i386mach.h 2008-07-11 15:30:55.232337000
+0100
+@@ -27,46 +27,46 @@
+
+ #define REG(x) CONCAT1(__REG_PREFIX__, x)
+
+-#define eax REG(eax)
+-#define ebx REG(ebx)
+-#define ecx REG(ecx)
+-#define edx REG(edx)
+-#define esi REG(esi)
+-#define edi REG(edi)
+-#define ebp REG(ebp)
+-#define esp REG(esp)
+-
+-#define st0 REG(st)
+-#define st1 REG(st(1))
+-#define st2 REG(st(2))
+-#define st3 REG(st(3))
+-#define st4 REG(st(4))
+-#define st5 REG(st(5))
+-#define st6 REG(st(6))
+-#define st7 REG(st(7))
+-
+-#define ax REG(ax)
+-#define bx REG(bx)
+-#define cx REG(cx)
+-#define dx REG(dx)
+-
+-#define ah REG(ah)
+-#define bh REG(bh)
+-#define ch REG(ch)
+-#define dh REG(dh)
+-
+-#define al REG(al)
+-#define bl REG(bl)
+-#define cl REG(cl)
+-#define dl REG(dl)
+-
+-#define mm1 REG(mm1)
+-#define mm2 REG(mm2)
+-#define mm3 REG(mm3)
+-#define mm4 REG(mm4)
+-#define mm5 REG(mm5)
+-#define mm6 REG(mm6)
+-#define mm7 REG(mm7)
++#define eax %eax
++#define ebx %ebx
++#define ecx %ecx
++#define edx %edx
++#define esi %esi
++#define edi %edi
++#define ebp %ebp
++#define esp %esp
++
++#define st0 %st
++#define st1 %st(1)
++#define st2 %st(2)
++#define st3 %st(3)
++#define st4 %st(4)
++#define st5 %st(5)
++#define st6 %st(6)
++#define st7 %st(7)
++
++#define ax %ax
++#define bx %bx
++#define cx %cx
++#define dx %dx
++
++#define ah %ah
++#define bh %bh
++#define ch %ch
++#define dh %dh
++
++#define al %al
++#define bl %bl
++#define cl %cl
++#define dl %dl
++
++#define mm1 %mm1
++#define mm2 %mm2
++#define mm3 %mm3
++#define mm4 %mm4
++#define mm5 %mm5
++#define mm6 %mm6
++#define mm7 %mm7
+
+ #ifdef _I386MACH_NEED_SOTYPE_FUNCTION
+ #define SOTYPE_FUNCTION(sym) .type SYM(sym),@function
diff -r eb0fc71cfc72 -r 400e5d4877ca stubdom/pciutils.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stubdom/pciutils.patch Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,299 @@
+diff -urN pciutils-2.2.9.orig/lib/access.c pciutils-2.2.9/lib/access.c
+--- pciutils-2.2.9.orig/lib/access.c 2007-02-06 11:59:43.000000000 +0000
++++ pciutils-2.2.9/lib/access.c 2008-06-30 19:07:09.713187000 +0100
+@@ -57,6 +57,11 @@
+ #else
+ NULL,
+ #endif
++#ifdef PCI_OS_MINIOS
++ &pm_minios,
++#else
++ NULL,
++#endif
+ };
+
+ struct pci_access *
+--- pciutils-2.2.9.orig/lib/pci.h 2006-09-09 13:46:06.000000000 +0100
++++ pciutils-2.2.9/lib/pci.h 2008-06-30 18:56:15.350111000 +0100
+@@ -33,6 +33,7 @@
+ PCI_ACCESS_NBSD_LIBPCI, /* NetBSD libpci */
+ PCI_ACCESS_OBSD_DEVICE, /* OpenBSD /dev/pci */
+ PCI_ACCESS_DUMP, /* Dump file (params: filename) */
++ PCI_ACCESS_MINIOS, /* MiniOS */
+ PCI_ACCESS_MAX
+ };
+
+@@ -63,6 +64,7 @@
+ int fd_rw; /* proc: fd opened read-write */
+ struct pci_dev *cached_dev; /* proc: device the fd is for */
+ int fd_pos; /* proc: current position */
++ void *minios;
+ };
+
+ /* Initialize PCI access */
+--- pciutils-2.2.9.orig/lib/internal.h 2006-09-09 11:52:47.000000000 +0100
++++ pciutils-2.2.9/lib/internal.h 2008-07-01 10:46:24.968202000 +0100
+@@ -37,4 +37,4 @@
+
+ extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc,
+ pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_obsd_device,
+- pm_dump, pm_linux_sysfs;
++ pm_dump, pm_linux_sysfs, pm_minios;
+--- pciutils-2.2.9.orig/lib/Makefile 2007-10-19 13:41:34.000000000 +0100
++++ pciutils-2.2.9/lib/Makefile 2008-07-01 12:13:14.400525000 +0100
+@@ -46,6 +46,12 @@
+ PCILIB=libpciutils.a
+ endif
+
++ifdef PCI_OS_MINIOS
++XEN_ROOT=../../..
++include $(XEN_ROOT)/Config.mk
++OBJS += minios.o
++endif
++
+ all: $(PCILIB) $(PCILIBPC)
+
+ $(PCILIB): $(OBJS)
+--- pciutils-2.2.9.orig/lib/types.h 2007-09-03 09:44:15.000000000 +0100
++++ pciutils-2.2.9/lib/types.h 2008-07-01 12:17:08.396156000 +0100
+@@ -17,9 +17,13 @@
+ typedef DWORD u32;
+ #elif defined(PCI_HAVE_STDINT_H)
+ #include <stdint.h>
++#ifdef PCI_OS_MINIOS
++#include <types.h>
++#else
+ typedef uint8_t u8;
+ typedef uint16_t u16;
+ typedef uint32_t u32;
++#endif
+ #else
+ typedef u_int8_t u8;
+ typedef u_int16_t u16;
+--- pciutils-2.2.9.orig/lib/minios.c 1970-01-01 01:00:00.000000000 +0100
++++ pciutils-2.2.9/lib/minios.c 2008-07-01 12:31:40.554260000 +0100
+@@ -0,0 +1,113 @@
++/*
++ * The PCI Library -- MiniOS PCI frontend access
++ *
++ * Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>, 2008
++ *
++ * Can be freely distributed and used under the terms of the GNU GPL.
++ */
++
++#include <os.h>
++#include <pcifront.h>
++#include <xenbus.h>
++#include "internal.h"
++
++static int
++minios_detect(struct pci_access *a)
++{
++ return 1;
++}
++
++static void
++minios_init(struct pci_access *a)
++{
++ a->minios = init_pcifront(NULL);
++ if (!a->minios)
++ a->warning("minios_init open failed");
++}
++
++static void
++minios_cleanup(struct pci_access *a)
++{
++ if (a->minios)
++ shutdown_pcifront(a->minios);
++}
++
++static void
++minios_scan(struct pci_access *a)
++{
++ if (!a->minios)
++ return;
++
++ void func(unsigned int domain, unsigned int bus, unsigned int slot,
unsigned int fun)
++ {
++ struct pci_dev *d = pci_alloc_dev(a);
++
++ d->domain = domain;
++ d->bus = bus;
++ d->dev = slot;
++ d->func = fun;
++
++ pci_link_dev(a, d);
++ }
++
++ pcifront_scan(a->minios, func);
++}
++
++static int
++minios_read(struct pci_dev *d, int pos, byte *buf, int len)
++{
++ unsigned int val;
++ switch (len) {
++ case 1:
++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev,
d->func, pos, len, &val))
++ return 0;
++ * buf = val;
++ return 1;
++ case 2:
++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev,
d->func, pos, len, &val))
++ return 0;
++ *(u16 *) buf = cpu_to_le16((u16) val);
++ return 1;
++ case 4:
++ if (pcifront_conf_read(d->access->minios, d->domain, d->bus, d->dev,
d->func, pos, len, &val))
++ return 0;
++ *(u32 *) buf = cpu_to_le32((u32) val);
++ return 1;
++ default:
++ return pci_generic_block_read(d, pos, buf, len);
++ }
++}
++
++static int
++minios_write(struct pci_dev *d, int pos, byte *buf, int len)
++{
++ unsigned int val;
++ switch (len) {
++ case 1:
++ val = * buf;
++ break;
++ case 2:
++ val = le16_to_cpu(*(u16 *) buf);
++ break;
++ case 4:
++ val = le32_to_cpu(*(u32 *) buf);
++ break;
++ default:
++ return pci_generic_block_write(d, pos, buf, len);
++ }
++ return !pcifront_conf_write(d->access->minios, d->domain, d->bus, d->dev,
d->func, pos, len, val);
++}
++
++struct pci_methods pm_minios = {
++ "MiniOS-device",
++ NULL, /* config */
++ minios_detect,
++ minios_init,
++ minios_cleanup,
++ minios_scan,
++ pci_generic_fill_info,
++ minios_read,
++ minios_write,
++ NULL, /* dev_init */
++ NULL /* dev_cleanup */
++};
+--- pciutils-2.2.9/lib/generic.c 2007-02-06 12:00:05.000000000 +0000
++++ pciutils-2.2.9-mine/lib/generic.c 2008-07-01 19:13:52.289949000 +0100
+@@ -74,6 +74,19 @@
+ pci_generic_scan_bus(a, busmap, 0);
+ }
+
++static u32 pci_size(u32 base, u32 maxbase, u32 mask)
++{
++ u32 size = mask & maxbase;
++ if (!size)
++ return 0;
++ size = (size & ~(size-1)) - 1;
++
++ if (base == maxbase && ((base | size) & mask) != mask)
++ return 0;
++
++ return size + 1;
++}
++
+ int
+ pci_generic_fill_info(struct pci_dev *d, int flags)
+ {
+@@ -114,23 +127,61 @@
+ if (!x || x == (u32) ~0)
+ continue;
+ if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
+- d->base_addr[i] = x;
+- else
++ {
++ d->base_addr[i] = x & PCI_BASE_ADDRESS_IO_MASK;
++ if (flags & PCI_FILL_SIZES)
++ {
++ u32 size;
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0);
++ d->size[i] = pci_size(x, pci_read_long(d,
PCI_BASE_ADDRESS_0 + i*4), PCI_BASE_ADDRESS_IO_MASK);
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, x);
++ }
++ }
++ else
+ {
+ if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) !=
PCI_BASE_ADDRESS_MEM_TYPE_64)
+- d->base_addr[i] = x;
++ {
++ d->base_addr[i] = x & PCI_BASE_ADDRESS_MEM_MASK;
++ if (flags & PCI_FILL_SIZES)
++ {
++ u32 size;
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0);
++ d->size[i] = pci_read_long(d, PCI_BASE_ADDRESS_0 +
i*4);
++ d->size[i] = pci_size(x, pci_read_long(d,
PCI_BASE_ADDRESS_0 + i*4), PCI_BASE_ADDRESS_MEM_MASK);
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, x);
++ }
++ }
+ else if (i >= cnt-1)
+ a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen
for BAR %d.", d->domain, d->bus, d->dev, d->func, i);
+ else
+ {
+ u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i)*4);
+ #ifdef PCI_HAVE_64BIT_ADDRESS
+- d->base_addr[i-1] = x | (((pciaddr_t) y) << 32);
++ d->base_addr[i-1] = (x | (((pciaddr_t) y) << 32)) &
PCI_BASE_ADDRESS_MEM_MASK;
++ if (flags & PCI_FILL_SIZES)
++ {
++ u32 size;
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, ~0);
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, ~0);
++ d->size[i-1] = pci_size(y, pci_read_long(d,
PCI_BASE_ADDRESS_0 + (i-1)*4) |
++ pci_read_long(d, PCI_BASE_ADDRESS_0
+ i*4), 0xffffffff );
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4, x);
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + i*4, y);
++ }
+ #else
+ if (y)
+ a->warning("%04x:%02x:%02x.%d 64-bit device address
ignored.", d->domain, d->bus, d->dev, d->func);
+ else
+- d->base_addr[i-1] = x;
++ {
++ d->base_addr[i-1] = x & PCI_BASE_ADDRESS_MEM_MASK;
++ if (flags & PCI_FILL_SIZES)
++ {
++ u32 size;
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4,
~0);
++ d->size[i-1] = pci_size(x, pci_read_long(d,
PCI_BASE_ADDRESS_0 + (i-1)*4), PCI_BASE_ADDRESS_MEM_MASK);
++ pci_write_long(d, PCI_BASE_ADDRESS_0 + (i-1)*4,
x);
++ }
++ }
+ #endif
+ }
+ }
+@@ -154,10 +205,19 @@
+ {
+ u32 u = pci_read_long(d, reg);
+ if (u != 0xffffffff)
+- d->rom_base_addr = u;
++ {
++ d->rom_base_addr = u;
++ if (flags & PCI_FILL_SIZES)
++ {
++ u32 size;
++ pci_write_long(d, reg, ~0);
++ d->rom_size = pci_read_long(d, reg);
++ pci_write_long(d, reg, u);
++ }
++ }
+ }
+ }
+- return flags & ~PCI_FILL_SIZES;
++ return flags;
+ }
+
+ static int
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/Makefile
--- a/tools/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -22,7 +22,12 @@ SUBDIRS-y += blktap
SUBDIRS-y += blktap
SUBDIRS-y += libfsimage
SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen
+
+ifeq (ioemu,$(CONFIG_QEMU))
SUBDIRS-$(CONFIG_IOEMU) += ioemu
+else
+SUBDIRS-$(CONFIG_IOEMU) += ioemu-dir
+endif
# These don't cross-compile
ifeq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
@@ -62,3 +67,33 @@ subdir-clean-ioemu:
subdir-clean-ioemu:
$(MAKE) -C ioemu distclean
+ioemu-dir-find:
+ set -ex; \
+ if test -d $(CONFIG_QEMU); then \
+ rm -f ioemu-dir; \
+ ln -sf $(CONFIG_QEMU) ioemu-dir; \
+ else \
+ if [ ! -d ioemu-remote ]; then \
+ rm -rf ioemu-remote ioemu-remote.tmp; \
+ mkdir ioemu-remote.tmp; rmdir ioemu-remote.tmp; \
+ $(GIT) clone $(CONFIG_QEMU) ioemu-remote.tmp; \
+ mv ioemu-remote.tmp ioemu-remote; \
+ fi; \
+ rm -f ioemu-dir; \
+ ln -sf ioemu-remote ioemu-dir; \
+ fi
+ set -e; \
+ case "$(XEN_ROOT)" in \
+ /*) XEN_ROOT=$(XEN_ROOT) ;; \
+ *) XEN_ROOT=`pwd`/$(XEN_ROOT) ;; \
+ esac; \
+ export XEN_ROOT; \
+ cd ioemu-dir; \
+ ./xen-setup
+
+subdir-all-ioemu-dir subdir-install-ioemu-dir: ioemu-dir-find
+
+subdir-clean-ioemu-dir:
+ if test -d ioemu-dir/.; then \
+ $(MAKE) -C ioemu-dir clean; \
+ fi
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/Makefile
--- a/tools/blktap/drivers/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -36,11 +36,14 @@ BLK-OBJS-y += block-qcow2.o
BLK-OBJS-y += block-qcow2.o
BLK-OBJS-y += aes.o
BLK-OBJS-y += tapaio.o
-BLK-OBJS-$(CONFIG_Linux) += blk_linux.c
+BLK-OBJS-$(CONFIG_Linux) += blk_linux.o
+
+BLKTAB-OBJS-y := blktapctrl.o
+BLKTAB-OBJS-$(CONFIG_Linux) += blktapctrl_linux.o
all: $(IBIN) qcow-util
-blktapctrl: blktapctrl.o
+blktapctrl: $(BLKTAB-OBJS-y)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDFLAGS_blktapctrl)
tapdisk: tapdisk.o $(BLK-OBJS-y)
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl.c
--- a/tools/blktap/drivers/blktapctrl.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/blktapctrl.c Fri Jul 18 12:12:41 2008 +0900
@@ -37,7 +37,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
-#include <sys/stat.h>
#include <err.h>
#include <errno.h>
#include <sys/types.h>
@@ -55,6 +54,8 @@
#include "blktaplib.h"
#include "blktapctrl.h"
#include "tapdisk.h"
+#include "list.h"
+#include "xs_api.h" /* for xs_fire_next_watch() */
#define PIDFILE "/var/run/blktapctrl.pid"
@@ -75,6 +76,32 @@ static int read_msg(int fd, int msgtype,
static int read_msg(int fd, int msgtype, void *ptr);
static driver_list_entry_t *active_disks[MAX_DISK_TYPES];
+
+static unsigned long long tapdisk_get_size(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->size;
+}
+
+static unsigned long tapdisk_get_secsize(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->secsize;
+}
+
+static unsigned int tapdisk_get_info(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->info;
+}
+
+struct blkif_ops tapdisk_ops = {
+ .get_size = tapdisk_get_size,
+ .get_secsize = tapdisk_get_secsize,
+ .get_info = tapdisk_get_info,
+};
+
+
static void init_driver_list(void)
{
int i;
@@ -93,62 +120,6 @@ static void init_rng(void)
seed = tv.tv_usec;
srand48(seed);
return;
-}
-
-static void make_blktap_dev(char *devname, int major, int minor)
-{
- struct stat st;
-
- if (lstat(devname, &st) != 0) {
- /*Need to create device*/
- if (mkdir(BLKTAP_DEV_DIR, 0755) == 0)
- DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR);
- if (mknod(devname, S_IFCHR|0600,
- makedev(major, minor)) == 0)
- DPRINTF("Created %s device\n",devname);
- } else {
- DPRINTF("%s device already exists\n",devname);
- /* it already exists, but is it the same major number */
- if (((st.st_rdev>>8) & 0xff) != major) {
- DPRINTF("%s has old major %d\n",
- devname,
- (unsigned int)((st.st_rdev >> 8) & 0xff));
- /* only try again if we succed in deleting it */
- if (!unlink(devname))
- make_blktap_dev(devname, major, minor);
- }
- }
-}
-
-static int get_new_dev(int *major, int *minor, blkif_t *blkif)
-{
- domid_translate_t tr;
- int ret;
- char *devname;
-
- tr.domid = blkif->domid;
- tr.busid = blkif->be_id;
- ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr );
-
- if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {
- DPRINTF("Incorrect Dev ID [%d]\n",ret);
- return -1;
- }
-
- *minor = ret;
- *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret );
- if (*major < 0) {
- DPRINTF("Incorrect Major ID [%d]\n",*major);
- return -1;
- }
-
- if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME,
*minor) == -1)
- return -1;
- make_blktap_dev(devname,*major,*minor);
- DPRINTF("Received device id %d and major %d, "
- "sent domid %d and be_id %d\n",
- *minor, *major, tr.domid, tr.busid);
- return 0;
}
static int get_tapdisk_pid(blkif_t *blkif)
@@ -626,7 +597,7 @@ fail:
return ret;
}
-int blktapctrl_new_blkif(blkif_t *blkif)
+static int blktapctrl_new_blkif(blkif_t *blkif)
{
blkif_info_t *blk;
int major, minor, fd_read, fd_write, type, new;
@@ -637,7 +608,7 @@ int blktapctrl_new_blkif(blkif_t *blkif)
DPRINTF("Received a poll for a new vbd\n");
if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) {
- if (get_new_dev(&major, &minor, blkif)<0)
+ if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0)
return -1;
if (test_path(blk->params, &ptr, &type, &exist) != 0) {
@@ -698,7 +669,7 @@ fail:
return -EINVAL;
}
-int map_new_blktapctrl(blkif_t *blkif)
+static int map_new_blktapctrl(blkif_t *blkif)
{
DPRINTF("Received a poll for a new devmap\n");
if (write_msg(blkif->fds[WRITE], CTLMSG_NEWDEV, blkif, NULL) <= 0) {
@@ -715,7 +686,7 @@ int map_new_blktapctrl(blkif_t *blkif)
return blkif->minor - 1;
}
-int unmap_blktapctrl(blkif_t *blkif)
+static int unmap_blktapctrl(blkif_t *blkif)
{
DPRINTF("Unmapping vbd\n");
@@ -829,21 +800,11 @@ int main(int argc, char *argv[])
register_new_devmap_hook(map_new_blktapctrl);
register_new_unmap_hook(unmap_blktapctrl);
- /* Attach to blktap0 */
- if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1)
- goto open_failed;
- if ((ret = xc_find_device_number("blktap0")) < 0) {
- DPRINTF("couldn't find device number for 'blktap0'\n");
+ ctlfd = blktap_interface_open();
+ if (ctlfd < 0) {
+ DPRINTF("couldn't open blktap interface\n");
goto open_failed;
}
- blktap_major = major(ret);
- make_blktap_dev(devname,blktap_major,0);
- ctlfd = open(devname, O_RDWR);
- if (ctlfd == -1) {
- DPRINTF("blktap0 open failed\n");
- goto open_failed;
- }
-
retry:
/* Set up store connection and watch. */
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl.h
--- a/tools/blktap/drivers/blktapctrl.h Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/blktapctrl.h Fri Jul 18 12:12:41 2008 +0900
@@ -30,26 +30,7 @@
*/
-static inline unsigned long long tapdisk_get_size(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->size;
-}
+int blktap_interface_open(void);
-static inline unsigned long tapdisk_get_secsize(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->secsize;
-}
+int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif);
-static inline unsigned int tapdisk_get_info(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->info;
-}
-
-struct blkif_ops tapdisk_ops = {
- .get_size = tapdisk_get_size,
- .get_secsize = tapdisk_get_secsize,
- .get_info = tapdisk_get_info,
-};
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/blktapctrl_linux.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/blktap/drivers/blktapctrl_linux.c Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,109 @@
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include "tapdisk.h"
+#include "blktaplib.h"
+#include "blktapctrl.h"
+
+static void make_blktap_dev(char *devname, int major, int minor)
+{
+ struct stat st;
+
+ if (lstat(devname, &st) != 0) {
+ /*Need to create device*/
+ if (mkdir(BLKTAP_DEV_DIR, 0755) == 0)
+ DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR);
+ if (mknod(devname, S_IFCHR|0600,
+ makedev(major, minor)) == 0)
+ DPRINTF("Created %s device\n",devname);
+ } else {
+ DPRINTF("%s device already exists\n",devname);
+ /* it already exists, but is it the same major number */
+ if (((st.st_rdev>>8) & 0xff) != major) {
+ DPRINTF("%s has old major %d\n",
+ devname,
+ (unsigned int)((st.st_rdev >> 8) & 0xff));
+ /* only try again if we succed in deleting it */
+ if (!unlink(devname))
+ make_blktap_dev(devname, major, minor);
+ }
+ }
+}
+
+int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif)
+{
+ domid_translate_t tr;
+ domid_translate_ext_t tr_ext;
+ int ret;
+ char *devname;
+
+ if (blkif->be_id >= (1<<28)) {
+ /* new-style backend-id, so use the extended structure */
+ tr_ext.domid = blkif->domid;
+ tr_ext.busid = blkif->be_id;
+ ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext);
+ DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid,
+ tr_ext.busid);
+ }
+ else {
+ /* old-style backend-id; use the old structure */
+ tr.domid = blkif->domid;
+ tr.busid = (unsigned short)blkif->be_id;
+ ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr);
+ DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid);
+ }
+
+ if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {
+ DPRINTF("Incorrect Dev ID [%d]\n",ret);
+ return -1;
+ }
+
+ *minor = ret;
+ *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret );
+ if (*major < 0) {
+ DPRINTF("Incorrect Major ID [%d]\n",*major);
+ return -1;
+ }
+
+ if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME,
*minor) == -1)
+ return -1;
+ make_blktap_dev(devname,*major,*minor);
+ DPRINTF("Received device id %d and major %d\n",
+ *minor, *major);
+ return 0;
+}
+
+
+int blktap_interface_open(void)
+{
+ char *devname;
+ int ret;
+ int ctlfd;
+
+ /* Attach to blktap0 */
+ if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1)
+ goto open_failed;
+
+ ret = xc_find_device_number("blktap0");
+ if (ret < 0) {
+ DPRINTF("couldn't find device number for 'blktap0'\n");
+ goto open_failed;
+ }
+
+ blktap_major = major(ret);
+ make_blktap_dev(devname,blktap_major, 0);
+
+ ctlfd = open(devname, O_RDWR);
+ if (ctlfd == -1) {
+ DPRINTF("blktap0 open failed\n");
+ goto open_failed;
+ }
+
+ return ctlfd;
+
+open_failed:
+ return -1;
+}
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-aio.c
--- a/tools/blktap/drivers/block-aio.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/block-aio.c Fri Jul 18 12:12:41 2008 +0900
@@ -118,7 +118,7 @@ static inline void init_fds(struct disk_
}
/* Open the disk file and initialize aio state. */
-int tdaio_open (struct disk_driver *dd, const char *name, td_flag_t flags)
+static int tdaio_open (struct disk_driver *dd, const char *name, td_flag_t
flags)
{
int i, fd, ret = 0, o_flags;
struct td_state *s = dd->td_state;
@@ -161,7 +161,7 @@ done:
return ret;
}
-int tdaio_queue_read(struct disk_driver *dd, uint64_t sector,
+static int tdaio_queue_read(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -174,7 +174,7 @@ int tdaio_queue_read(struct disk_driver
cb, id, sector, private);
}
-int tdaio_queue_write(struct disk_driver *dd, uint64_t sector,
+static int tdaio_queue_write(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -187,14 +187,14 @@ int tdaio_queue_write(struct disk_driver
cb, id, sector, private);
}
-int tdaio_submit(struct disk_driver *dd)
+static int tdaio_submit(struct disk_driver *dd)
{
struct tdaio_state *prv = (struct tdaio_state *)dd->private;
return tap_aio_submit(&prv->aio);
}
-int tdaio_close(struct disk_driver *dd)
+static int tdaio_close(struct disk_driver *dd)
{
struct tdaio_state *prv = (struct tdaio_state *)dd->private;
@@ -204,7 +204,7 @@ int tdaio_close(struct disk_driver *dd)
return 0;
}
-int tdaio_do_callbacks(struct disk_driver *dd, int sid)
+static int tdaio_do_callbacks(struct disk_driver *dd, int sid)
{
int i, nr_events, rsp = 0;
struct io_event *ep;
@@ -234,12 +234,12 @@ repeat:
return rsp;
}
-int tdaio_get_parent_id(struct disk_driver *dd, struct disk_id *id)
+static int tdaio_get_parent_id(struct disk_driver *dd, struct disk_id *id)
{
return TD_NO_PARENT;
}
-int tdaio_validate_parent(struct disk_driver *dd,
+static int tdaio_validate_parent(struct disk_driver *dd,
struct disk_driver *parent, td_flag_t flags)
{
return -EINVAL;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/block-qcow.c Fri Jul 18 12:12:41 2008 +0900
@@ -720,7 +720,7 @@ static inline void init_fds(struct disk_
}
/* Open the disk file and initialize qcow state. */
-int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t flags)
+static int tdqcow_open (struct disk_driver *dd, const char *name, td_flag_t
flags)
{
int fd, len, i, shift, ret, size, l1_table_size, o_flags;
int max_aio_reqs;
@@ -937,7 +937,7 @@ fail:
return -1;
}
-int tdqcow_queue_read(struct disk_driver *dd, uint64_t sector,
+static int tdqcow_queue_read(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -999,7 +999,7 @@ done:
return rsp;
}
-int tdqcow_queue_write(struct disk_driver *dd, uint64_t sector,
+static int tdqcow_queue_write(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -1057,14 +1057,14 @@ int tdqcow_queue_write(struct disk_drive
return 0;
}
-int tdqcow_submit(struct disk_driver *dd)
+static int tdqcow_submit(struct disk_driver *dd)
{
struct tdqcow_state *prv = (struct tdqcow_state *)dd->private;
return tap_aio_submit(&prv->aio);
}
-int tdqcow_close(struct disk_driver *dd)
+static int tdqcow_close(struct disk_driver *dd)
{
struct tdqcow_state *s = (struct tdqcow_state *)dd->private;
uint32_t cksum, out;
@@ -1092,7 +1092,7 @@ int tdqcow_close(struct disk_driver *dd)
return 0;
}
-int tdqcow_do_callbacks(struct disk_driver *dd, int sid)
+static int tdqcow_do_callbacks(struct disk_driver *dd, int sid)
{
int ret, i, nr_events, rsp = 0,*ptr;
struct io_event *ep;
@@ -1276,7 +1276,7 @@ int qcow_create(const char *filename, ui
return 0;
}
-int qcow_make_empty(struct tdqcow_state *s)
+static int qcow_make_empty(struct tdqcow_state *s)
{
uint32_t l1_length = s->l1_size * sizeof(uint64_t);
@@ -1296,14 +1296,14 @@ int qcow_make_empty(struct tdqcow_state
return 0;
}
-int qcow_get_cluster_size(struct tdqcow_state *s)
+static int qcow_get_cluster_size(struct tdqcow_state *s)
{
return s->cluster_size;
}
/* XXX: put compressed sectors first, then all the cluster aligned
tables to avoid losing bytes in alignment */
-int qcow_compress_cluster(struct tdqcow_state *s, int64_t sector_num,
+static int qcow_compress_cluster(struct tdqcow_state *s, int64_t sector_num,
const uint8_t *buf)
{
z_stream strm;
@@ -1358,7 +1358,7 @@ int qcow_compress_cluster(struct tdqcow_
return 0;
}
-int tdqcow_get_parent_id(struct disk_driver *dd, struct disk_id *id)
+static int tdqcow_get_parent_id(struct disk_driver *dd, struct disk_id *id)
{
off_t off;
char *buf, *filename;
@@ -1392,7 +1392,7 @@ int tdqcow_get_parent_id(struct disk_dri
return err;
}
-int tdqcow_validate_parent(struct disk_driver *child,
+static int tdqcow_validate_parent(struct disk_driver *child,
struct disk_driver *parent, td_flag_t flags)
{
struct stat stats;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-ram.c
--- a/tools/blktap/drivers/block-ram.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/block-ram.c Fri Jul 18 12:12:41 2008 +0900
@@ -127,7 +127,7 @@ static inline void init_fds(struct disk_
}
/* Open the disk file and initialize ram state. */
-int tdram_open (struct disk_driver *dd, const char *name, td_flag_t flags)
+static int tdram_open (struct disk_driver *dd, const char *name, td_flag_t
flags)
{
char *p;
uint64_t size;
@@ -220,7 +220,7 @@ done:
return ret;
}
- int tdram_queue_read(struct disk_driver *dd, uint64_t sector,
+static int tdram_queue_read(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -234,7 +234,7 @@ done:
return cb(dd, 0, sector, nb_sectors, id, private);
}
-int tdram_queue_write(struct disk_driver *dd, uint64_t sector,
+static int tdram_queue_write(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -250,12 +250,12 @@ int tdram_queue_write(struct disk_driver
return cb(dd, 0, sector, nb_sectors, id, private);
}
-int tdram_submit(struct disk_driver *dd)
+static int tdram_submit(struct disk_driver *dd)
{
return 0;
}
-int tdram_close(struct disk_driver *dd)
+static int tdram_close(struct disk_driver *dd)
{
struct tdram_state *prv = (struct tdram_state *)dd->private;
@@ -264,18 +264,18 @@ int tdram_close(struct disk_driver *dd)
return 0;
}
-int tdram_do_callbacks(struct disk_driver *dd, int sid)
+static int tdram_do_callbacks(struct disk_driver *dd, int sid)
{
/* always ask for a kick */
return 1;
}
-int tdram_get_parent_id(struct disk_driver *dd, struct disk_id *id)
+static int tdram_get_parent_id(struct disk_driver *dd, struct disk_id *id)
{
return TD_NO_PARENT;
}
-int tdram_validate_parent(struct disk_driver *dd,
+static int tdram_validate_parent(struct disk_driver *dd,
struct disk_driver *parent, td_flag_t flags)
{
return -EINVAL;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/block-sync.c
--- a/tools/blktap/drivers/block-sync.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/block-sync.c Fri Jul 18 12:12:41 2008 +0900
@@ -109,7 +109,7 @@ static inline void init_fds(struct disk_
}
/* Open the disk file and initialize aio state. */
-int tdsync_open (struct disk_driver *dd, const char *name, td_flag_t flags)
+static int tdsync_open (struct disk_driver *dd, const char *name, td_flag_t
flags)
{
int i, fd, ret = 0, o_flags;
struct td_state *s = dd->td_state;
@@ -129,7 +129,7 @@ int tdsync_open (struct disk_driver *dd,
/* Maybe O_DIRECT isn't supported. */
o_flags &= ~O_DIRECT;
- fd = open(name, O_RDWR | O_LARGEFILE);
+ fd = open(name, o_flags);
if (fd != -1) DPRINTF("WARNING: Accessing image without"
"O_DIRECT! (%s)\n", name);
@@ -149,7 +149,7 @@ done:
return ret;
}
- int tdsync_queue_read(struct disk_driver *dd, uint64_t sector,
+static int tdsync_queue_read(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -172,7 +172,7 @@ done:
return cb(dd, (ret < 0) ? ret: 0, sector, nb_sectors, id, private);
}
- int tdsync_queue_write(struct disk_driver *dd, uint64_t sector,
+static int tdsync_queue_write(struct disk_driver *dd, uint64_t sector,
int nb_sectors, char *buf, td_callback_t cb,
int id, void *private)
{
@@ -195,12 +195,12 @@ done:
return cb(dd, (ret < 0) ? ret : 0, sector, nb_sectors, id, private);
}
-int tdsync_submit(struct disk_driver *dd)
+static int tdsync_submit(struct disk_driver *dd)
{
return 0;
}
-int tdsync_close(struct disk_driver *dd)
+static int tdsync_close(struct disk_driver *dd)
{
struct tdsync_state *prv = (struct tdsync_state *)dd->private;
@@ -211,18 +211,18 @@ int tdsync_close(struct disk_driver *dd)
return 0;
}
-int tdsync_do_callbacks(struct disk_driver *dd, int sid)
+static int tdsync_do_callbacks(struct disk_driver *dd, int sid)
{
/* always ask for a kick */
return 1;
}
-int tdsync_get_parent_id(struct disk_driver *dd, struct disk_id *id)
+static int tdsync_get_parent_id(struct disk_driver *dd, struct disk_id *id)
{
return TD_NO_PARENT;
}
-int tdsync_validate_parent(struct disk_driver *dd,
+static int tdsync_validate_parent(struct disk_driver *dd,
struct disk_driver *parent, td_flag_t flags)
{
return -EINVAL;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/img2qcow.c
--- a/tools/blktap/drivers/img2qcow.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/img2qcow.c Fri Jul 18 12:12:41 2008 +0900
@@ -61,8 +61,8 @@ static uint64_t prev = 0;
static uint64_t prev = 0;
static char output[25];
-void print_bytes(void *ptr, int length) {
-
+static void print_bytes(void *ptr, int length)
+{
int i,k;
unsigned char *p = ptr;
@@ -77,7 +77,7 @@ void print_bytes(void *ptr, int length)
return;
}
-void debug_output(uint64_t progress, uint64_t size)
+static void debug_output(uint64_t progress, uint64_t size)
{
uint64_t blocks = size/20;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/qcow-create.c
--- a/tools/blktap/drivers/qcow-create.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/qcow-create.c Fri Jul 18 12:12:41 2008 +0900
@@ -48,7 +48,7 @@
#define MAX_NAME_LEN 1000
-void help(void)
+static void help(void)
{
fprintf(stderr, "Qcow-utils: v1.0.0\n");
fprintf(stderr,
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/qcow2raw.c
--- a/tools/blktap/drivers/qcow2raw.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/qcow2raw.c Fri Jul 18 12:12:41 2008 +0900
@@ -65,8 +65,8 @@ static uint64_t prev = 0, written = 0;
static uint64_t prev = 0, written = 0;
static char output[25];
-void print_bytes(void *ptr, int length) {
-
+static void print_bytes(void *ptr, int length)
+{
int i,k;
unsigned char *p = ptr;
@@ -81,7 +81,7 @@ void print_bytes(void *ptr, int length)
return;
}
-void debug_output(uint64_t progress, uint64_t size)
+static void debug_output(uint64_t progress, uint64_t size)
{
/*Output progress every 5% */
uint64_t blocks = size/20;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/drivers/tapdisk.c
--- a/tools/blktap/drivers/tapdisk.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/drivers/tapdisk.c Fri Jul 18 12:12:41 2008 +0900
@@ -53,14 +53,14 @@ int do_cow_read(struct disk_driver *dd,
#define td_for_each_disk(tds, drv) \
for (drv = tds->disks; drv != NULL; drv = drv->next)
-void usage(void)
+static void usage(void)
{
fprintf(stderr, "blktap-utils: v1.0.0\n");
fprintf(stderr, "usage: tapdisk <READ fifo> <WRITE fifo>\n");
exit(-1);
}
-void daemonize(void)
+static void daemonize(void)
{
int i;
@@ -121,7 +121,7 @@ static void unmap_disk(struct td_state *
return;
}
-void sig_handler(int sig)
+static void sig_handler(int sig)
{
/*Received signal to close. If no disks are active, we close app.*/
@@ -512,7 +512,7 @@ static inline void kick_responses(struct
}
}
-void io_done(struct disk_driver *dd, int sid)
+static void io_done(struct disk_driver *dd, int sid)
{
struct tap_disk *drv = dd->drv;
@@ -537,7 +537,7 @@ segment_start(blkif_request_t *req, int
}
uint64_t sends, responds;
-int send_responses(struct disk_driver *dd, int res,
+static int send_responses(struct disk_driver *dd, int res,
uint64_t sector, int nr_secs, int idx, void *private)
{
pending_req_t *preq;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/lib/blktaplib.h
--- a/tools/blktap/lib/blktaplib.h Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/lib/blktaplib.h Fri Jul 18 12:12:41 2008 +0900
@@ -57,6 +57,7 @@
#define BLKTAP_IOCTL_MAJOR 7
#define BLKTAP_QUERY_ALLOC_REQS 8
#define BLKTAP_IOCTL_FREEINTF 9
+#define BLKTAP_IOCTL_NEWINTF_EXT 50
#define BLKTAP_IOCTL_PRINT_IDXS 100
/* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE) */
@@ -161,8 +162,13 @@ typedef struct tapdev_info {
typedef struct domid_translate {
unsigned short domid;
+ unsigned short busid;
+} domid_translate_t ;
+
+typedef struct domid_translate_ext {
+ unsigned short domid;
uint32_t busid;
-} domid_translate_t ;
+} domid_translate_ext_t ;
typedef struct image {
unsigned long long size;
@@ -207,7 +213,6 @@ typedef struct msg_pid {
/* xenstore/xenbus: */
#define DOMNAME "Domain-0"
int setup_probe_watch(struct xs_handle *h);
-int xs_fire_next_watch(struct xs_handle *h);
/* Abitrary values, must match the underlying driver... */
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/blktap/lib/xenbus.c
--- a/tools/blktap/lib/xenbus.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/blktap/lib/xenbus.c Fri Jul 18 12:12:41 2008 +0900
@@ -354,7 +354,7 @@ static void ueblktap_probe(struct xs_han
*are created, we initalise the state and attach a disk.
*/
-int add_blockdevice_probe_watch(struct xs_handle *h, const char *domid)
+static int add_blockdevice_probe_watch(struct xs_handle *h, const char *domid)
{
char *path;
struct xenbus_watch *vbd_watch;
@@ -377,7 +377,7 @@ int add_blockdevice_probe_watch(struct x
}
/* Asynch callback to check for /local/domain/<DOMID>/name */
-void check_dom(struct xs_handle *h, struct xenbus_watch *w,
+static void check_dom(struct xs_handle *h, struct xenbus_watch *w,
const char *bepath_im)
{
char *domid;
@@ -392,7 +392,7 @@ void check_dom(struct xs_handle *h, stru
}
/* We must wait for xend to register /local/domain/<DOMID> */
-int watch_for_domid(struct xs_handle *h)
+static int watch_for_domid(struct xs_handle *h)
{
struct xenbus_watch *domid_watch;
char *path = NULL;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/console/daemon/io.c Fri Jul 18 12:12:41 2008 +0900
@@ -471,7 +471,7 @@ out:
}
/* Takes tuples of names, scanf-style args, and void **, NULL terminated. */
-int xs_gather(struct xs_handle *xs, const char *dir, ...)
+static int xs_gather(struct xs_handle *xs, const char *dir, ...)
{
va_list ap;
const char *name;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/network-bridge
--- a/tools/examples/network-bridge Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/network-bridge Fri Jul 18 12:12:41 2008 +0900
@@ -60,7 +60,18 @@ is_network_root () {
local rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}'
/etc/mtab)
local rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}'
/etc/mtab)
- [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] && return 0 ||
return 1
+ [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] &&
has_nfsroot=1 || has_nfsroot=0
+ if [ $has_nfsroot -eq 1 ]; then
+ local bparms=$(cat /proc/cmdline)
+ for p in $bparms; do
+ local ipaddr=$(echo $p | awk /nfsroot=/'{ print
substr($1,9,index($1,":")-9) }')
+ if [ "$ipaddr" != "" ]; then
+ local nfsdev=$(ip route get $ipaddr | awk /$ipaddr/'{ print $3
}')
+ [[ "$nfsdev" == "$netdev" ]] && return 0 || return 1
+ fi
+ done
+ fi
+ return 1
}
find_alt_device () {
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/vscsi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/examples/vscsi Fri Jul 18 12:12:41 2008 +0900
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (c) 2007, FUJITSU Limited
+# Based on the block scripts code.
+#
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+findCommand "$@"
+
+case "$command" in
+ add)
+ success
+ ;;
+ remove)
+ # TODO
+ exit 0
+ ;;
+esac
+
+exit 0
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/vtpm-common.sh
--- a/tools/examples/vtpm-common.sh Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/vtpm-common.sh Fri Jul 18 12:12:41 2008 +0900
@@ -310,11 +310,11 @@ function vtpm_remove_instance () {
instance="0"
- if [ "$uuid != "" ]; then
+ if [ "$uuid" != "" ]; then
instance=$(vtpmdb_find_instance $uuid)
fi
- if [ "$instance == "0" ]; then
+ if [ "$instance" == "0" ]; then
domname=$(xenstore_read "$XENBUS_PATH"/domain)
instance=$(vtpmdb_find_instance $domname)
fi
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xen-backend.agent
--- a/tools/examples/xen-backend.agent Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xen-backend.agent Fri Jul 18 12:12:41 2008 +0900
@@ -19,6 +19,9 @@ case "$XENBUS_TYPE" in
vif)
[ -n "$script" ] && $script "$ACTION"
;;
+ vscsi)
+ /etc/xen/scripts/vscsi "$ACTION"
+ ;;
esac
case "$ACTION" in
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xen-backend.rules
--- a/tools/examples/xen-backend.rules Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xen-backend.rules Fri Jul 18 12:12:41 2008 +0900
@@ -3,6 +3,7 @@ SUBSYSTEM=="xen-backend", KERNEL=="vtpm*
SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm
$env{ACTION}"
SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script}
online"
SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline",
RUN+="$env{script} offline"
+SUBSYSTEM=="xen-backend", KERNEL=="vscsi*", RUN+="/etc/xen/scripts/vscsi
$env{ACTION}"
SUBSYSTEM=="xen-backend", ACTION=="remove",
RUN+="/etc/xen/scripts/xen-hotplug-cleanup"
KERNEL=="evtchn", NAME="xen/%k"
KERNEL=="blktap[0-9]*", NAME="xen/%k"
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xmexample.hvm Fri Jul 18 12:12:41 2008 +0900
@@ -282,3 +282,26 @@ serial='pty'
# '0' -> the bit must be '0'
# 'x' -> we don't care (do not check)
# 's' -> the bit must be the same as on the host that started this VM
+
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample.vti
--- a/tools/examples/xmexample.vti Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xmexample.vti Fri Jul 18 12:12:41 2008 +0900
@@ -161,3 +161,25 @@ serial='pty'
# 'windows' - All Windows variants (Windows Server 2003/2008)
#
#guest_os_type='default'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample1
--- a/tools/examples/xmexample1 Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xmexample1 Fri Jul 18 12:12:41 2008 +0900
@@ -185,4 +185,27 @@ extra = "4"
#on_reboot = 'restart'
#on_crash = 'restart'
-#============================================================================
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
+
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/examples/xmexample2
--- a/tools/examples/xmexample2 Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/examples/xmexample2 Fri Jul 18 12:12:41 2008 +0900
@@ -221,4 +221,26 @@ extra = "4 VMID=%d usr=/dev/sda6" % vmid
#on_reboot = 'restart'
#on_crash = 'restart'
-#============================================================================
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/acpi/build.c Fri Jul 18 12:12:41 2008 +0900
@@ -70,12 +70,7 @@ static int hpet_exists(unsigned long hpe
static int construct_bios_info_table(uint8_t *buf)
{
- struct bios_info {
- uint8_t com1_present:1;
- uint8_t com2_present:1;
- uint8_t hpet_present:1;
- uint32_t pci_min, pci_len;
- } *bios_info = (struct bios_info *)buf;
+ struct bios_info *bios_info = (struct bios_info *)buf;
memset(bios_info, 0, sizeof(*bios_info));
@@ -86,6 +81,7 @@ static int construct_bios_info_table(uin
bios_info->pci_min = PCI_MEMBASE;
bios_info->pci_len = PCI_MEMSIZE;
+ bios_info->xen_pfiob = 0xdead;
return align16(sizeof(*bios_info));
}
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/config.h Fri Jul 18 12:12:41 2008 +0900
@@ -31,4 +31,15 @@
#define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000
#define SCRATCH_PHYSICAL_ADDRESS 0x00010000
+/* Xen Platform Device */
+#define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
+
+struct bios_info {
+ uint8_t com1_present:1;
+ uint8_t com2_present:1;
+ uint8_t hpet_present:1;
+ uint32_t pci_min, pci_len;
+ uint16_t xen_pfiob;
+};
+
#endif /* __HVMLOADER_CONFIG_H__ */
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/hvmloader.c Fri Jul 18 12:12:41 2008 +0900
@@ -99,10 +99,6 @@ asm (
" .text \n"
);
-void smp_initialise(void);
-void create_mp_tables(void);
-int hvm_write_smbios_tables(void);
-
static enum { VGA_none, VGA_std, VGA_cirrus } virtual_vga = VGA_none;
static void
@@ -432,6 +428,23 @@ static void cmos_write_memory_size(void)
/* Some BIOSes: alternative extended memory (64kB chunks above 16MB). */
cmos_outb(0x34, (uint8_t)( alt_mem >> 0));
cmos_outb(0x35, (uint8_t)( alt_mem >> 8));
+}
+
+static void init_xen_platform_io_base(void)
+{
+ struct bios_info *bios_info = (struct bios_info *)ACPI_PHYSICAL_ADDRESS;
+ uint32_t devfn, bar_data;
+ uint16_t vendor_id, device_id;
+
+ for ( devfn = 0; devfn < 128; devfn++ )
+ {
+ vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
+ device_id = pci_readw(devfn, PCI_DEVICE_ID);
+ if ( (vendor_id != 0x5853) || (device_id != 0x0001) )
+ continue;
+ bar_data = pci_readl(devfn, PCI_BASE_ADDRESS_0);
+ bios_info->xen_pfiob = bar_data & PCI_BASE_ADDRESS_IO_MASK;
+ }
}
int main(void)
@@ -527,6 +540,8 @@ int main(void)
ROMBIOS_PHYSICAL_ADDRESS,
ROMBIOS_PHYSICAL_ADDRESS + rombios_sz - 1);
+ init_xen_platform_io_base();
+
printf("Invoking ROMBIOS ...\n");
return 0;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/mp_tables.c
--- a/tools/firmware/hvmloader/mp_tables.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/mp_tables.c Fri Jul 18 12:12:41 2008 +0900
@@ -69,8 +69,6 @@
#include "util.h"
-extern int get_vcpu_nr(void); /* for the guest's VCPU count */
-
/*
* The following structures are defined in the MuliProcessor Specifiation v1.4
*/
@@ -152,7 +150,7 @@ struct mp_local_intr_entry {
};
-void fill_mp_config_table(struct mp_config_table *mpct, int length)
+static void fill_mp_config_table(struct mp_config_table *mpct, int length)
{
int vcpu_nr, i;
uint8_t checksum;
@@ -199,7 +197,7 @@ void fill_mp_config_table(struct mp_conf
}
/* fills in an MP processor entry for VCPU 'vcpu_id' */
-void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id)
+static void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id)
{
mppe->type = ENTRY_TYPE_PROCESSOR;
mppe->lapic_id = LAPIC_ID(vcpu_id);
@@ -213,7 +211,7 @@ void fill_mp_proc_entry(struct mp_proc_e
/* fills in an MP bus entry of type 'type' and bus ID 'bus_id' */
-void fill_mp_bus_entry(struct mp_bus_entry *mpbe, int bus_id, const char *type)
+static void fill_mp_bus_entry(struct mp_bus_entry *mpbe, int bus_id, const
char *type)
{
int i;
@@ -225,7 +223,7 @@ void fill_mp_bus_entry(struct mp_bus_ent
/* fills in an MP IOAPIC entry for IOAPIC 'ioapic_id' */
-void fill_mp_ioapic_entry(struct mp_ioapic_entry *mpie)
+static void fill_mp_ioapic_entry(struct mp_ioapic_entry *mpie)
{
mpie->type = ENTRY_TYPE_IOAPIC;
mpie->ioapic_id = IOAPIC_ID;
@@ -236,7 +234,7 @@ void fill_mp_ioapic_entry(struct mp_ioap
/* fills in an IO interrupt entry for IOAPIC 'ioapic_id' */
-void fill_mp_io_intr_entry(
+static void fill_mp_io_intr_entry(
struct mp_io_intr_entry *mpiie,
int src_bus_id, int src_bus_irq, int ioapic_id, int dst_ioapic_intin)
{
@@ -251,7 +249,7 @@ void fill_mp_io_intr_entry(
/* fill in the mp floating processor structure */
-void fill_mpfps(struct mp_floating_pointer_struct *mpfps, uint32_t mpct)
+static void fill_mpfps(struct mp_floating_pointer_struct *mpfps, uint32_t mpct)
{
int i;
uint8_t checksum;
@@ -283,7 +281,7 @@ void fill_mpfps(struct mp_floating_point
* The '___HVMMP' signature is created by the ROMBIOS and designates a chunk
* of space inside the ROMBIOS that is safe for us to write our MP table info
*/
-void* get_mp_table_start(void)
+static void *get_mp_table_start(void)
{
char *bios_mem;
@@ -300,7 +298,7 @@ void* get_mp_table_start(void)
/* recalculate the new ROMBIOS checksum after adding MP tables */
-void reset_bios_checksum(void)
+static void reset_bios_checksum(void)
{
uint32_t i;
uint8_t checksum;
@@ -311,7 +309,6 @@ void reset_bios_checksum(void)
*((uint8_t *)(ROMBIOS_BEGIN + ROMBIOS_MAXOFFSET)) = -checksum;
}
-
/* create_mp_tables - creates MP tables for the guest based upon config data */
void create_mp_tables(void)
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/smp.c
--- a/tools/firmware/hvmloader/smp.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/smp.c Fri Jul 18 12:12:41 2008 +0900
@@ -69,8 +69,7 @@ asm (
" .text \n"
);
-extern void cacheattr_init(void);
-
+void ap_start(void); /* non-static avoids unused-function compiler warning */
/*static*/ void ap_start(void)
{
printf(" - CPU%d ... ", ap_cpuid);
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/hvmloader/util.h Fri Jul 18 12:12:41 2008 +0900
@@ -137,6 +137,12 @@ uint32_t e820_malloc(uint32_t size);
/* Prepare the 32bit BIOS */
void highbios_setup(void);
+/* Miscellaneous. */
+void cacheattr_init(void);
+void create_mp_tables(void);
+int hvm_write_smbios_tables(void);
+void smp_initialise(void);
+
#define isdigit(c) ((c) >= '0' && (c) <= '9')
#endif /* __HVMLOADER_UTIL_H__ */
diff -r eb0fc71cfc72 -r 400e5d4877ca
tools/firmware/rombios/32bit/tcgbios/tcgbios.c
--- a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c Tue Jul 08 11:41:43
2008 +0900
+++ b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c Fri Jul 18 12:12:41
2008 +0900
@@ -581,7 +581,7 @@ static char wake_event_1[] = "Wake Ev
* data : additional parameter; used as parameter for 10.4.3
* 'action index'
*/
-void tcpa_add_measurement(uint32_t pcrIndex,
+static void tcpa_add_measurement(uint32_t pcrIndex,
uint16_t event_type,
uint32_t data)
{
@@ -863,7 +863,7 @@ uint32_t tcpa_initialize_tpm(uint32_t ph
}
-uint16_t TCG_IsShutdownPreBootInterface(void)
+static uint16_t TCG_IsShutdownPreBootInterface(void)
{
return tcpa_acpi.flags & STATUS_FLAG_SHUTDOWN;
}
diff -r eb0fc71cfc72 -r 400e5d4877ca
tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c
--- a/tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c Tue Jul 08
11:41:43 2008 +0900
+++ b/tools/firmware/rombios/32bit/tcgbios/tpm_drivers.c Fri Jul 18
12:12:41 2008 +0900
@@ -75,7 +75,7 @@ static uint32_t tis_activate(uint32_t ba
return rc;
}
-uint32_t tis_ready(uint32_t baseaddr)
+static uint32_t tis_ready(uint32_t baseaddr)
{
uint32_t rc = 0;
uint8_t *tis_addr = (uint8_t*)baseaddr;
@@ -86,7 +86,7 @@ uint32_t tis_ready(uint32_t baseaddr)
return rc;
}
-uint32_t tis_senddata(uint32_t baseaddr, unsigned char *data, uint32_t len)
+static uint32_t tis_senddata(uint32_t baseaddr, unsigned char *data, uint32_t
len)
{
uint32_t rc = 0;
uint8_t *tis_addr = (uint8_t*)baseaddr;
@@ -127,7 +127,7 @@ uint32_t tis_senddata(uint32_t baseaddr,
return rc;
}
-uint32_t tis_readresp(uint32_t baseaddr, unsigned char *buffer, uint32_t len)
+static uint32_t tis_readresp(uint32_t baseaddr, unsigned char *buffer,
uint32_t len)
{
uint32_t rc = 0;
uint32_t offset = 0;
@@ -147,7 +147,7 @@ uint32_t tis_readresp(uint32_t baseaddr,
}
-uint32_t tis_waitdatavalid(uint32_t baseaddr)
+static uint32_t tis_waitdatavalid(uint32_t baseaddr)
{
uint8_t *tis_addr = (uint8_t*)baseaddr;
uint32_t rc = 0;
@@ -157,7 +157,7 @@ uint32_t tis_waitdatavalid(uint32_t base
return rc;
}
-uint32_t tis_waitrespready(uint32_t baseaddr, uint32_t timeout)
+static uint32_t tis_waitrespready(uint32_t baseaddr, uint32_t timeout)
{
uint32_t rc = 0;
uint8_t *tis_addr = (uint8_t*)baseaddr;
@@ -170,7 +170,7 @@ uint32_t tis_waitrespready(uint32_t base
}
/* if device is not there, return '0', '1' otherwise */
-uint32_t tis_probe(uint32_t baseaddr)
+static uint32_t tis_probe(uint32_t baseaddr)
{
uint32_t rc = 0;
uint8_t *tis_addr = (uint8_t*)baseaddr;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/32bit/util.c
--- a/tools/firmware/rombios/32bit/util.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/rombios/32bit/util.c Fri Jul 18 12:12:41 2008 +0900
@@ -388,12 +388,6 @@ int printf(const char *fmt, ...)
return 0;
}
-int vprintf(const char *fmt, va_list ap)
-{
- _doprint(putchar, fmt, ap);
- return 0;
-}
-
void mssleep(uint32_t waittime)
{
uint32_t i;
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/rombios/rombios.c Fri Jul 18 12:12:41 2008 +0900
@@ -26,6 +26,9 @@
// ROM BIOS for use with Bochs/Plex x86 emulation environment
+#define uint8_t unsigned char
+#define uint16_t unsigned short
+#define uint32_t unsigned long
#include "../hvmloader/config.h"
#define HVMASSIST
@@ -1459,6 +1462,23 @@ copy_e820_table()
base_mem = read_dword(0x9000, 0x2d0 + 8);
write_word(0x40, 0x13, base_mem >> 10);
}
+
+void
+disable_rom_write_access()
+{
+ Bit16u off = (Bit16u)&((struct bios_info *)0)->xen_pfiob;
+ASM_START
+ mov si,.disable_rom_write_access.off[bp]
+ push ds
+ mov ax,#(ACPI_PHYSICAL_ADDRESS >> 4)
+ mov ds,ax
+ mov dx,[si]
+ pop ds
+ mov ax,#PFFLAG_ROM_LOCK
+ out dx,al
+ASM_END
+}
+
#endif /* HVMASSIST */
#if BX_DEBUG_SERIAL
@@ -10154,6 +10174,10 @@ post_default_ints:
#if BX_TCGBIOS
call tcpa_post_part2
#endif
+
+#ifdef HVMASSIST
+ call _disable_rom_write_access
+#endif
;; Start the boot sequence. See the comments in int19_relocated
;; for why we use INT 18h instead of INT 19h here.
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/ChangeLog
--- a/tools/firmware/vgabios/ChangeLog Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/ChangeLog Fri Jul 18 12:12:41 2008 +0900
@@ -1,3 +1,207 @@ 2005-05-24 16:50 vruppert
+2008-05-11 08:40 vruppert
+
+ * biossums.c (1.6):
+
+ - fixed a warning
+
+2008-03-02 08:47 vruppert
+
+ * vbe.c (1.60):
+
+ - added debug message for unsupported VBE modes
+
+2008-02-24 09:18 vruppert
+
+ * vbe.c (1.59):
+
+ - in LFB modes the number of banks must be set to 1
+
+2008-01-27 10:44 vruppert
+
+ * Makefile (1.21), biossums.c (1.5), vgabios.c (1.67):
+
+ - added PCI data structure for the Cirrus VGABIOS images
+ - added support for the PCI data structure in biossums
+ - updated year in copyright
+
+2008-01-26 11:46 vruppert
+
+ * BUGS (1.4), Makefile (1.20), README (1.14), TODO (1.13),
vbe_display_api.txt (1.14):
+
+ - whitespace cleanup
+
+2006-11-26 10:43 vruppert
+
+ * Makefile (1.19):
+
+ - disable the generation of linemarkers by the preprocessor, since the
latest
+ versions of bcc don't like them
+
+2006-09-02 13:15 vruppert
+
+ * biossums.c (1.4):
+
+ - the biossums utility no longer modifies VGABIOS images with proper
checksum
+ and size
+
+2006-08-19 14:28 vruppert
+
+ * Changelog (1.26), README (1.13), TODO (1.12):
+
+ - updates for 0.6a release
+
+2006-08-19 09:39 vruppert
+
+ * vbe.c (1.58):
+
+ - improved VGA compatible setup for VBE modes (disable CGA and Hercules
+ compatible memory layout)
+
+2006-08-18 20:39 vruppert
+
+ * vbe.c (1.57):
+
+ - improved VGA compatible setup for >=8bpp VBE modes (CRTC doubleword
mode and
+ GRDC shift register setting added)
+ - now using symbolic name for CRTC address register
+
+2006-08-15 20:42 vruppert
+
+ * vbe.c (1.56), vbetables-gen.c (1.4):
+
+ - init 4bpp VBE modes by a temporary switch to VGA mode 0x6A
+ - all 4bpp VBE modes now enabled
+
+2006-08-14 20:24 vruppert
+
+ * vbe.c (1.55):
+
+ - VGA compatible setup for VBE modes improved (Bochs hack can be
removed now)
+
+2006-08-12 07:51 vruppert
+
+ * .cvsignore (1.1):
+
+ - .cvsignore added for auto-generated file
+
+2006-08-12 07:47 vruppert
+
+ * vbe.c (1.54), vbe.h (1.27), vbe_display_api.txt (1.13),
vbetables-gen.c (1.3):
+
+ - cleaned up VBE memory size definitions (removed duplicate defines,
main
+ definition now in vbetables-gen.c)
+
+2006-08-09 21:28 vruppert
+
+ * vbetables.h (1.30):
+
+ - removed auto-generated file
+
+2006-08-09 21:26 vruppert
+
+ * vbe.c (1.53), vbe.h (1.26), vbe_display_api.txt (1.12),
vbetables-gen.c (1.2),
+ vbetables.h (1.29):
+
+ - VBE video memory increased to 8 MB
+ - VBE dispi ID changed to B0C4
+ - documentation update
+
+2006-07-11 08:03 vruppert
+
+ * Makefile (1.18), vbetables-gen.c (1.1), vbetables.h (1.28):
+
+ - generate vbetables.h dynamicly
+ * initial patch from the qemu project by Fabrice Bellard
+ * only add modes that fit in video memory (still 4 MB)
+ * several other fixes (e.g. 4 bpp specific stuff, number of pages)
+
+2006-07-10 07:47 vruppert
+
+ * vgabios.c (1.66):
+
+ - biosfn_scroll(): check variable 'i' for underflowing when scrolling
downwards
+ to avoid screen corruption
+
+2006-07-10 07:47 vruppert
+
+ * vbe.c (1.52):
+
+ - VBE set bank functions failure handling added
+ - VBE get/set logical scan line length fixes for the 4bpp mode
+
+2006-07-08 13:27 vruppert
+
+ * vbe.c (1.51), vbetables.h (1.27):
+
+ - added special case for the 4 bpp when setting VBE display start
+ - VBE mode table fixes
+
+2006-07-07 13:30 vruppert
+
+ * clext.c (1.12):
+
+ - bank pointer must be set to 0 after a mode set
+
+2006-06-21 16:58 vruppert
+
+ * vbe.c (1.50), vbetables.h (1.26):
+
+ - improved VBE display capabilities check (X resulution checked now)
+ - removed obsolete defines (LFB always available, always generate
dynamic list)
+ - CR/LF to LF fixes
+
+2006-06-18 15:22 vruppert
+
+ * clext.c (1.11), vbe.c (1.49), vbe.h (1.25), vbetables.h (1.25),
vgabios.c
+ (1.65):
+
+ - applied patch from the qemu project (Fabrice Bellard)
+ * Cirrus SVGA now supports the "no clear" bit when switching to
Cirrus or
+ VESA mode
+ * Bochs VBE protected mode interface improved
+ * save/restore video state support for Bochs VBE and standard VGA
added
+ * Bochs VBE prepared for more modi
+
+2006-03-25 10:19 vruppert
+
+ * clext.c (1.10), vgabios.c (1.64), vgatables.h (1.10):
+
+ - applied patch from Fabrice Bellard
+ * added minimal support for the video parameter table (VPT)
+ * added Cirrus SVGA mode 0x7b (1600x1200x8)
+
+2005-12-26 19:50 vruppert
+
+ * vbe.c (1.48), vgabios.c (1.63):
+
+ - Bochs VBE protected mode interface added (based on a patch by
malc@xxxxxxxxxxxxx)
+
+2005-12-26 19:50 vruppert
+
+ * biossums.c (1.3):
+
+ - biossums utility now supports VGABIOS sizes up to 64 kBytes
+
+2005-09-21 18:45 vruppert
+
+ * vgatables.h (1.9):
+
+ - mode 0x11: all color planes must be enabled in this 2-color VGA mode
+
+2005-08-30 18:41 vruppert
+
+ * biossums.c (1.2):
+
+ - missing license text added in biossums.c
+
+2005-07-02 18:39 vruppert
+
+ * vgabios.c (1.62):
+
+ - BIOS configuration word usually reports initial mode 80x25 color text
+ - vgabios function 0x0e (write teletype): linefeed (0x0a) only
increments the
+ cursor row value
+
2005-05-24 16:50 vruppert
* vbe.c (1.47), vgabios.c (1.61):
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/Makefile
--- a/tools/firmware/vgabios/Makefile Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/Makefile Fri Jul 18 12:12:41 2008 +0900
@@ -21,7 +21,7 @@ cirrus-bios: vgabios-cirrus.bin vgabios-
.PHONY: clean
clean:
- rm -f biossums *.o *.s *.ld86 \
+ rm -f biossums vbetables-gen vbetables.h *.o *.s *.ld86 \
temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core
vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak
rm -f VGABIOS-lgpl-latest*.bin
@@ -37,7 +37,7 @@ release:
tar czvf ../$(RELEASE).tgz --exclude CVS -C .. $(RELEASE)/
vgabios.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c
vbetables.h
- $(GCC) -E -P vgabios.c $(VGABIOS_VERS) $(VGABIOS_DATE) > _vgabios_.c
+ $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DVBE $(VGABIOS_DATE) >
_vgabios_.c
$(BCC) -o vgabios.s -C-c -D__i86__ -S -0 _vgabios_.c
sed -e 's/^\.text//' -e 's/^\.data//' vgabios.s > _vgabios_.s
$(AS86) _vgabios_.s -b vgabios.bin -u -w- -g -0 -j -O -l vgabios.txt
@@ -47,7 +47,7 @@ vgabios.bin: biossums vgabios.c vgabios.
ls -l VGABIOS-lgpl-latest.bin
vgabios.debug.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h
vbe.c vbetables.h
- $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DDEBUG $(VGABIOS_DATE) >
_vgabios-debug_.c
+ $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DVBE -DDEBUG $(VGABIOS_DATE) >
_vgabios-debug_.c
$(BCC) -o vgabios-debug.s -C-c -D__i86__ -S -0 _vgabios-debug_.c
sed -e 's/^\.text//' -e 's/^\.data//' vgabios-debug.s >
_vgabios-debug_.s
$(AS86) _vgabios-debug_.s -b vgabios.debug.bin -u -w- -g -0 -j -O -l
vgabios.debug.txt
@@ -57,7 +57,7 @@ vgabios.debug.bin: biossums vgabios.c vg
ls -l VGABIOS-lgpl-latest.debug.bin
vgabios-cirrus.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h clext.c
- $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS $(VGABIOS_DATE) >
_vgabios-cirrus_.c
+ $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DPCIBIOS
$(VGABIOS_DATE) > _vgabios-cirrus_.c
$(BCC) -o vgabios-cirrus.s -C-c -D__i86__ -S -0 _vgabios-cirrus_.c
sed -e 's/^\.text//' -e 's/^\.data//' vgabios-cirrus.s >
_vgabios-cirrus_.s
$(AS86) _vgabios-cirrus_.s -b vgabios-cirrus.bin -u -w- -g -0 -j -O -l
vgabios-cirrus.txt
@@ -67,7 +67,7 @@ vgabios-cirrus.bin: biossums vgabios.c v
ls -l VGABIOS-lgpl-latest.cirrus.bin
vgabios-cirrus.debug.bin: biossums vgabios.c vgabios.h vgafonts.h vgatables.h
clext.c
- $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DCIRRUS_DEBUG
$(VGABIOS_DATE) > _vgabios-cirrus-debug_.c
+ $(GCC) -E -P vgabios.c $(VGABIOS_VERS) -DCIRRUS -DCIRRUS_DEBUG
-DPCIBIOS $(VGABIOS_DATE) > _vgabios-cirrus-debug_.c
$(BCC) -o vgabios-cirrus-debug.s -C-c -D__i86__ -S -0
_vgabios-cirrus-debug_.c
sed -e 's/^\.text//' -e 's/^\.data//' vgabios-cirrus-debug.s >
_vgabios-cirrus-debug_.s
$(AS86) _vgabios-cirrus-debug_.s -b vgabios-cirrus.debug.bin -u -w- -g
-0 -j -O -l vgabios-cirrus.debug.txt
@@ -78,3 +78,9 @@ vgabios-cirrus.debug.bin: biossums vgabi
biossums: biossums.c
$(CC) -o biossums biossums.c
+
+vbetables-gen: vbetables-gen.c
+ $(CC) -o vbetables-gen vbetables-gen.c
+
+vbetables.h: vbetables-gen
+ ./vbetables-gen > $@
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/README
--- a/tools/firmware/vgabios/README Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/README Fri Jul 18 12:12:41 2008 +0900
@@ -90,6 +90,34 @@ For any information on qemu, visit the w
History
-------
+vgabios-0.6b : May 30 2008
+ - Volker
+ . added PCI data structure for the Cirrus VGABIOS images
+ . minor bugfixes in biossums utility, VBE support and makefile
+
+vgabios-0.6a : Aug 19 2006
+ - Volker
+ . added minimal support for the video parameter table (VPT)
+ . Cirrus SVGA now supports the "no clear" bit in Cirrus and VESA mode
+ . Bochs VBE protected mode interface improved
+ . save/restore video state support for Bochs VBE and standard VGA added
+ . generate vbetables.h dynamicly
+ . VBE video memory increased to 8 MB (VBE dispi ID changed to B0C4)
+ . lots of 4bpp VBE fixes (all 4bpp VBE modes now enabled)
+ . VGA compatible setup for VBE modes added
+
+vgabios-0.5d : Dec 29 2005
+ - Volker
+ . Bochs VBE protected mode interface added (based on a patch by
malc@xxxxxxxxxxxxx)
+ . biossums utility now supports VGABIOS sizes up to 64 kBytes
+ . VGA mode 0x11: all color planes must be enabled in this 2-color VGA mode
+
+vgabios-0.5c : Jul 07 2005
+ - Volker
+ . BIOS configuration word usually reports initial mode 80x25 color text
+ . vgabios function 0x0e (write teletype): linefeed (0x0a) only increments
the
+ cursor row value
+
vgabios-0.5b : May 24 2005
- Volker
. fixed return value for the default case in the VBE section (non-debug
mode)
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/TODO
--- a/tools/firmware/vgabios/TODO Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/TODO Fri Jul 18 12:12:41 2008 +0900
@@ -6,13 +6,11 @@ General
- Add new functionalities and modify static functionality table
- Performance : 16 bits IO
-v0.6
- - Reimplement the tables so it is compatible with the video save pointer
table
+v0.7
- Implement the remaining functions (don't know if all are needed):
- chargen ax=1120, ax=1121, ax=1122, ax=1123, ax=1124
- display switch interface ah=12 bl=35
- video refresh control ah=12 bl=36
- - save/restore state ah=1c
- Graphic modes
v1.0
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/biossums.c
--- a/tools/firmware/vgabios/biossums.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/biossums.c Fri Jul 18 12:12:41 2008 +0900
@@ -1,25 +1,35 @@
/* biossums.c --- written by Eike W. for the Bochs BIOS */
/* adapted for the LGPL'd VGABIOS by vruppert */
+/* This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+ */
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
typedef unsigned char byte;
void check( int value, char* message );
-#define LEN_BIOS_DATA 0x8000
-#define MAX_OFFSET (LEN_BIOS_DATA - 1)
-
-
-#define BIOS_OFFSET 0x7FFF
+#define MAX_BIOS_DATA 0x10000
long chksum_bios_get_offset( byte* data, long offset );
byte chksum_bios_calc_value( byte* data, long offset );
byte chksum_bios_get_value( byte* data, long offset );
void chksum_bios_set_value( byte* data, long offset, byte value );
-
#define PMID_LEN 20
#define PMID_CHKSUM 19
@@ -28,33 +38,55 @@ byte chksum_pmid_get_value( byte* data,
byte chksum_pmid_get_value( byte* data, long offset );
void chksum_pmid_set_value( byte* data, long offset, byte value );
-
-byte bios_data[LEN_BIOS_DATA];
-
-
-int main( int argc, char* argv[] ) {
-
+#define PCIR_LEN 24
+
+long chksum_pcir_get_offset( byte* data, long offset );
+
+
+byte bios_data[MAX_BIOS_DATA];
+long bios_len;
+
+
+int main(int argc, char* argv[])
+{
FILE* stream;
- long offset, tmp_offset;
- byte cur_val = 0, new_val = 0;
- int hits;
-
-
- if( argc != 2 ) {
+ long offset, tmp_offset, pcir_offset;
+ byte bios_len_byte, cur_val = 0, new_val = 0;
+ int hits, modified;
+
+ if (argc != 2) {
printf( "Error. Need a file-name as an argument.\n" );
exit( EXIT_FAILURE );
}
- if(( stream = fopen( argv[1], "rb" )) == NULL ) {
- printf( "Error opening %s for reading.\n", argv[1] );
- exit( EXIT_FAILURE );
- }
- if( fread( bios_data, 1, LEN_BIOS_DATA, stream ) >= LEN_BIOS_DATA ) {
- printf( "Error reading max. 32767 Bytes from %s.\n", argv[1] );
- fclose( stream );
- exit( EXIT_FAILURE );
- }
- fclose( stream );
+ if ((stream = fopen(argv[1], "rb")) == NULL) {
+ printf("Error opening %s for reading.\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
+ memset(bios_data, 0, MAX_BIOS_DATA);
+ bios_len = fread(bios_data, 1, MAX_BIOS_DATA, stream);
+ if (bios_len > MAX_BIOS_DATA) {
+ printf("Error reading max. 65536 Bytes from %s.\n", argv[1]);
+ fclose(stream);
+ exit(EXIT_FAILURE);
+ }
+ fclose(stream);
+ modified = 0;
+ if (bios_len < 0x8000) {
+ bios_len = 0x8000;
+ modified = 1;
+ } else if ((bios_len & 0x1FF) != 0) {
+ bios_len = (bios_len + 0x200) & ~0x1FF;
+ modified = 1;
+ }
+ bios_len_byte = (byte)(bios_len / 512);
+ if (bios_len_byte != bios_data[2]) {
+ if (modified == 0) {
+ bios_len += 0x200;
+ }
+ bios_data[2] = (byte)(bios_len / 512);
+ modified = 1;
+ }
hits = 0;
offset = 0L;
@@ -67,44 +99,76 @@ int main( int argc, char* argv[] ) {
printf( "Calculated checksum: 0x%02X ", new_val );
hits++;
}
- if( hits == 1 && cur_val != new_val ) {
- printf( "Setting checksum." );
+ if ((hits == 1) && (cur_val != new_val)) {
+ printf("Setting checksum.");
chksum_pmid_set_value( bios_data, offset, new_val );
- }
- if( hits >= 2 ) {
+ if (modified == 0) {
+ bios_len += 0x200;
+ bios_data[2]++;
+ }
+ modified = 1;
+ }
+ if (hits >= 2) {
printf( "Multiple PMID entries! No checksum set." );
}
- if( hits ) {
- printf( "\n" );
- }
-
+ if (hits) {
+ printf("\n");
+ }
+
+ offset = 0L;
+ pcir_offset = chksum_pcir_get_offset( bios_data, offset );
+ if (pcir_offset != -1L) {
+ if (bios_data[pcir_offset + 16] != bios_data[2]) {
+ bios_data[pcir_offset + 16] = bios_data[2];
+ if (modified == 0) {
+ bios_len += 0x200;
+ bios_data[2]++;
+ bios_data[pcir_offset + 16]++;
+ }
+ modified = 1;
+ }
+ }
offset = 0L;
- offset = chksum_bios_get_offset( bios_data, offset );
- cur_val = chksum_bios_get_value( bios_data, offset );
- new_val = chksum_bios_calc_value( bios_data, offset );
- printf( "\nBios checksum at: 0x%4lX\n", offset );
- printf( "Current checksum: 0x%02X\n", cur_val );
- printf( "Calculated checksum: 0x%02X ", new_val );
- if( cur_val != new_val ) {
- printf( "Setting checksum." );
- chksum_bios_set_value( bios_data, offset, new_val );
- }
- printf( "\n" );
-
-
- if(( stream = fopen( argv[1], "wb" )) == NULL ) {
- printf( "Error opening %s for writing.\n", argv[1] );
- exit( EXIT_FAILURE );
- }
- if( fwrite( bios_data, 1, LEN_BIOS_DATA, stream ) < LEN_BIOS_DATA ) {
- printf( "Error writing 32KBytes to %s.\n", argv[1] );
- fclose( stream );
- exit( EXIT_FAILURE );
- }
- fclose( stream );
-
- return( EXIT_SUCCESS );
+ do {
+ offset = chksum_bios_get_offset(bios_data, offset);
+ cur_val = chksum_bios_get_value(bios_data, offset);
+ new_val = chksum_bios_calc_value(bios_data, offset);
+ if ((cur_val != new_val) && (modified == 0)) {
+ bios_len += 0x200;
+ bios_data[2]++;
+ if (pcir_offset != -1L) {
+ bios_data[pcir_offset + 16]++;
+ }
+ modified = 1;
+ } else {
+ printf("\nBios checksum at: 0x%4lX\n", offset);
+ printf("Current checksum: 0x%02X\n", cur_val);
+ printf("Calculated checksum: 0x%02X ", new_val);
+ if (cur_val != new_val) {
+ printf("Setting checksum.");
+ chksum_bios_set_value(bios_data, offset, new_val);
+ cur_val = new_val;
+ modified = 1;
+ }
+ printf( "\n" );
+ }
+ } while (cur_val != new_val);
+
+ if (modified == 1) {
+ if ((stream = fopen( argv[1], "wb")) == NULL) {
+ printf("Error opening %s for writing.\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
+ if (fwrite(bios_data, 1, bios_len, stream) < bios_len) {
+ printf("Error writing %d KBytes to %s.\n", bios_len / 1024, argv[1]);
+ fclose(stream);
+ exit(EXIT_FAILURE);
+ }
+ fclose(stream);
+ }
+
+ return (EXIT_SUCCESS);
}
@@ -119,7 +183,7 @@ void check( int okay, char* message ) {
long chksum_bios_get_offset( byte* data, long offset ) {
- return( BIOS_OFFSET );
+ return (bios_len - 1);
}
@@ -129,7 +193,7 @@ byte chksum_bios_calc_value( byte* data,
byte sum;
sum = 0;
- for( i = 0; i < MAX_OFFSET; i++ ) {
+ for( i = 0; i < offset; i++ ) {
sum = sum + *( data + i );
}
sum = -sum; /* iso ensures -s + s == 0 on unsigned types */
@@ -139,13 +203,13 @@ byte chksum_bios_calc_value( byte* data,
byte chksum_bios_get_value( byte* data, long offset ) {
- return( *( data + BIOS_OFFSET ) );
+ return( *( data + offset ) );
}
void chksum_bios_set_value( byte* data, long offset, byte value ) {
- *( data + BIOS_OFFSET ) = value;
+ *( data + offset ) = value;
}
@@ -156,7 +220,7 @@ byte chksum_pmid_calc_value( byte* data,
byte sum;
len = PMID_LEN;
- check( offset + len <= MAX_OFFSET, "PMID entry length out of bounds" );
+ check((offset + len) <= (bios_len - 1), "PMID entry length out of bounds" );
sum = 0;
for( i = 0; i < len; i++ ) {
if( i != PMID_CHKSUM ) {
@@ -172,7 +236,7 @@ long chksum_pmid_get_offset( byte* data,
long result = -1L;
- while( offset + PMID_LEN < MAX_OFFSET ) {
+ while ((offset + PMID_LEN) < (bios_len - 1)) {
offset = offset + 1;
if( *( data + offset + 0 ) == 'P' && \
*( data + offset + 1 ) == 'M' && \
@@ -188,13 +252,31 @@ long chksum_pmid_get_offset( byte* data,
byte chksum_pmid_get_value( byte* data, long offset ) {
- check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" );
+ check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of
bounds" );
return( *( data + offset + PMID_CHKSUM ) );
}
void chksum_pmid_set_value( byte* data, long offset, byte value ) {
- check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" );
+ check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of
bounds" );
*( data + offset + PMID_CHKSUM ) = value;
}
+
+
+long chksum_pcir_get_offset( byte* data, long offset ) {
+
+ long result = -1L;
+
+ while ((offset + PCIR_LEN) < (bios_len - 1)) {
+ offset = offset + 1;
+ if( *( data + offset + 0 ) == 'P' && \
+ *( data + offset + 1 ) == 'C' && \
+ *( data + offset + 2 ) == 'I' && \
+ *( data + offset + 3 ) == 'R' ) {
+ result = offset;
+ break;
+ }
+ }
+ return( result );
+}
diff -r eb0fc71cfc72 -r 400e5d4877ca tools/firmware/vgabios/clext.c
--- a/tools/firmware/vgabios/clext.c Tue Jul 08 11:41:43 2008 +0900
+++ b/tools/firmware/vgabios/clext.c Fri Jul 18 12:12:41 2008 +0900
@@ -239,6 +239,21 @@ 0xffff
0xffff
};
+/* 1600x1200x8 */
+unsigned short cseq_1600x1200x8[] = {
+0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
+0x760b,0x760c,0x760d,0x760e,
+0x0412,0x0013,0x2017,
+0x341b,0x341c,0x341d,0x341e,
+0xffff
+};
+unsigned short ccrtc_1600x1200x8[] = {
+0x2911,0xc300,0x9f01,0x9f02,0x8603,0x8304,0x9405,0x2406,0xf707,
+0x6009,0x000c,0x000d,
+0x0310,0xff12,0xa013,0x4014,0xff15,0x2416,0xc317,0xff18,
+0x001a,0x221b,0x001d,
+0xffff
+};
cirrus_mode_t cirrus_modes[] =
{
@@ -291,6 +306,10 @@ cirrus_mode_t cirrus_modes[] =
{0x75,1280,1024,16,0xe1,
cseq_1280x1024x16,cgraph_svgacolor,ccrtc_1280x1024x16,16,
6,5,11,6,5,5,0,0,0},
+
+ {0x7b,1600,1200,8,0x00,
+ cseq_1600x1200x8,cgraph_svgacolor,ccrtc_1600x1200x8,8,
+ 4,0,0,0,0,0,0,0,0},
{0xfe,0,0,0,0,cseq_vga,cgraph_vga,ccrtc_vga,0,
0xff,0,0,0,0,0,0,0,0},
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|