Initial syborg (baseport) and documentation import
authormartin.trojer@nokia.com
Fri, 31 Jul 2009 14:43:15 +0100
changeset 0 ffa851df0825
child 1 2fb8b9db1c86
Initial syborg (baseport) and documentation import
README.txt
baseport/src/cedar/generic/base/syborg/armv5.mbc
baseport/src/cedar/generic/base/syborg/armv5test.mbc
baseport/src/cedar/generic/base/syborg/base.iby
baseport/src/cedar/generic/base/syborg/bld.inf
baseport/src/cedar/generic/base/syborg/bootstrap/syborg.inc
baseport/src/cedar/generic/base/syborg/bootstrap/syborg.s
baseport/src/cedar/generic/base/syborg/config.inc
baseport/src/cedar/generic/base/syborg/eabi/kasyborg.def
baseport/src/cedar/generic/base/syborg/estart.txt
baseport/src/cedar/generic/base/syborg/ethernet/pdd/enet.mmp
baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet.cpp
baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.cpp
baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.h
baseport/src/cedar/generic/base/syborg/ethernet/test/ethernet_test.cpp
baseport/src/cedar/generic/base/syborg/ethernet/test/ethernet_test.mmp
baseport/src/cedar/generic/base/syborg/fb/fb.mmp
baseport/src/cedar/generic/base/syborg/fb/syborg_fb.cpp
baseport/src/cedar/generic/base/syborg/fb/syborg_fb.h
baseport/src/cedar/generic/base/syborg/hal/config.hcf
baseport/src/cedar/generic/base/syborg/hal/hal.mmp
baseport/src/cedar/generic/base/syborg/hal/values.hda
baseport/src/cedar/generic/base/syborg/kasyborg.mmp
baseport/src/cedar/generic/base/syborg/keyboard/keyboard.mmp
baseport/src/cedar/generic/base/syborg/keyboard/syborg_keyboard.cpp
baseport/src/cedar/generic/base/syborg/keyboard/syborg_keyboard.h
baseport/src/cedar/generic/base/syborg/keymap/keymap.cpp
baseport/src/cedar/generic/base/syborg/keymap/keymap.mmp
baseport/src/cedar/generic/base/syborg/monitor/monap.mmp
baseport/src/cedar/generic/base/syborg/monitor/monitor.cpp
baseport/src/cedar/generic/base/syborg/pointer/pointer.mmp
baseport/src/cedar/generic/base/syborg/pointer/syborg_pointer.cpp
baseport/src/cedar/generic/base/syborg/pointer/syborg_pointer.h
baseport/src/cedar/generic/base/syborg/rom/base_syborg.iby
baseport/src/cedar/generic/base/syborg/rom/header.iby
baseport/src/cedar/generic/base/syborg/rom/kernel.iby
baseport/src/cedar/generic/base/syborg/serial/serial.mmp
baseport/src/cedar/generic/base/syborg/serial/syborg_serial.cpp
baseport/src/cedar/generic/base/syborg/serial/syborg_serial.h
baseport/src/cedar/generic/base/syborg/specific/assp.cpp
baseport/src/cedar/generic/base/syborg/specific/highrestimer.h
baseport/src/cedar/generic/base/syborg/specific/interrupts.cia
baseport/src/cedar/generic/base/syborg/specific/interrupts.cpp
baseport/src/cedar/generic/base/syborg/specific/syborg.cfg
baseport/src/cedar/generic/base/syborg/specific/syborg.cia
baseport/src/cedar/generic/base/syborg/specific/syborg.cpp
baseport/src/cedar/generic/base/syborg/specific/syborg.h
baseport/src/cedar/generic/base/syborg/specific/syborg_priv.h
baseport/src/cedar/generic/base/syborg/specific/system.h
baseport/src/cedar/generic/base/syborg/specific/system_priv.h
baseport/src/cedar/generic/base/syborg/specific/variantmediadef.h
baseport/src/cedar/generic/base/syborg/svphostfs/driver/stringops.c
baseport/src/cedar/generic/base/syborg/svphostfs/driver/svphostfsdriver.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/driver/svphostfsdriver.h
baseport/src/cedar/generic/base/syborg/svphostfs/fs/rsvphostfsdriver.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphost.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostdir.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfil.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsstart.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsy.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsy.h
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostmain.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostmnt.cpp
baseport/src/cedar/generic/base/syborg/svphostfs/inc/rsvphostfsdriver.h
baseport/src/cedar/generic/base/syborg/svphostfs/svphostfs.mmp
baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsdriver.mmp
baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsstart.mmp
baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsy.mmp
baseport/src/cedar/generic/base/syborg/svpplatform/fdt.mmp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/Makefile.libfdt
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/TODO
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/bswap.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/config-host.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_ro.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_ro.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_rw.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_rw.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_strerror.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_strerror.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_sw.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_sw.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_wip.c
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_wip.cpp
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt_env.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt_internal.h
baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/patch.libfdt
baseport/src/cedar/generic/base/syborg/svpsnapdriver/snapapp.mmp
baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/rsvpsnapdriver.cpp
baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/rsvpsnapdriver.h
baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/snapapp.cpp
baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/svpsnapdriver.cpp
baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/svpsnapdriver.h
baseport/src/cedar/generic/base/syborg/svpsnapdriver/svpsnapdriver.mmp
baseport/src/cedar/generic/base/syborg/syborg-elf.cfg
baseport/src/cedar/generic/base/syborg/syborg.dtb
baseport/src/cedar/generic/base/syborg/syborg.dts
baseport/src/cedar/generic/base/syborg/syborg.oby
baseport/src/cedar/generic/base/syborg/test/ABLD.BAT
baseport/src/cedar/generic/base/syborg/test/autoexec.bat
baseport/src/cedar/generic/base/syborg/test/bld.inf
baseport/src/cedar/generic/base/syborg/test/variant_test.mmh
baseport/src/cedar/generic/base/syborg/trk_l1.ini
baseport/src/cedar/generic/base/syborg/variant.mmh
docs/svp-docs.pdf
docs/wiki/Alternative Stop-mode Debugging.doc
docs/wiki/Armv7.doc
docs/wiki/Building ROMS with syborg.doc
docs/wiki/Building the SVP.doc
docs/wiki/ELF4ROM.doc
docs/wiki/Ethernet Virtio.doc
docs/wiki/Flexible Memory Model.doc
docs/wiki/How to create Symbian peripherals with Qemu.doc
docs/wiki/Run-mode Debugging.doc
docs/wiki/SVP Host Filesystem.doc
docs/wiki/Snapshots.doc
docs/wiki/Stop-mode Debugging.doc
docs/wiki/Using the SVP.doc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.txt	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,19 @@
+This is repo contains the following; 
+
+baseport/
+	The baseport (BSP) needed to run Symbian OS in QEMU
+
+docs/
+	Various documentation about the baseport, peripherals and how to use QEMU.
+	The wiki folders contains a dump from Wiki documentation, this the unfortunate .doc format.
+
+symbian-qemu-0.9.1-12/
+	A version of QEMU with some extra features not yet available in the QEMU mainline.
+
+Some notes;
+
+* The baseport source layout (in the current initial contribution) follows the old Symbian (v9.5) structure. This needs to be changed to work in a Symbian foundation structure. What this space for updates.
+
+* Even though a version of QEMU is supplied, the TOT version of QEMU should be usable. The QEMU version is supplied here to share some the extra features not yet available in mainline QEMU. Most noticeable the support for Python peripherals (and binary separation of QEMU and its peripheral) and the skinning support to supply a landing zone for phone specific buttons etc.
+
+* Throughout the documentation the SVP is referenced. SVP stands for the "Symbian Virtual Platform" and this was the proposed product name of the QEMU based simulator. For the purpose of this document treat the SVP as QEMU with the syborg board models.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/armv5.mbc	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+SECTION_COMMANDS
+
+bldmake bldfiles armv5
+abld export
+
+abld makefile armv5
+abld reallyclean armv5
+
+bldmake bldfiles armv5
+abld export
+
+abld makefile armv5
+abld library armv5
+abld -k target armv5
+
+SECTION_DIRS
+..\e32utils\group
+..\e32
+..\e32\compsupp
+..\f32\group
+..\hal
+..\syborg
+..\domain\group
+
+..\e32\drivers\pbus\mmc\sdcard\sdcard3c
+..\e32\drivers\pbus\mmc\sdcard\sdcard4c
+
+..\e32\drivers\usbho
+..\e32\drivers\usbho\usbd
+
+..\e32\drivers\bsp
+..\e32\drivers\debug
+..\e32\drivers\ecomm
+..\e32\drivers\esound
+..\e32\drivers\ethernet
+..\e32\drivers\locmedia
+..\e32\drivers\media
+..\e32\drivers\trace
+..\e32\drivers\usbc
+..\e32\euser
+..\e32\ewsrv
+
+..\f32\estart
+..\f32\etshell
+..\f32\iso9660
+..\f32\ntfs
+..\f32\scomp
+..\f32\sfat
+..\f32\sfat32
+..\f32\sftl
+..\f32\slffs
+..\f32\smassstorage
+..\f32\srofs
+..\f32\srom
+
+..\e32test\group
+..\syborg\test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/armv5test.mbc	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+SECTION_COMMANDS
+
+bldmake bldfiles armv5
+abld export
+abld test export
+
+abld makefile armv5
+abld test makefile armv5
+abld reallyclean armv5
+abld test reallyclean armv5
+
+bldmake bldfiles armv5
+abld export
+
+abld makefile armv5
+abld test makefile armv5
+abld library armv5
+abld test library armv5
+abld -k target armv5
+abld test -k target armv5
+
+SECTION_DIRS
+..\e32test\group
+..\syborg\test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/base.iby	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,116 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __BASE_IBY__
+#define __BASE_IBY__
+
+REM Base operating system, including all assp-specific files
+
+#if defined(__MISA__)
+#include <base_assabet.iby>
+#elif defined(__MI920__)
+#include <base_integrator920.iby>
+#elif defined(__NI1136__)
+#include <base_integrator1136.iby>
+#elif defined(__MCOT__)
+#include <base_lubbock.iby>
+#elif defined(__TEMPLATE__)
+#include <base_template.iby>
+#elif defined(__MOMAP16XX_H2__)
+#include <base_h2.iby>
+#elif defined(__MOMAP24XX_H4HRP__)
+#include <base_h4hrp.iby>
+#elif defined(__X86PCHRP__)
+#include <base_x86pc.iby>
+#elif defined(__NE1_TB__)
+#include <base_ne1_tb.iby>
+#elif defined(__SYBORG__)
+#include <base_syborg.iby>
+#endif
+
+#include <compsupp.iby>
+
+file=ABI_DIR\DEBUG_DIR\EUSER_DLL							\sys\bin\EUser.dll
+file=ABI_DIR\DEBUG_DIR\RPIPE.DLL							\sys\bin\rpipe.dll
+
+file=ABI_DIR\DEBUG_DIR\ektran.dll							\sys\bin\EKTran.dll
+file=ABI_DIR\DEBUG_DIR\HAL_DLL								\sys\bin\Hal.dll
+
+#ifndef SYMBIAN_EXCLUDE_KEYMAP
+file=ABI_DIR\DEBUG_DIR\KEYMAP_FILE.dll						\sys\bin\EKData.dll
+#endif //SYMBIAN_EXCLUDE_KEYMAP
+
+secondary=ABI_DIR\DEBUG_DIR\efile.exe						\sys\bin\efile.exe  FIXED HEAPMAX(0x40000)
+file=ABI_DIR\DEBUG_DIR\efsrv.dll							\sys\bin\EFSrv.dll
+
+#ifndef CUSTOM_ELOCAL
+#ifdef WITH_FAT32
+file=ABI_DIR\DEBUG_DIR\efat32.fsy							\sys\bin\ELocal.fsy
+#else
+file=ABI_DIR\DEBUG_DIR\elocal.fsy							\sys\bin\ELocal.fsy
+#endif
+#endif
+
+#ifdef WITH_LFFS
+file=ABI_DIR\DEBUG_DIR\elffs.fsy							\sys\bin\ELffs.fsy
+#endif
+
+#ifdef WITH_NAND
+file=ABI_DIR\BUILD_DIR\nandftl.fxt							\sys\bin\nandftl.fxt
+file=ABI_DIR\BUILD_DIR\ecomp.fsy							\sys\bin\ecomp.fsy
+file=ABI_DIR\BUILD_DIR\erofs.fsy							\sys\bin\erofs.fsy
+#endif
+
+#ifdef WITH_NAND2
+file=ABI_DIR\BUILD_DIR\ecomp.fsy							\sys\bin\ecomp.fsy
+file=ABI_DIR\BUILD_DIR\erofs.fsy							\sys\bin\erofs.fsy
+#endif
+
+#ifdef WITH_ISO9660
+file=ABI_DIR\DEBUG_DIR\iso9660.fsy							\sys\bin\Iso9660.fsy
+#endif
+
+#ifdef WITH_NTFS
+file=ABI_DIR\DEBUG_DIR\ntfs.fsy								\sys\bin\Ntfs.fsy
+#endif
+
+#ifdef WITH_MASS_STORAGE
+file=ABI_DIR\DEBUG_DIR\msfs.fsy								\sys\bin\msfs.fsy
+#endif
+
+file=ABI_DIR\DEBUG_DIR\ESTART_EXE							\sys\bin\EStart.exe	HEAPMAX(0x10000)
+
+file=ABI_DIR\DEBUG_DIR\domainSrv.exe						\sys\bin\domainSrv.exe
+file=ABI_DIR\DEBUG_DIR\domainCli.dll						\sys\bin\domainCli.dll
+file=ABI_DIR\DEBUG_DIR\domainPolicy.dll						\sys\bin\domainPolicy.dll
+
+#if defined(_NAND) || defined(_NAND2)
+#if !defined PAGED_ROM || defined EFFICIENT_ROM_PAGING || defined CODE_PAGING_FROM_ROFS
+REM Start of ROFS image
+ROM_IMAGE[1] {
+#endif
+#endif
+
+#ifndef SYMBIAN_EXCLUDE_D_EXC
+file=ABI_DIR\DEBUG_DIR\d_exc.exe							\sys\bin\d_exc.exe
+#endif //SYMBIAN_EXCLUDE_D_EXC
+
+#ifndef SYMBIAN_EXCLUDE_SCDV
+file=ABI_DIR\DEBUG_DIR\SCDV_DLL								\sys\bin\ScDv.dll
+#endif // SYMBIAN_EXCLUDE_SCDV
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/bld.inf	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+PRJ_PLATFORMS
+ARMV5
+
+PRJ_EXPORTS
+syborg.oby						\epoc32\rom\include\	//
+base.iby						\epoc32\rom\include\	//
+rom\base_syborg.iby				\epoc32\rom\include\	//
+rom\header.iby					\epoc32\rom\syborg\		//
+rom\kernel.iby					\epoc32\rom\syborg\		//
+specific\syborg.cfg				\epoc32\rom\syborg\		//
+estart.txt						\epoc32\rom\syborg\		//
+trk_l1.ini						\epoc32\data\Z\trk\trk_syborg.ini
+
+PRJ_EXTENSIONS
+start		extension		base/genexec
+option		EXTRA_SRC_PATH  $(TO_BLDINF)/../e32/kernel
+end
+
+PRJ_MMPFILES
+..\e32\kernel\ekern
+..\e32\kernel\kc_exe
+..\e32\kernel\exmoncommon
+..\e32\drivers\medint\medint
+..\f32\etshell\eshell
+..\e32\drivers\trace\btracex
+..\e32\euser\variant_euser
+
+// SYBORG components
+kasyborg						// Variant library
+serial\serial					// Serial / UART ports
+fb\fb							// Framebuffer
+keyboard\keyboard				// Keyboard
+pointer\pointer					// Pointer
+monitor\monap					// Crash Debugger output
+
+keymap\keymap					// Key mapping library
+
+// platform device library - for flattened device tree (FDT)
+svpplatform\fdt
+
+//Host Filesystem
+svphostfs\svphostfs
+svphostfs\svphostfsdriver
+svphostfs\svphostfsstart
+svphostfs\svphostfsy
+
+//Snap Device
+svpsnapdriver\svpsnapdriver
+svpsnapdriver\snapapp
+
+PRJ_EXTENSIONS
+start		extension		base/config
+option		PREFIX			_syborg_
+option		HALPATH			$(TO_BLDINF)/..
+option		SOURCE			$(TO_BLDINF)/hal
+end
+
+PRJ_MMPFILES
+hal\hal
+
+PRJ_EXTENSIONS
+start		extension		base/bootstrap
+option		NAME			_syborg_bootloader_bootrom
+option		MEMMODEL		multiple
+//option		MEMMODEL		flexible
+//option		MEMMODEL		moving
+option		SOURCES			syborg.s
+option		INCLUDES		config.inc syborg.inc
+option		E32PATH			$(TO_BLDINF)/..
+option		EXTRA_INC_PATH	$(TO_BLDINF)/bootstrap
+option		EXTRA_SRC_PATH	$(TO_BLDINF)/bootstrap 
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/bootstrap/syborg.inc	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,77 @@
+;/*
+;* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+;* All rights reserved.
+;* This component and the accompanying materials are made available
+;* under the terms of the License "Eclipse Public License v1.0"
+;* which accompanies this distribution, and is available
+;* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;*
+;* Initial Contributors:
+;* Nokia Corporation - initial contribution.
+;*
+;* Contributors:
+;*
+;* Description:
+;*
+;*/
+
+;---------------------------------------------------------------------------
+;  Physical Addresses of Memory                                             
+;---------------------------------------------------------------------------
+
+KHwRamBaseAddr		EQU    0x00000000
+KHwRamSizeMb            EQU    128			; 128MB
+
+KHwNorFlashBaseAddr     EQU    0x40000000
+KHwNorFlashSize         EQU    0x04000000   ; 64MB
+KHwNorFlashCodeSize     EQU    0x02000000   ; 32MB for code, 32MB for LFFS
+
+;---------------------------------------------------------------------------
+;  Physical Addresses of Peripherals
+;---------------------------------------------------------------------------
+
+KHwBaseRegisters	EQU     0xC0000000
+
+KHwBaseSic		EQU	KHwBaseRegisters + 0x00000
+KHwBaseRtc		EQU	KHwBaseRegisters + 0x01000
+KHwBaseTimer		EQU	KHwBaseRegisters + 0x02000
+KHwBaseKmiKeyboard	EQU     KHwBaseRegisters + 0x03000
+KHwBaseKmiPointer	EQU     KHwBaseRegisters + 0x04000
+KHwBaseClcd		EQU	KHwBaseRegisters + 0x05000
+KHwBaseUart0		EQU	KHwBaseRegisters + 0x06000
+KHwBaseUart1		EQU	KHwBaseRegisters + 0x07000
+KHwBaseUart2		EQU	KHwBaseRegisters + 0x08000
+KHwBaseUart3		EQU     KHwBaseRegisters + 0x09000
+KHwBaseHostFs		EQU     KHwBaseRegisters + 0x0a000
+KHwBaseSnap		EQU     KHwBaseRegisters + 0x0b000
+KHwBaseNet		EQU     KHwBaseRegisters + 0x0c000
+KHwBaseNand		EQU     KHwBaseRegisters + 0x0d000
+KHwBaseAudio		EQU     KHwBaseRegisters + 0x0e000
+KHwBasePlatform		EQU     KHwBaseRegisters + 0x0f000
+;-----------------------------------------------------------------------------
+; Module linear bases
+;-----------------------------------------------------------------------------
+
+; Register group linear separation: 4K
+KHwLinSeparation	EQU	0x1000
+
+KHwLinBaseRegisters	EQU	KPrimaryIOBase
+
+KHwLinBaseSic		EQU	KHwLinBaseRegisters + 0x00*KHwLinSeparation
+KHwLinBaseRtc		EQU	KHwLinBaseRegisters + 0x01*KHwLinSeparation
+KHwLinBaseTimer		EQU	KHwLinBaseRegisters + 0x02*KHwLinSeparation
+KHwLinBaseKmiKeyboard	EQU	KHwLinBaseRegisters + 0x03*KHwLinSeparation   
+KHwLinBaseKmiPointer    EQU	KHwLinBaseRegisters + 0x04*KHwLinSeparation
+KHwLinBaseClcd		EQU	KHwLinBaseRegisters + 0x05*KHwLinSeparation
+KHwLinBaseUart0		EQU	KHwLinBaseRegisters + 0x06*KHwLinSeparation
+KHwLinBaseUart1		EQU	KHwLinBaseRegisters + 0x07*KHwLinSeparation
+KHwLinBaseUart2		EQU	KHwLinBaseRegisters + 0x08*KHwLinSeparation
+KHwLinBaseUart3		EQU	KHwLinBaseRegisters + 0x09*KHwLinSeparation
+KHwLinBaseHostFs	EQU	KHwLinBaseRegisters + 0x0a*KHwLinSeparation
+KHwLinBaseSnap		EQU	KHwLinBaseRegisters + 0x0b*KHwLinSeparation
+KHwLinBaseNet		EQU	KHwLinBaseRegisters + 0x0c*KHwLinSeparation
+KHwLinBaseNand		EQU	KHwLinBaseRegisters + 0x0d*KHwLinSeparation
+KHwLinBaseAudio		EQU	KHwLinBaseRegisters + 0x0e*KHwLinSeparation
+KHwLinBasePlatform	EQU	KHwLinBaseRegisters + 0x0f*KHwLinSeparation
+	
+	END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/bootstrap/syborg.s	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,603 @@
+;/*
+;* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+;* All rights reserved.
+;* This component and the accompanying materials are made available
+;* under the terms of the License "Eclipse Public License v1.0"
+;* which accompanies this distribution, and is available
+;* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;*
+;* Initial Contributors:
+;* Nokia Corporation - initial contribution.
+;*
+;* Contributors:
+;*
+;* Description:
+;*
+;*/
+		
+		GBLL	__VARIANT_S__       ; indicates that this is platform-specific code
+		GBLL	__SYBORG_S__		; indicates which source file this is
+
+		INCLUDE	bootcpu.inc
+		INCLUDE syborg.inc
+;
+;*******************************************************************************
+;
+        IMPORT	ResetEntry
+;
+;*******************************************************************************
+;
+        AREA |Boot$$Code|, CODE, READONLY, ALIGN=6
+;
+;*******************************************************************************
+; Initialise Hardware
+;	Determine the hardware configuration
+;	Determine the reset reason. If it is wakeup from a low power mode, perform
+;		whatever reentry sequence is required and jump back to the kernel.
+;	Set up the memory controller so that at least some RAM is available
+;	Set R10 to point to the super page or to a temporary version of the super page
+;		with at least the following fields valid:
+;		iBootTable, iCodeBase, iActiveVariant, iCpuId
+;	Initialise the debug serial port
+;
+; Enter with:
+;	R12 points to TRomHeader
+;	NO STACK
+;	R14 = return address (as usual)
+;
+; All registers may be modified by this call
+;*******************************************************************************
+	EXPORT	InitialiseHardware
+InitialiseHardware	ROUT
+		mov		r13, lr							    ; save return address
+
+		adrl	r1, ParameterTable	        ; pass address of parameter table
+		bl		InitCpu				        ; initialise CPU/MMU registers
+						
+;*******************************************************************************
+; DoInitialise Hardware
+;	Initialise CPU registers
+;	Determine the hardware configuration
+;	Determine the reset reason. If it is wakeup from a low power mode, perform
+;		whatever reentry sequence is required and jump back to the kernel.
+;	Set up the memory controller so that at least some RAM is available
+;	Set R10 to point to the super page or to a temporary version of the super page
+;		with at least the following fields valid:
+;		iBootTable, iCodeBase, iActiveVariant, iCpuId
+;	In debug builds initialise the debug serial port
+;
+; Enter with:
+;	R12 points to TRomHeader
+;	NO STACK
+;	R13 = return address (as usual)
+;
+; All registers may be modified by this call
+;*******************************************************************************
+DoInitialiseHardware	ROUT
+		
+; Hardware memory size is 128MB - 32MB reserved for bootloader
+		mov		r4, #KHwRamSizeMb
+
+		bl		InitDebugPort
+
+		ldr		r7, =CFG_HWVD					; variant number
+
+		lsl		r10, r4, #20				    ; R10 = top of RAM
+		sub		r10, #0x2000				    ; put super page at end for now
+
+; Set up the required super page values
+		str		r7, [r10, #SSuperPageBase_iActiveVariant]
+
+		mov		r1, #0
+		str		r1, [r10, #SSuperPageBase_iHwStartupReason]	; reset reason (from hardware)
+
+		add		r1, r10, #CpuPageOffset
+		str		r1, [r10, #SSuperPageBase_iMachineData]
+		bl		GetBootTableAddress
+		str		r0, [r10, #SSuperPageBase_iBootTable]		; set the boot function table
+		str		r12, [r10, #SSuperPageBase_iCodeBase]		; set the base address of bootstrap code
+		mrc		p15, 0, r0, c0, c0, 0						; read CPU ID from CP15 (remove if no CP15)
+		str		r0, [r10, #SSuperPageBase_iCpuId]
+
+		mov		r0, r13
+		add		sp, r10, #CpuBootStackTop		            ; set up a boot stack
+		push    {r0}						                ; save return address
+		bl		DoInitHw2						            ; any extra CPU-dependent stuff
+				
+		ldr		r7, [r10, #SSuperPageBase_iActiveVariant]
+		DWORD	r7, "ActiveVariant"
+
+		pop     {pc}						                ; return
+
+;*******************************************************************************
+DoInitHw2	ROUT
+		mrc		p15, 0, r0, c0, c0, 0
+		DWORD	r0, "MMUID"
+		mrc		p15, 0, r0, c0, c0, 1
+		DWORD	r0, "CacheType"
+		mrc		p15, 0, r0, c0, c0, 2
+		DWORD	r0, "TCMType"
+		mrc		p15, 0, r0, c0, c0, 3
+		DWORD	r0, "TLBType"
+        bx      lr
+
+;*******************************************************************************
+; Get a pointer to the list of hardware banks
+;
+; The pointer returned should point to a list of hardware banks declared with
+; the HW_MAPPING and/or HW_MAPPING_EXT macros. A zero word terminates the list.
+; For the direct memory model, all hardware on the system should be mapped here
+; and the mapping will set linear address = physical address.
+; For the moving or multiple model, only the hardware required to boot the kernel
+; and do debug tracing needs to be mapped here. The linear addresses used will
+; start at KPrimaryIOBase and step up as required with the order of banks in
+; the list being maintained in the linear addresses used.
+;
+; HW_MAPPING PB, SIZE, MULT
+;	This declares a block of I/O with physical base PB and address range SIZE
+;	blocks each of which has a size determined by MULT. The page size used for
+;	the mapping is determined by MULT. The linear address base of the mapping
+;	will be the next free linear address rounded up to the size specified by
+;	MULT.
+;	The permissions used for the mapping are the standard I/O permissions (BTP_Hw).
+;
+; HW_MAPPING_EXT PB, SIZE, MULT
+;	This declares a block of I/O with physical base PB and address range SIZE
+;	blocks each of which has a size determined by MULT. The page size used for
+;	the mapping is determined by MULT. The linear address base of the mapping
+;	will be the next free linear address rounded up to the size specified by
+;	MULT.
+;	The permissions used for the mapping are determined by a BTP_ENTRY macro
+;	immediately following this macro in the HW bank list or by a DCD directive
+;	specifying a different standard permission type.
+;
+; Configurations without an MMU need not implement this function.
+;
+; Enter with :
+;		R10 points to super page
+;		R12 points to ROM header
+;		R13 points to valid stack
+;
+; Leave with :
+;		R0 = pointer
+;		Nothing else modified
+;*******************************************************************************
+	EXPORT	GetHwBanks
+GetHwBanks	ROUT
+		adr		r0, %FT1
+		bx      lr
+1
+		HW_MAPPING		KHwBaseSic,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseRtc,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseTimer,			1,	HW_MULT_4K	
+		HW_MAPPING		KHwBaseKmiKeyboard,		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseKmiPointer,		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseClcd,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseUart0,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseUart1,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseUart2,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseUart3,    		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseHostFs,    		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseSnap,    		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseNet,			1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseNand,    		1,	HW_MULT_4K
+		HW_MAPPING		KHwBaseAudio,    		1,	HW_MULT_4K
+		HW_MAPPING		KHwBasePlatform,    		8,	HW_MULT_4K
+	
+		DCD     0   ; terminator
+
+;*******************************************************************************
+; Notify an unrecoverable error during the boot process
+;
+; Enter with:
+;	R14 = address at which fault detected
+;
+; Don't return
+;*******************************************************************************
+	EXPORT	Fault
+Fault	ROUT
+		b		BasicFaultHandler	; generic handler dumps registers via debug
+									; serial port
+
+;*******************************************************************************
+; Reboot the system
+;
+; Enter with:
+;		R0 = reboot reason code
+;
+; Don't return (of course)
+;*******************************************************************************
+	ALIGN	32, 0
+	EXPORT	RestartEntry
+RestartEntry	ROUT
+
+; Save R0 parameter in HW dependent register which is preserved over reset
+; Put HW specific code here to reset system
+	    GETCPSR	r1
+		orr		r1, #0xC0
+		SETCPSR	r1										; disable interrupts
+
+        ldr     r10, =KSuperPageLinAddr
+        adr     r0, Run_Physical
+        bl      RomLinearToPhysical                 ; physical address in r0
+
+; Disable MMU
+		mrc		p15, 0, r1, c1, c0, 0		        ; get MMUCR
+		bic		r1, #MMUCR_M		                ; clear M bit
+		mcr		p15, 0, r1, c1, c0, 0		        ; set MMUCR
+        bx      r0                                  ; jump to the physical address
+        
+; Now running from physical address
+
+Run_Physical
+        mov     r3, #KHwNorFlashBaseAddr            ; r3 = NOR flash image base
+        
+; Jump to the NOR flash image
+        bx      r3                              
+
+;*******************************************************************************
+; Get a pointer to the list of RAM banks
+;
+; The pointer returned should point to a list of {BASE; MAXSIZE;} pairs, where
+; BASE is the physical base address of the bank and MAXSIZE is the maximum
+; amount of RAM which may be present in that bank. MAXSIZE should be a power of
+; 2 and BASE should be a multiple of MAXSIZE. The generic code will examine the
+; specified range of addresses and determine the actual amount of RAM if any
+; present in the bank. The list is terminated by an entry with zero size.
+;
+; The pointer returned will usually be to constant data, but could equally well
+; point to RAM if dynamic determination of the list is required.
+;
+; Enter with :
+;		R10 points to super page
+;		R12 points to ROM header
+;		R13 points to valid stack
+;
+; Leave with :
+;		R0 = pointer
+;		Nothing else modified
+;*******************************************************************************
+	EXPORT	GetRamBanks
+GetRamBanks	ROUT
+	    push    {r1-r3,lr}
+		mov		r0, #KHwRamSizeMb
+		lsl		r2, r0, #20			    ; R2 = RAM size in bytes
+		mov		r1, #KHwRamBaseAddr		; R1 = base address of usable RAM area
+		sub		r2, r1				    ; R2 = size of usable RAM area
+		orr		r1, #RAM_VERBATIM   	; prevent testing (overlay would break it)
+		mov		r3, #0
+		mov		lr, #0					; terminator
+		add		r0, r10, #CpuPageOffset	;
+		stm	    r0, {r1-r3,lr}			; store single bank descriptor and terminator
+		pop     {r1-r3,pc}
+
+;*******************************************************************************
+; Get a pointer to the list of ROM banks
+;
+; The pointer returned should point to a list of entries of SRomBank structures,
+; usually declared with the ROM_BANK macro.
+; The list is terminated by a zero size entry (four zero words)
+;
+; ROM_BANK	PB, SIZE, LB, W, T, RS, SS
+; PB = physical base address of bank
+; SIZE = size of bank
+; LB = linear base if override required - usually set this to 0
+; W = bus width (ROM_WIDTH_8, ROM_WIDTH_16, ROM_WIDTH_32)
+; T = type (see TRomType enum in kernboot.h)
+; RS = random speed
+; SS = sequential speed
+;
+; Only PB, SIZE, LB are used by the rest of the bootstrap.
+; The information given here can be modified by the SetupRomBank call, if
+; dynamic detection and sizing of ROMs is required.
+;
+; Enter with :
+;		R10 points to super page
+;		R12 points to ROM header
+;		R13 points to valid stack
+;
+; Leave with :
+;		R0 = pointer
+;		Nothing else modified
+;*******************************************************************************
+	EXPORT	GetRomBanks
+GetRomBanks	ROUT
+        adr		r0, RomBanksFlashTable      ; NOR flash
+        bx      lr
+
+RomBanksFlashTable
+		ROM_BANK	KHwNorFlashBaseAddr, KHwNorFlashCodeSize, 0, ROM_WIDTH_32, ERomTypeXIPFlash, 0, 0
+		DCD		0,0,0,0			; terminator
+
+;*******************************************************************************
+; Set up RAM bank
+;
+; Do any additional RAM controller initialisation for each RAM bank which wasn't
+; done by InitialiseHardware.
+; Called twice for each RAM bank :-
+;	First with R3 = 0xFFFFFFFF before bank has been probed
+;	Then, if RAM is present, with R3 indicating validity of each byte lane, ie
+;	R3 bit 0=1 if D0-7 are valid, bit1=1 if D8-15 are valid etc.
+; For each call R1 specifies the bank physical base address.
+;
+; Enter with :
+;		R10 points to super page
+;		R12 points to ROM header
+;		R13 points to stack
+;		R1 = physical base address of bank
+;		R3 = width (bottom 4 bits indicate validity of byte lanes)
+;			 0xffffffff = preliminary initialise
+;
+; Leave with :
+;		No registers modified
+;*******************************************************************************
+	EXPORT	SetupRamBank
+SetupRamBank	ROUT
+		bx      lr
+
+;*******************************************************************************
+; Set up ROM bank
+;
+; Do any required autodetection and autosizing of ROMs and any additional memory
+; controller initialisation for each ROM bank which wasn't done by
+; InitialiseHardware.
+;
+; The first time this function is called R11=0 and R0 points to the list of
+; ROM banks returned by the BTF_RomBanks call. This allows any preliminary setup
+; before autodetection begins.
+;
+; This function is subsequently called once for each ROM bank with R11 pointing
+; to the current information held about that ROM bank (SRomBank structure).
+; The structure pointed to by R11 should be updated with the size and width
+; determined. The size should be set to zero if there is no ROM present in the
+; bank.
+;
+; Enter with :
+;		R10 points to super page
+;		R12 points to ROM header
+;		R13 points to stack
+;		R11 points to SRomBank info for this bank
+;		R11 = 0 for preliminary initialise (all banks)
+;
+; Leave with :
+;		Update SRomBank info with detected size/width
+;		Set the size field to 0 if the ROM bank is absent
+;		Can modify R0-R4 but not other registers
+;
+;*******************************************************************************
+	EXPORT	SetupRomBank
+SetupRomBank	ROUT						    ; only get here if running from ROM
+		cmp		r11, #0
+		bxeq	lr						        ; don't do anything for preliminary
+		ldm	    r11, {r0,r1}				    ; r0 = base, r1 = size
+        lsr     r0, pc, #20
+        lsl     r0, #20                         ; r0 = image base
+   		ldr		r1, [r12, #TRomHeader_iRomSize] ; r1 = size of ROM block
+		stm 	r11, {r0,r1}
+        bx      lr
+
+;*******************************************************************************
+; Reserve physical memory
+;
+; Reserve any physical RAM needed for platform-specific purposes before the
+; bootstrap begins allocating RAM for page tables/kernel data etc.
+;
+; There are two methods for this:
+;	1.	The function ExciseRamArea may be used. This will remove a contiguous
+;		region of physical RAM from the RAM bank list. That region will never
+;		again be identified as RAM.
+;	2.	A list of excluded physical address ranges may be written at [R11].
+;		This should be a list of (base,size) pairs terminated by a (0,0) entry.
+;		This RAM will still be identified as RAM by the kernel but will not
+;		be allocated by the bootstrap and will subsequently be marked as
+;		allocated by the kernel immediately after boot.
+;
+; Enter with :
+;		R10 points to super page
+;		R11 indicates where preallocated RAM list should be written.
+;		R12 points to ROM header
+;		R13 points to stack
+;
+; Leave with :
+;		R0-R3 may be modified. Other registers should be preserved.
+;*******************************************************************************
+	EXPORT	ReservePhysicalMemory
+ReservePhysicalMemory	ROUT
+		bx      lr
+
+;*******************************************************************************
+; Do final platform-specific initialisation before booting the kernel
+;
+; Typical uses for this call would be:
+;	1.	Mapping cache flushing areas
+;	2.	Setting up pointers to routines in the bootstrap which are used by
+;		the variant or drivers (eg idle code).
+;
+; Enter with :
+;		R10 points to super page
+;		R11 points to TRomImageHeader for the kernel
+;		R12 points to ROM header
+;		R13 points to stack
+;
+; Leave with :
+;		R0-R9 may be modified. Other registers should be preserved.
+;
+;*******************************************************************************
+	EXPORT	FinalInitialise
+FinalInitialise ROUT
+		bx      lr
+
+;*******************************************************************************
+; Debug port write routine associated with debug port in the super page
+; Enter with :
+;		R0  character to be written
+;		R12 points to rom header
+;		R13 points to valid stack
+;
+; Leave with :
+;		nothing modified 
+;*******************************************************************************
+	EXPORT	DoWriteC
+DoWriteC	ROUT
+	IF	CFG_DebugBootRom
+		push    {r1,lr}
+		bl		GetDebugPortBase			; r1 = base address of UART registers
+	
+		str		r0, [r1, #4]				; Store to data register
+
+		pop     {r1,pc}
+	ELSE
+		bx      lr
+	ENDIF
+
+;*******************************************************************************
+; Initialise the debug port
+;
+; Enter with :
+;		R12 points to ROM header
+;		There is no valid stack
+;
+; Leave with :
+;		R0-R2 modified
+;		Other registers unmodified
+;*******************************************************************************
+InitDebugPort	ROUT
+		GET_ADDRESS	r1, KHwBaseUart0, KHwLinBaseUart0
+		ldr		r0,[r1, #0]		
+		bx		lr
+
+;*******************************************************************************
+; Get the base address of the debug UART
+;
+; Enter with :
+;		R12 points to ROM header
+;		There may be no stack
+;
+; Leave with :
+;		R1 = base address of port, 0 for JTAG
+;		Z flag set for JTAG, clear for non-JTAG
+;		No other registers modified
+;*******************************************************************************
+GetDebugPortBase	ROUT
+		ldr		r1, [r12, #TRomHeader_iDebugPort]
+		cmp		r1, #42							; JTAG?
+		movseq	r1, #0
+		bxeq	lr							    ; yes - return 0 and set Z
+		cmp		r1, #1
+        blo     GetUartPort0          
+        beq     GetUartPort1
+		cmp		r1, #3
+        blo     GetUartPort2
+		beq		GetUartPort3
+GetUartPort0
+		GET_ADDRESS	r1, KHwBaseUart0, KHwLinBaseUart0
+		movs	r1, r1							; clear Z
+		bx      lr
+
+GetUartPort1
+		GET_ADDRESS	r1, KHwBaseUart1, KHwLinBaseUart1
+		movs	r1, r1							; clear Z
+		bx      lr
+
+GetUartPort2
+		GET_ADDRESS	r1, KHwBaseUart2, KHwLinBaseUart2
+		movs	r1, r1							; clear Z
+		bx      lr
+
+GetUartPort3
+		GET_ADDRESS	r1, KHwBaseUart3, KHwLinBaseUart3
+		movs	r1, r1							; clear Z
+		bx      lr
+
+;*******************************************************************************
+; Return parameter specified by R0 (see TBootParam enum)
+;
+; Enter with :
+;		R0 = parameter number
+;
+; Leave with :
+;		If parameter value is supplied, R0 = value and N flag clear
+;		If parameter value is not supplied, N flag set. In this case the
+;		parameter may be defaulted or the system may fault.
+;		R0, R1 modified. No other registers modified.
+;
+;*******************************************************************************
+GetParameters ROUT
+		adr		r1, ParameterTable
+		b		FindParameter
+
+ParameterTable
+		DCD		-1								; terminator
+
+;*******************************************************************************
+; BOOT FUNCTION TABLE
+;*******************************************************************************
+GetBootTableAddress	ROUT
+		adr		r0, SyborgBootTable
+        bx      lr
+
+SyborgBootTable
+		DCD	DoWriteC					; output a debug character
+		DCD	GetRamBanks					; get list of RAM banks
+		DCD	SetupRamBank				; set up a RAM bank
+		DCD	GetRomBanks					; get list of ROM banks
+		DCD	SetupRomBank				; set up a ROM bank
+		DCD	GetHwBanks					; get list of HW banks
+		DCD	ReservePhysicalMemory		; reserve physical RAM if required
+		DCD	GetParameters				; get addresses for direct memory model
+		DCD	FinalInitialise				; Final initialisation before booting the kernel
+		DCD	HandleAllocRequest			; allocate memory (usually in generic code)
+		DCD	GetPdeValue					; usually in generic code
+		DCD	GetPteValue					; usually in generic code
+		DCD	PageTableUpdate				; usually in generic code
+		DCD	EnableMmu					; Enable the MMU (usually in generic code)
+
+; These entries specify the standard MMU permissions for various areas
+		
+	IF  CFG_MMMultiple
+;	IF  CFG_MMFlexible
+	    IF CFG_ARMV7
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RORO, MEMORY_FULLY_CACHED,       	1,  1,  0,  0   ; ROM
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, MEMORY_FULLY_CACHED,       	0,  1,  0,  0   ; kernel data/stack/heap
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, MEMORY_FULLY_CACHED,       	0,  1,  0,  0   ; super page/CPU page
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, MEMORY_FULLY_CACHED,  	0,  1,  0,  0   ; page directory/tables
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RONO, MEMORY_FULLY_CACHED,       	1,  1,  0,  0   ; exception vectors
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, MEMORY_STRONGLY_ORDERED,      0,  1,  0,  0   ; hardware registers
+		DCD         0                                                           ; unused (minicache flush)
+		DCD         0                                                           ; unused (maincache flush)
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, MEMORY_FULLY_CACHED,       	0,  1,  0,  0   ; page table info
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWRW, MEMORY_FULLY_CACHED,       	1,  1,  0,  0   ; user RAM
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RONO, MEMORY_STRONGLY_ORDERED,      1,  1,  0,  0   ; temporary identity mapping
+		BTP_ENTRY   CLIENT_DOMAIN, UNC_PERM,  MEMORY_STRONGLY_ORDERED,      0,  1,  0,  0   ; uncached
+	    ENDIF	
+	    IF CFG_ARMV6
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RORO, CACHE_WBWA,       1,  1,  0,  0       ; ROM
+	        BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, CACHE_WBWA,       0,  1,  0,  0       ; kernel data/stack/heap
+	        BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, CACHE_WBWA,       0,  1,  0,  0       ; super page/CPU page
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, CACHE_WBWA,		0,  1,  0,  0       ; page directory/tables
+	        BTP_ENTRY   CLIENT_DOMAIN, PERM_RONO, CACHE_WTRA,       1,  1,  0,  0       ; exception vectors
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, CACHE_SO,         0,  1,  0,  0       ; hardware registers
+		DCD			0										; unused (minicache flush)
+		DCD			0										; unused (maincache flush)
+	        BTP_ENTRY   CLIENT_DOMAIN, PERM_RWNO, CACHE_WBWA,       0,  1,  0,  0       ; page table info
+	        BTP_ENTRY   CLIENT_DOMAIN, PERM_RWRW, CACHE_WBWA,       1,  1,  0,  0       ; user RAM
+		BTP_ENTRY   CLIENT_DOMAIN, PERM_RONO, CACHE_SO,         1,  1,  0,  0       ; temporary identity mapping
+	        BTP_ENTRY   CLIENT_DOMAIN, UNC_PERM,  CACHE_SO,         0,  1,  0,  0       ; uncached
+	    ENDIF
+	ENDIF
+	IF CFG_MMMoving
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RORO, CACHE_WT		; ROM
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWNO, CACHE_WB		; kernel data/stack/heap
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWNO, CACHE_WB		; super page/CPU page
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWNO, CACHE_WT		; page directory/tables
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RORO, CACHE_WT		; exception vectors
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWRO, CACHE_NCNB	; hardware registers
+		DCD			0										; unused (minicache flush)
+		DCD			0										; unused (maincache flush)
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWNO, CACHE_WB		; page table info
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RWRW, CACHE_WB		; user RAM
+		BTP_ENTRY	CLIENT_DOMAIN, PERM_RORO, CACHE_NCNB	; temporary identity mapping
+		BTP_ENTRY	CLIENT_DOMAIN, UNC_PERM,  CACHE_NCNB	; uncached
+	ENDIF
+
+	END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/config.inc	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,78 @@
+;/*
+;* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+;* All rights reserved.
+;* This component and the accompanying materials are made available
+;* under the terms of the License "Eclipse Public License v1.0"
+;* which accompanies this distribution, and is available
+;* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;*
+;* Initial Contributors:
+;* Nokia Corporation - initial contribution.
+;*
+;* Contributors:
+;*
+;* Description:
+;*
+;*/
+
+; Include to enable tracing
+;	GBLL	CFG_DebugBootRom
+
+; Include one of these to select the CPU
+;	GBLL	CFG_CPU_ARM926J
+;	GBLL	CFG_CPU_ARM1136
+	GBLL    CFG_CPU_CORTEX_A8N
+;	GBLL	CFG_CPU_ARM1136_ERRATUM_399234_FIXED
+;	GBLL    CFG_CPU_ARM1136_ERRATUM_411920_FIXED
+; Include the following lines if this is a bootloader bootstrap
+;	GBLL	CFG_BootLoader
+
+; If you want to supply a custom set of initial vectors (including reset vector) include the following line
+;	GBLL	CFG_CustomVectors
+;
+; and provide a custom_vectors.inc file
+
+; On ARM architecture 6 processors, include the following line to override the threshold
+; on total physical RAM size at which the multiple memory model switches into large address space mode
+; i.e. size>threshold -> 2Gb per process, size<=threshold -> 1Gb per process
+; Defaults to 32Mb.
+;	INIT_NUMERIC_CONSTANT	CFG_ARMV6_LARGE_CONFIG_THRESHOLD, <value>
+
+; For the direct memory model only, include the following line if you wish the exception vectors at the
+; start of the bootstrap to be used at all times. This is only relevant if an MMU is present - this option
+; is mandatory if not.
+;	GBLL	CFG_UseBootstrapVectors
+;
+; If the above option is in use (including if no MMU is present) the following symbol should be defined
+; to specify the offset from the bootstrap to the kernel image.
+;	INIT_NUMERIC_CONSTANT	KernelCodeOffset, 0x4000
+
+; Include the following line if you wish to include the ROM autodetection code based on data bus
+; capacitance and image repeats.
+;	GBLL	CFG_AutoDetectROM
+
+; Include the following line to minimise the initial kernel heap size
+; On the direct memory model the size of the kernel data area (super page to end of kernel heap) 
+; is rounded up to the next 1Mb if this is not included, 4K if it is.
+; On the moving and multiple models, the size of the initial kernel heap area is rounded up to
+; the next 64K if this is not included, 4K if it is.
+;	GBLL	CFG_MinimiseKernelHeap
+
+; On the moving or multiple memory models, include either or both of the following lines to
+; specify the size of the initial kernel heap
+;	INIT_NUMERIC_CONSTANT	CFG_KernelHeapMultiplier, <multiplier>
+;	INIT_NUMERIC_CONSTANT	CFG_KernelHeapBaseSize, <base>
+;
+; The initial kernel heap size is MAX( <base> + <multiplier> * N / 16, value specified in ROMBUILD )
+; where N is the total physical RAM size in pages.
+; <base> defaults to 24K and <multiplier> defaults to 9*16 (ie 9 bytes per page).
+
+; Specific stuff for integrator
+;	GBLL	CFG_Integrator_DontSetClock
+	INIT_NUMERIC_CONSTANT	CFG_HWVD, 0x0B0A0001
+
+; Copy NOR Flash image to SDRAM
+	GBLL    CFG_CopyFlashToRam
+    
+
+	END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/eabi/kasyborg.def	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,39 @@
+EXPORTS
+	_Z17VariantInitialisev @ 1 NONAME
+	_Z14AsicInitialisev @ 2 NONAME
+	_ZN6Syborg11DebugOutputEj @ 3 NONAME
+	_ZN6Syborg12MsTickPeriodEv @ 4 NONAME
+	_ZN6Syborg13StartupReasonEv @ 5 NONAME
+	_ZN6Syborg27SystemTimeInSecondsFrom2000ERi @ 6 NONAME
+	_ZN6Syborg30SetSystemTimeInSecondsFrom2000Ei @ 7 NONAME
+	_ZN6Syborg5Init1Ev @ 8 NONAME
+	_ZN6Syborg5Init3Ev @ 9 NONAME
+	_ZN6Syborg9DebugInitEv @ 10 NONAME
+	_ZN6SyborgC1Ev @ 11 NONAME
+	_ZN6SyborgC2Ev @ 12 NONAME
+	_ZN7TSyborg10DisableIntEj @ 13 NONAME
+	_ZN7TSyborg10TimerValueEj @ 14 NONAME
+	_ZN7TSyborg11EnableTimerEjNS_6TStateE @ 15 NONAME
+	_ZN7TSyborg12SetTimerLoadEjm @ 16 NONAME
+	_ZN7TSyborg12SetTimerModeEjNS_10TTimerModeE @ 17 NONAME
+	_ZN7TSyborg12VideoRamPhysEv @ 18 NONAME
+	_ZN7TSyborg12VideoRamSizeEv @ 19 NONAME
+	_ZN7TSyborg13ClearTimerIntEj @ 20 NONAME
+	_ZN7TSyborg13DebugPortAddrEv @ 21 NONAME
+	_ZN7TSyborg14IsTimerEnabledEj @ 22 NONAME
+	_ZN7TSyborg16MarkDebugPortOffEv @ 23 NONAME
+	_ZN7TSyborg18VideoRamPhysSecureEv @ 24 NONAME
+	_ZN7TSyborg20EnableTimerInterruptEj @ 25 NONAME
+	_ZN7TSyborg21DisableTimerInterruptEj @ 26 NONAME
+	_ZN7TSyborg9EnableIntEj @ 27 NONAME
+	_ZN7TSyborg9TimerLoadEj @ 28 NONAME
+	_ZN7TSyborg9TimerModeEj @ 29 NONAME
+	_ZN9Interrupt11SetPriorityEii @ 30 NONAME
+	_ZN9Interrupt4BindEiPFvPvES0_ @ 31 NONAME
+	_ZN9Interrupt5ClearEi @ 32 NONAME
+	_ZN9Interrupt6EnableEi @ 33 NONAME
+	_ZN9Interrupt6UnbindEi @ 34 NONAME
+	_ZN9Interrupt7DisableEi @ 35 NONAME
+	_ZTI6Syborg @ 36 NONAME
+	_ZTV6Syborg @ 37 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/estart.txt	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,1 @@
+C: 0  ELOCAL FAT  0       FS_FORMAT_COLD,FS_SYNC_DRIVE # IRAM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/pdd/enet.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(ethernet,pdd)
+TARGETTYPE		pdd
+ROMTARGET       ethernet.pdd
+
+SYSTEMINCLUDE	\epoc32\include\drivers
+SYSTEMINCLUDE	AsspNKernIncludePath
+SOURCEPATH	    .
+
+SOURCE		    ethernet.cpp   ethernet_device.cpp
+
+LIBRARY	    PlatformLib 
+
+UID			0x100039d0 0x1000015c
+VENDORID    0x70000001
+
+CAPABILITY	all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,123 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <ethernet.h>
+#include <e32hal.h>
+#include <system.h>
+#include "ethernet_device.h"
+
+#pragma diag_suppress 1441
+
+_LIT(KEthPddName, "Ethernet.Syborg");
+
+// needs ldd version..
+const TInt KMinimumLddMajorVersion	= 1;
+const TInt KMinimumLddMinorVersion	= 0;
+const TInt KMinimumLddBuild			= 122;
+
+//
+// Class to identify the driver as PDD
+//
+class DDriverEthernet : public DPhysicalDevice
+{
+public:
+	DDriverEthernet();
+	
+	//
+	// Functions that we must implement as we are inheriting from abstract base class
+	//
+	virtual TInt Install();
+	virtual void GetCaps(TDes8 &aDes) const;
+	virtual TInt Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
+	virtual TInt Validate(TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
+};
+
+//////////////////////////////////////////
+// Implementation of DDriverEthernet class
+//////////////////////////////////////////
+
+DDriverEthernet::DDriverEthernet()
+{
+	DP("** (PDD) DDriverEthernet::DDriverEthernet()");
+	__KTRACE_OPT(KHARDWARE, Kern::Printf("DDriverEthernet::DDriverEthernet()"));
+	
+	iUnitsMask=0x1;	
+	iVersion=TVersion(KEthernetMajorVersionNumber,
+					  KEthernetMinorVersionNumber,
+					  KEthernetBuildVersionNumber);
+}
+
+TInt DDriverEthernet::Install()
+{
+	DP("** (PDD) DDriverEthernet::Install()");
+	__KTRACE_OPT(KHARDWARE, Kern::Printf("DDriverEthernet::Install()"));
+	
+	return SetName(&KEthPddName);
+}
+
+void DDriverEthernet::GetCaps(TDes8 &aDes) const
+{
+	DP("** (PDD) DDriverEthernet::GetCaps");
+	__KTRACE_OPT(KHARDWARE, Kern::Printf("DDriverEthernet::GetCaps"));
+	
+	TEthernetCaps capsBuf;
+
+	aDes.FillZ(aDes.MaxLength());
+	aDes=capsBuf.Left(Min(capsBuf.Length(),aDes.MaxLength()));
+}
+
+TInt DDriverEthernet::Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
+{
+	DP("** (PDD) DDriverEthernet::Create");
+	__KTRACE_OPT(KHARDWARE, Kern::Printf("DDriverEthernet::Create"));
+	
+    TInt r = KErrNoMemory;
+
+	EthernetDevice	*VirtioEthernet = new EthernetDevice;
+	if(VirtioEthernet)
+		{
+		DP("** (PDD) DDriverEthernet:: EthernetDevice created successfully");
+		r = VirtioEthernet->DoCreate(aUnit, anInfo);
+		}
+	aChannel = VirtioEthernet;
+       return r;
+}
+
+TInt DDriverEthernet::Validate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
+{
+	DP("** (PDD) DDriverEthernet::Validate");
+	__KTRACE_OPT(KHARDWARE, Kern::Printf("DDriverEthernet::Validate"));
+	
+	if((!Kern::QueryVersionSupported(iVersion,aVer)) || 
+		(!Kern::QueryVersionSupported(aVer,TVersion(KMinimumLddMajorVersion,
+													KMinimumLddMinorVersion,
+													KMinimumLddBuild))))
+	{
+		return KErrNotSupported;
+	}
+	if(aUnit != 0)
+	{
+		return KErrNotSupported;
+	}
+	return KErrNone;
+}
+
+DECLARE_STANDARD_PDD()
+{
+	DP("** (DPhysicalDevice) Ethernet PDD Factory created");
+	return new DDriverEthernet;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,411 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <ethernet.h>
+#include <e32hal.h>
+#include <e32cmn.h> 
+#include "ethernet_device.h"
+
+// Constants specific to this file
+const TInt K1000mSecDelay	= 1000;
+
+/////////////////////////////////////////
+// Implementation of EthernetDevice class
+/////////////////////////////////////////
+
+EthernetDevice::EthernetDevice() : iRxDfc(RxDfc, this)
+{
+	DP("** (PDD) EthernetDevice()");
+		
+	iInterruptId=-1;
+	iCreated = FALSE;
+	iStarted = FALSE;
+	iRxDfc.SetDfcQ(Kern::DfcQue0());
+}
+
+EthernetDevice::~EthernetDevice()
+{
+	DP("** (PDD) ~EthernetDevice()");
+	DP("** (PDD) ~EthernetDevice Unbind Interrupt");
+	Interrupt::Unbind(EIntNet0);
+}
+
+void EthernetDevice::GetConfig(TEthernetConfigV01 &aConfig) const
+{
+	DP("** (PDD) EthernetDevice::GetConfig");
+	aConfig = iDefaultConfig;
+}
+
+TInt EthernetDevice::ValidateConfig(const TEthernetConfigV01 &aConfig) const
+{
+	DP("** (PDD) EthernetDevice::ValidateConfig");
+		
+	switch(aConfig.iEthSpeed)
+	{
+		case KEthSpeedUnknown:
+			return KErrNotSupported;
+		default:		
+			break;
+	}
+
+	switch(aConfig.iEthDuplex)
+	{
+		case KEthDuplexUnknown:
+			return KErrNotSupported;
+		default:
+			break;
+	}
+
+	return KErrNone;
+}
+
+void EthernetDevice::Caps(TDes8 &aCaps) const
+{
+	DP("** (PDD) EthernetDevice::Caps");
+	TEthernetCaps capsBuf;
+
+	aCaps.FillZ(aCaps.MaxLength());
+	aCaps=capsBuf.Left(Min(capsBuf.Length(),aCaps.MaxLength()));
+}
+
+TDfcQue* EthernetDevice::DfcQ(TInt aUnit)
+{
+	DP("** (PDD) EthernetDevice::DfcQ");
+	return Kern::DfcQue0();
+}
+
+TInt EthernetDevice::DisableIrqs()
+{
+	DP("** (PDD) EthernetDevice::DisableIrqs");
+	return NKern::DisableInterrupts(1);
+}
+
+void EthernetDevice::RestoreIrqs(TInt aLevel)
+{
+	DP("** (PDD) EthernetDevice::RestoreIrqs");
+	NKern::RestoreInterrupts(aLevel);
+}
+
+//
+// Enable Ethernet interrupt line, allocate memory for Rx/Tx paths and send QEMU frames for Rx transmission.  
+//
+TInt EthernetDevice::DoCreate(TInt aUnit, const TDesC8* anInfo)
+{
+	DP("** (PDD) Enter: EthernetDevice::DoCreate");
+	
+	if(iCreated)
+		return KErrNone;
+	
+	// Bind to Ethernet interrupt
+	Interrupt::Bind(EIntNet0,Isr,this);
+	SetMacAddress();
+	
+	DP("** (PDD) EthernetDevice::DoCreate - VNET[VIRTIO_STATUS]");
+	
+   VNET[VIRTIO_STATUS] = VIRTIO_CONFIG_S_ACKNOWLEDGE
+     			| VIRTIO_CONFIG_S_DRIVER;
+	 
+   AllocRings();
+	VNET[VIRTIO_STATUS] |= VIRTIO_CONFIG_S_DRIVER_OK;
+   AddRx();
+	VNET[VIRTIO_INT_ENABLE] = 1;
+	  
+	iCreated = TRUE;
+	
+	DP("** (PDD) Exit: EthernetDevice::DoCreate");
+	
+	return KErrNone;
+}
+
+TInt EthernetDevice::Start()
+{
+	DP("** (PDD) EthernetDevice::Start()");
+		
+	if(iStarted)
+		return KErrNone;
+		   			       		   			   
+    // wait for 1 sec as negotiation is going on... hopefully auto-neg completes by then
+ 	NKern::Sleep(K1000mSecDelay);
+ 	Interrupt::Enable(EIntNet0);
+	
+	iStarted = TRUE;
+	
+	return KErrNone;
+}
+
+void EthernetDevice::Stop(TStopMode aMode)
+{
+	DP("** (PDD) EthernetDevice::Stop(TStopMode aMode)");
+		
+	switch (aMode)
+	{
+		case EStopNormal:
+		case EStopEmergency:
+			iRxDfc.Cancel();
+         //Should we disable QEMU interrupts here?
+			break;					
+        default:
+            break;
+	}
+	
+	iStarted = FALSE;	
+	Interrupt::Disable(EIntNet0);
+}
+
+//
+// Transmit Tx data to QEMU and increment iTxAvail idx counter to indicate to QEMU that a new frame is available.  
+//
+TInt EthernetDevice::Send(TBuf8<KMaxEthernetPacket+32> &aBuffer)
+{
+	DP("** (PDD) EthernetDevice::Send");
+		
+	TInt err = KErrNone;
+	TUint32 length = aBuffer.Length();
+	iTxBuffer = aBuffer;
+
+   DP ("** (PDD) Value of iTxAvail->idx = %d\n", iTxAvail->idx);	
+   TInt ring_slot = iTxAvail->idx & (tx_ring_size - 1);
+   DP ("** (PDD) Value of ring_slot = %d\n", ring_slot);
+
+   memset(&tx_header, 0, sizeof(tx_header));
+
+   iTxDesc[0].addr = Epoc::LinearToPhysical((TUint32)&tx_header);
+   iTxDesc[0].len = sizeof(tx_header);
+   iTxDesc[0].flags = VRING_DESC_F_NEXT;
+   iTxDesc[0].next = 1;
+   iTxDesc[1].addr = Epoc::LinearToPhysical((TUint32) iTxBuffer.Ptr());
+   iTxDesc[1].len = length;
+   iTxDesc[1].flags = 0;
+   iTxAvail->ring[ring_slot] = 0;
+
+   iTxAvail->idx++;   
+   DP ("** (PDD)iTxAvail->idx = %x, rx_last_used=%d\n", iTxAvail->idx, rx_last_used);
+  
+   VNET[VIRTIO_QUEUE_NOTIFY] = TX_QUEUE;
+
+   DP ("** (PDD) iTxDesc[0].addr = %x\n", iTxDesc[0].addr);
+   DP ("** (PDD) iTxDesc[0].len = %d\n", iTxDesc[0].len);
+   DP ("** (PDD) iTxDesc[0].flags = %d\n", iTxDesc[0].flags);
+   DP ("** (PDD) iTxDesc[0].next = %d\n", iTxDesc[0].next);
+   DP ("** (PDD) iTxDesc[1].addr = %x\n", iTxDesc[1].addr);
+   DP ("** (PDD) iTxDesc[1].len = %d\n", iTxDesc[1].len);
+   DP ("** (PDD) iTxDesc[1].flags = %d\n", iTxDesc[1].flags);
+    					 	   		
+	return err;
+}
+
+TInt EthernetDevice::ReceiveFrame(TBuf8<KMaxEthernetPacket+32> &aBuffer, 
+									TBool okToUse)
+{
+	DP("** (PDD) EthernetDevice::ReceiveFrame");
+    
+   //If no buffer available dump frame
+   if (!okToUse)
+   {
+    DP("** (PDD) EthernetDevice::ReceiveFrame - dumping frame");
+    return KErrGeneral;
+   }
+   
+   aBuffer.Copy(iRxBuffer.Ptr(), ETHERNET_PAYLOAD_SIZE); 
+   AddRx();
+ 
+	return KErrNone;
+}
+
+void EthernetDevice::Isr(TAny* aPtr)
+{
+	DP("** (PDD) EthernetDevice::Isr(TAny* aPtr)");
+
+   Interrupt::Clear(EIntNet0);	
+   VNET[VIRTIO_INT_STATUS] = 1;
+   EthernetDevice& d=*(EthernetDevice*)aPtr;
+   d.iRxDfc.Add();                   			
+}
+
+void EthernetDevice::RxDfc(TAny* aPtr)
+{
+	DP("** (PDD) EthernetDevice::RxDfc");
+	EthernetDevice& d=*(EthernetDevice*)aPtr;
+   
+   TInt x = VNET[VIRTIO_INT_STATUS];
+   DP("** (PDD) EthernetDevice::RxDfc - value of x=%d", x);
+
+   TInt ring_slot = d.iRxUsed->idx & (d.rx_ring_size - 1);
+
+   DP("**(PDD) RxDfc  (d.iTxAvail->idx) = %d (d.iRxAvail->idx) = %d", d.iTxAvail->idx, d.iRxAvail->idx);
+   DP("**(PDD) RxDfc  (d.iRxUsed->idx) = %d ", d.iRxUsed->idx);
+   DP("**(PDD) RxDfc  ring_slot=%d,  (d.iRxUsed->ring[%d].id) = %d", ring_slot, ring_slot, d.iRxUsed->ring[ring_slot].id);
+   DP("**(PDD) RxDfc  d.iRxDesc[1].next = %d", d.iRxDesc[1].next); 
+
+   //check to see if this is a Rx or Tx
+   if (d.iRxUsed->idx != d.rx_last_used)
+   {
+   DP("** (PDD) Received Rx Interrupt");
+   d.rx_last_used++;
+   DP("** (PDD) Value of rx_last_used=%d", d.rx_last_used);
+   d.ReceiveIsr();
+   }
+}
+
+void EthernetDevice::MacConfigure(TEthernetConfigV01 &aConfig)
+{
+	DP("** (PDD) EthernetDevice::MacConfigure");
+	
+	iDefaultConfig.iEthAddress[0] = aConfig.iEthAddress[0];
+	iDefaultConfig.iEthAddress[1] = aConfig.iEthAddress[1];
+	iDefaultConfig.iEthAddress[2] = aConfig.iEthAddress[2];
+	iDefaultConfig.iEthAddress[3] = aConfig.iEthAddress[3];
+	iDefaultConfig.iEthAddress[4] = aConfig.iEthAddress[4];
+	iDefaultConfig.iEthAddress[5] = aConfig.iEthAddress[5];
+	
+	DP ("** (PDD) macaddr %02x:%02x:%02x:%02x:%02x:%02x\n",
+			iDefaultConfig.iEthAddress[0], 
+			iDefaultConfig.iEthAddress[1], 
+			iDefaultConfig.iEthAddress[2], 
+			iDefaultConfig.iEthAddress[3], 
+			iDefaultConfig.iEthAddress[4], 
+			iDefaultConfig.iEthAddress[5]);
+}
+
+//Descriptor list and vring_used must start on a 4k page boundary. 
+TAny * EthernetDevice::AllocAligned(TUint16 size)
+{
+	DP("** (PDD) Enter: EthernetDevice::alloc_aligned");
+	DP("** (PDD) size=%d",size);
+
+   TAny * p = Kern::Alloc(size + 4095);
+	
+   DP("** (PDD) BEFORE: p=%x",p);
+   p = (TAny *)(((TUint32)p + 4095) & ~4095);
+   DP("** (PDD) AFTER: p=%x",p);
+	
+	DP("** (PDD) Exit: EthernetDevice::alloc_aligned");
+	
+	return p;
+}
+	
+TAny EthernetDevice::AllocRings()
+{	
+	DP("** (PDD) Enter: EthernetDevice::AllocRings");
+	
+	TUint size;
+	TUint used_offset;
+	TUint32 p;
+
+	VNET[VIRTIO_QUEUE_SEL] = TX_QUEUE;
+   tx_ring_size = VNET[VIRTIO_QUEUE_NUM];
+
+	DP ("** (PDD) tx_ring_size = %d\n", tx_ring_size);
+	
+	size = (tx_ring_size * (16 + 2)) + 4;
+	used_offset = (size + 4095) & ~1024;
+	DP ("** (PDD) used_offset = %d", used_offset);
+	size = used_offset + 4 + (tx_ring_size * 8);
+	DP ("** (PDD) size = %d", size);
+	
+	p = (TUint32)AllocAligned(size);
+	DP ("** (PDD) p = %x\n", p);
+
+	VNET[VIRTIO_QUEUE_BASE] = Epoc::LinearToPhysical(p);
+
+	iTxDesc = reinterpret_cast<vring_desc*>(p);
+	iTxAvail = reinterpret_cast<vring_avail*>(p + tx_ring_size * 16);
+	iTxUsed = reinterpret_cast<vring_used*>(p + used_offset); 
+    
+   DP ("** (PDD) iTxDesc = %x", iTxDesc);
+   DP ("** (PDD) iTxAvail = %x", iTxAvail);
+   DP ("** (PDD) iTxUsed = %x", iTxUsed);
+    
+	VNET[VIRTIO_QUEUE_SEL] = RX_QUEUE;
+	rx_ring_size = VNET[VIRTIO_QUEUE_NUM];
+	
+	size = (rx_ring_size * (16 + 2)) + 4;
+	used_offset = (size + 4095) & ~4095;
+	size = used_offset + 4 + (rx_ring_size * 8);
+	p = (TUint32)AllocAligned(size);
+    DP ("** (PDD)  p = %x\n", p);
+	VNET[VIRTIO_QUEUE_BASE] = Epoc::LinearToPhysical(p);
+	
+	iRxDesc = reinterpret_cast<vring_desc*>(p);
+	iRxAvail = reinterpret_cast<vring_avail*>(p + rx_ring_size * 16);
+	iRxUsed = reinterpret_cast<vring_used*>(p + used_offset);
+
+    DP ("** (PDD) iRxDesc = %x", iRxDesc);
+    DP ("** (PDD) iRxAvail = %x", iRxAvail);
+    DP ("** (PDD) iRxUsed = %x", iRxUsed);
+
+	DP("** (PDD) Exit: EthernetDevice::AllocRings");
+}
+
+void EthernetDevice::AddRx()
+{
+    DP("** (PDD) Enter: EthernetDevice::AddRx"); 
+   
+    TInt n = iRxAvail->idx & (rx_ring_size - 1);
+    memset(&rx_header, 0, sizeof(rx_header));
+    iRxDesc[0].addr = Epoc::LinearToPhysical((TUint32)&rx_header);
+    iRxDesc[0].len = sizeof(rx_header);
+    iRxDesc[0].flags = VRING_DESC_F_NEXT | VRING_DESC_F_WRITE;
+    iRxDesc[0].next = 1;
+    iRxDesc[1].addr = Epoc::LinearToPhysical((TUint32) iRxBuffer.Ptr());
+    iRxDesc[1].len = ETHERNET_PAYLOAD_SIZE;
+    iRxDesc[1].flags = VRING_DESC_F_WRITE;
+    iRxAvail->ring[n] = 0;
+    iRxAvail->idx++;
+    VNET[VIRTIO_QUEUE_NOTIFY] = RX_QUEUE;
+
+    DP("** (PDD) Exit: EthernetDevice::AddRx");
+}
+
+
+
+void EthernetDevice::SetMacAddress(void)
+	{
+	DP("** (PDD) Enter: EthernetDevice::SetMacAddress");
+	
+	iDefaultConfig.iEthAddress[0] = VNET_MAC[0];
+	iDefaultConfig.iEthAddress[1] = VNET_MAC[1];
+	iDefaultConfig.iEthAddress[2] = VNET_MAC[2];
+	iDefaultConfig.iEthAddress[3] = VNET_MAC[3];
+	iDefaultConfig.iEthAddress[4] = VNET_MAC[4];
+	iDefaultConfig.iEthAddress[5] = VNET_MAC[5];
+	
+	DP ("** (PDD) macaddr %02x:%02x:%02x:%02x:%02x:%02x\n",
+			iDefaultConfig.iEthAddress[0], 
+			iDefaultConfig.iEthAddress[1], 
+			iDefaultConfig.iEthAddress[2], 
+			iDefaultConfig.iEthAddress[3], 
+			iDefaultConfig.iEthAddress[4], 
+			iDefaultConfig.iEthAddress[5]);
+	
+	DP("** (PDD) Exit: EthernetDevice::SetMacAddress");
+	}
+
+//
+// Functions that are just stubs
+//
+
+void EthernetDevice::CheckConfig(TEthernetConfigV01& aConfig)
+{
+	DP("** (PDD) EthernetDevice::CheckConfig");
+}
+
+TInt EthernetDevice::Configure(TEthernetConfigV01 &aConfig)
+{
+	DP("** (PDD) EthernetDevice::Configure");
+	return KErrNone;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,174 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Register definitions and base classes for Ethernet Virtio. 
+*
+*/
+
+#ifndef __QEMUETHERNET_
+#define __QEMUETHERNET_
+
+#include <ethernet.h>
+#include <system.h>
+
+#define SVPDBG
+#ifdef SVPDBG
+#define DP(format...) Kern::Printf(format)
+#else
+#define DP(format...)
+#endif
+
+#define ETHERNET_PAYLOAD_SIZE 1500
+
+#define VIRTIO_CONFIG_S_ACKNOWLEDGE     1
+#define VIRTIO_CONFIG_S_DRIVER          2
+#define VIRTIO_CONFIG_S_DRIVER_OK       4
+#define VIRTIO_CONFIG_S_FAILED          0x80
+
+/* This marks a buffer as continuing via the next field. */
+#define VRING_DESC_F_NEXT       1
+/* This marks a buffer as write-only (otherwise read-only). */
+#define VRING_DESC_F_WRITE      2
+
+#define TX_QUEUE 1
+#define RX_QUEUE 0
+
+#define VNET_MAC ((volatile TUint8 *)(0xc600c000 + 0x100))
+#define VNET ((volatile TUint32 *)0xc600c000)
+
+enum {
+    VIRTIO_ID             = 0,
+    VIRTIO_DEVTYPE        = 1,
+    VIRTIO_HOST_FEATURES  = 2,
+    VIRTIO_GUEST_FEATURES = 3,
+    VIRTIO_QUEUE_BASE     = 4,
+    VIRTIO_QUEUE_NUM      = 5,
+    VIRTIO_QUEUE_SEL      = 6,
+    VIRTIO_QUEUE_NOTIFY   = 7,
+    VIRTIO_STATUS	  	  = 8,
+    VIRTIO_INT_ENABLE     = 9,
+    VIRTIO_INT_STATUS     = 10
+};
+
+typedef struct
+{
+#define VIRTIO_NET_HDR_F_NEEDS_CSUM     1       // Use csum_start, csum_offset
+ TUint8 flags;
+#define VIRTIO_NET_HDR_GSO_NONE         0       // Not a GSO frame
+#define VIRTIO_NET_HDR_GSO_TCPV4        1       // GSO frame, IPv4 TCP (TSO)
+#define VIRTIO_NET_HDR_GSO_UDP          3       // GSO frame, IPv4 UDP (UFO)
+#define VIRTIO_NET_HDR_GSO_TCPV6        4       // GSO frame, IPv6 TCP
+#define VIRTIO_NET_HDR_GSO_ECN          0x80    // TCP has ECN set
+  TUint8 gso_type;
+  TUint16 hdr_len;
+  TUint16 gso_size;
+  TUint16 csum_start;
+  TUint16 csum_offset;
+} virtio_net_hdr;
+
+typedef struct
+{
+  TUint64 addr;
+  TUint32 len;
+  TUint16 flags;
+  TUint16 next;
+} vring_desc;
+
+typedef struct
+{
+  TUint16 flags;
+  TUint16 idx;
+  TUint16 ring[16];
+
+} vring_avail;
+
+typedef struct
+{
+  TUint16 flags;
+  TUint16 idx;
+  struct {
+  	TUint32 id;
+  	TUint32 len;
+  } ring[16];
+} vring_used;
+
+
+//
+// Class to identify the device as ethernet device for Symbian
+//
+class EthernetDevice : public DEthernet
+{
+public:
+	EthernetDevice();
+	~EthernetDevice();
+	TInt DoCreate(TInt aUnit, const TDesC8* anInfo);
+	static void Isr(TAny* aPtr);
+	
+	//
+	// Functions that we must implement as we are inheriting from abstract base class
+	//
+	virtual TInt Start();
+	virtual void Stop(TStopMode aMode);
+	virtual void GetConfig(TEthernetConfigV01 &aConfig) const;
+	virtual TInt ValidateConfig(const TEthernetConfigV01 &aConfig) const;
+	virtual void CheckConfig(TEthernetConfigV01 &aConfig);
+	virtual TInt Configure(TEthernetConfigV01 &aConfig);
+	virtual void MacConfigure(TEthernetConfigV01 &aConfig);
+	virtual void Caps(TDes8 &aCaps) const;
+	virtual TInt DisableIrqs();
+	virtual void RestoreIrqs(TInt aIrq);
+	virtual TDfcQue* DfcQ(TInt aUnit);
+	virtual TInt Send(TBuf8<KMaxEthernetPacket+32> &aBuffer);
+	virtual TInt ReceiveFrame(TBuf8<KMaxEthernetPacket+32> &aBuffer, TBool okToUse);
+							  						  
+private:
+
+   TEthernetConfigV01   iDefaultConfig;
+	TInt  			   	iInterruptId;
+	TDfc				      iRxDfc;
+	TUint32				   iCreated;
+	TUint32				   iStarted;
+	
+	//Virtio structs for transmitting data to QEMU.
+	volatile vring_desc  *iTxDesc;
+	volatile vring_avail *iTxAvail;
+	volatile vring_used  *iTxUsed;
+   //Ring size hardcoded in QEMU.    
+	TUint tx_ring_size;
+	
+   //Virtio structs for receiving data from QEMU. 
+	volatile vring_desc  *iRxDesc;
+	volatile vring_avail *iRxAvail;
+	volatile vring_used  *iRxUsed;
+	
+	TUint rx_ring_size;
+   TUint rx_last_used;
+
+   //Virtio packet header definitions. 
+	virtio_net_hdr rx_header;
+	virtio_net_hdr tx_header;
+	
+	//Buffers for Rx/Tx transmission.
+	TBuf8<KMaxEthernetPacket+32> iTxBuffer;
+	TBuf8<KMaxEthernetPacket+32> iRxBuffer;
+		
+	static void RxDfc(TAny* aPtr);
+	
+	//QEMU specific member functions
+	void AllocRings();
+	void* AllocAligned(TUint16 size);
+	void AddRx();
+	void SetMacAddress(void);
+};
+
+#endif // __QEMUETHERNET_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/test/ethernet_test.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <e32test.h>
+#include <e32debug.h>
+#include <d32ethernet.h>
+
+LOCAL_D RTest test(_L("DRIVER1_TEST"));
+
+_LIT(KDriver1LddFileName,"enet");
+_LIT(KDriver1PddFileName,"ethernet");
+
+_LIT8(KTestSendData,"abcdefghijklmnopqrstuvwxyz");
+_LIT8(KTestLargeSendData,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
+
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+
+	TInt r;
+	RDebug::Printf(">>>>>>E32Main()");
+	
+	test.Start(_L("Load Physical Device"));
+	r=User::LoadPhysicalDevice(KDriver1PddFileName);
+	if (r != KErrNone)
+		RDebug::Printf("LoadPhysicalDevice: value of error =%d", r);
+		test(r==KErrNone || r==KErrAlreadyExists);
+
+	test.Next(_L("Load Logical Device"));
+	r=User::LoadLogicalDevice(KDriver1LddFileName);
+	if (r != KErrNone)
+			RDebug::Printf("LoadLogicalDevice: value of error =%d", r);
+			test(r==KErrNone || r==KErrAlreadyExists);
+
+	__KHEAP_MARK;
+
+	test.Next(_L("Open Logical Channel"));
+	RBusDevEthernet ldd;
+
+	r=ldd.Open(0);
+	RDebug::Printf("Value returned from ldd.Open()=%d", r);
+	test(r==KErrNone);
+
+	test.Next(_L("SendData"));
+	TRequestStatus status;
+	ldd.Write(status,KTestSendData);
+	
+	test.Next(_L("SendDataCancel"));
+	ldd.WriteCancel();
+	User::WaitForRequest(status);
+	r=status.Int();
+	//test(r==KErrCancel);
+
+	test.Next(_L("SendData"));
+	ldd.Write(status,KTestSendData);
+	User::WaitForRequest(status);
+	r=status.Int();
+	//test(r==KErrNone);
+
+	test.Next(_L("ReceiveData"));
+	TBuf8<256> buffer;
+	ldd.Read(status,buffer);
+
+	test.Next(_L("ReceiveDataCancel"));
+	ldd.ReadCancel();
+	User::WaitForRequest(status);
+	r=status.Int();
+	test(r==KErrCancel);
+
+	test.Next(_L("Close Logical Channel"));
+	ldd.Close();
+
+	__KHEAP_MARKEND;
+
+	test.End();
+
+	return(0);
+
+  }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/test/ethernet_test.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+target			ethernet_testapp.exe        
+targettype		exe
+source			ethernet_test.cpp
+library			euser.lib
+systeminclude	/epoc32/include
+
+CAPABILITY	all -tcb
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/fb/fb.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(lcd,dll)
+TARGETTYPE		kext
+
+SYSTEMINCLUDE	AsspNKernIncludePath
+SYSTEMINCLUDE	.
+
+SOURCEPATH		.
+SOURCE			syborg_fb.cpp
+
+LIBRARY			PlatformLib
+
+EPOCALLOWDLLDATA
+
+UID			    0x1000008d 0x100039e8
+VENDORID        0x70000001
+
+ROMTARGET		lcd.dll
+
+CAPABILITY		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/fb/syborg_fb.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,487 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic frame buffer driver
+*
+*/
+
+#include <syborg_priv.h>
+#include "syborg_fb.h"
+
+TPhysAddr Syborg::VideoRamPhys;
+TPhysAddr Syborg::VideoRamPhysSecure;		// Secure display memory
+
+TPhysAddr TSyborg::VideoRamPhys()
+{
+  __KTRACE_OPT(KEXTENSION,Kern::Printf("TSyborg::VideoRamPhys: VideoRamPhys=0x%x", Syborg::VideoRamPhys));
+  return Syborg::VideoRamPhys;
+}
+
+TPhysAddr TSyborg::VideoRamPhysSecure()
+{
+  return Syborg::VideoRamPhysSecure;
+}
+
+LOCAL_C TInt DoHalFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
+{
+  DLcdPowerHandler* pH=(DLcdPowerHandler*)aPtr;
+  return pH->HalFunction(aFunction,a1,a2);
+}
+
+static void rxMsg(TAny* aPtr)
+{
+  DLcdPowerHandler& h=*(DLcdPowerHandler*)aPtr;
+  TMessageBase* pM = h.iMsgQ.iMessage;
+  if(pM)
+	h.HandleMsg(pM);
+}
+
+static void power_up_dfc(TAny* aPtr)
+{
+  ((DLcdPowerHandler*)aPtr)->PowerUpDfc();
+}
+
+void power_down_dfc(TAny* aPtr)
+{
+  ((DLcdPowerHandler*)aPtr)->PowerDownDfc();
+}
+
+void DLcdPowerHandler::DisplayOn()
+{ 
+  PowerUpLcd(iSecureDisplay);
+  iDisplayOn = ETrue;
+}
+
+void DLcdPowerHandler::DisplayOff()
+{
+  PowerDownLcd();
+  iDisplayOn = EFalse;
+}
+
+void DLcdPowerHandler::SwitchDisplay(TBool aSecure)
+ {
+   if(aSecure)
+	 {
+	   if(!iSecureDisplay)
+		 {
+		   DisplayOff();
+		   iSecureDisplay = ETrue;
+		   DisplayOn();
+		 }
+	 }
+   else
+	 {
+	   if(iSecureDisplay)
+		 {
+		   DisplayOff();
+		   iSecureDisplay = EFalse;
+		   DisplayOn();
+		 }
+	 }
+ }
+
+void DLcdPowerHandler::PowerUpDfc()
+{
+  DisplayOn();
+  PowerUpDone();
+}
+
+void DLcdPowerHandler::PowerDownDfc()
+{
+  DisplayOff();
+  PowerDownDone();
+}
+
+void DLcdPowerHandler::PowerDown(TPowerState)
+{
+  iPowerDownDfc.Enque();
+}
+
+void DLcdPowerHandler::PowerUp()
+{
+  iPowerUpDfc.Enque();
+}
+
+void DLcdPowerHandler::PowerUpLcd(TBool aSecure)
+{
+#if 1
+  WriteReg(iPortAddr, FB_ENABLED, 0);
+  WriteReg(iPortAddr, FB_BASE, aSecure ? iSecurevRamPhys : ivRamPhys);
+  WriteReg(iPortAddr, FB_WIDTH, iVideoInfo.iSizeInPixels.iWidth);
+  WriteReg(iPortAddr, FB_BLANK, 0);
+  WriteReg(iPortAddr, FB_BPP, 32);
+  WriteReg(iPortAddr, FB_COLOR_ORDER, 0);
+  WriteReg(iPortAddr, FB_BYTE_ORDER, 0);
+  WriteReg(iPortAddr, FB_PIXEL_ORDER, 0);
+  WriteReg(iPortAddr, FB_INT_MASK, 0);
+  WriteReg(iPortAddr, FB_ENABLED, 1);
+  WriteReg(iPortAddr, FB_HEIGHT, iVideoInfo.iSizeInPixels.iHeight);
+#endif
+}
+
+void DLcdPowerHandler::PowerDownLcd()
+{
+  WriteReg(iPortAddr, FB_BLANK, 1);
+}
+
+DLcdPowerHandler::DLcdPowerHandler()
+	:	DPowerHandler(KLitLcd),
+		iMsgQ(rxMsg,this,NULL,1),
+		iPowerUpDfc(&power_up_dfc,this,6),
+		iPowerDownDfc(&power_down_dfc,this,7)
+{
+}
+
+void DLcdPowerHandler::ScreenInfo(TScreenInfoV01& anInfo)
+{
+  anInfo.iWindowHandleValid = EFalse;
+  anInfo.iWindowHandle = NULL;
+  anInfo.iScreenAddressValid = ETrue;
+  anInfo.iScreenAddress = (TAny *)(iChunk->LinearAddress());
+  anInfo.iScreenSize.iWidth = iVideoInfo.iSizeInPixels.iWidth;
+  anInfo.iScreenSize.iHeight = iVideoInfo.iSizeInPixels.iHeight;
+}
+
+void DLcdPowerHandler::HandleMsg(TMessageBase* aMsg)
+{
+  if(aMsg->iValue)
+	DisplayOn();
+  else
+	DisplayOff();
+  aMsg->Complete(KErrNone,ETrue);
+}
+
+void DLcdPowerHandler::WsSwitchOnScreen()
+{
+  TThreadMessage& m = Kern::Message();
+  m.iValue = ETrue;
+  m.SendReceive(&iMsgQ);
+}
+
+void DLcdPowerHandler::WsSwitchOffScreen()
+{
+  TThreadMessage& m = Kern::Message();
+  m.iValue = EFalse;
+  m.SendReceive(&iMsgQ);
+}
+
+TInt DLcdPowerHandler::GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure)
+{
+  NKern::FMWait(&iLock);
+  if(aSecure)
+	aInfo = iSecureVideoInfo;
+  else
+	aInfo = iVideoInfo;
+  NKern::FMSignal(&iLock);
+  return KErrNone;
+}
+
+TInt DLcdPowerHandler::GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo)
+{
+  if(aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
+	return KErrArgument;
+  
+  NKern::FMWait(&iLock);
+  aInfo = iVideoInfo;
+  NKern::FMSignal(&iLock);
+
+  if(aMode != aInfo.iDisplayMode)
+	{
+	  aInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
+	  aInfo.iIsPalettized       = KConfigIsPalettized;
+	  aInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
+	  aInfo.iBitsPerPixel       = KConfigBitsPerPixel;
+	}
+  return KErrNone;
+}
+
+TInt DLcdPowerHandler::AllocateFrameBuffer()
+{
+	// Allocate physical RAM for video
+	TInt vSize = TSyborg::VideoRamSize();
+
+	NKern::ThreadEnterCS();
+	TInt r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhys);
+	if (r != KErrNone)
+	{
+	        NKern::ThreadLeaveCS();
+		Kern::Fault("AllocVideoRam",r);
+	}
+
+	// Map the video RAM
+	ivRamPhys = TSyborg::VideoRamPhys();
+
+	r = DPlatChunkHw::New(iChunk,ivRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
+
+	NKern::ThreadLeaveCS();
+
+	if(r != KErrNone)
+	  return r;
+
+	TUint* pV = (TUint*)iChunk->LinearAddress();
+
+	// Allocate physical RAM for secure display
+	NKern::ThreadEnterCS();
+	r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhysSecure);
+	if (r != KErrNone)
+	{
+	        NKern::ThreadLeaveCS();
+		Kern::Fault("AllocVideoRam 2",r);
+	}
+	iSecurevRamPhys = ivRamPhys + vSize;
+	TInt r2 = DPlatChunkHw::New(iSecureChunk,iSecurevRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
+
+	NKern::ThreadLeaveCS();
+
+	if(r2 != KErrNone)
+	  return r2;
+
+	TUint* pV2 = (TUint*)iSecureChunk->LinearAddress();
+
+	iVideoInfo.iSizeInPixels.iWidth  = KConfigLcdWidth;
+	iVideoInfo.iSizeInPixels.iHeight = KConfigLcdHeight;
+	iVideoInfo.iDisplayMode = KConfigLcdDisplayMode;
+	iVideoInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
+	iVideoInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
+	iVideoInfo.iIsPalettized = KConfigIsPalettized;
+	iVideoInfo.iBitsPerPixel = KConfigBitsPerPixel;
+	iVideoInfo.iSizeInTwips.iWidth = KConfigLcdWidthInTwips;
+	iVideoInfo.iSizeInTwips.iHeight = KConfigLcdHeightInTwips;
+	iVideoInfo.iIsMono = KConfigIsMono;
+	iVideoInfo.iVideoAddress = (TInt)pV;
+	iVideoInfo.iIsPixelOrderLandscape = KConfigPixelOrderLandscape;
+	iVideoInfo.iIsPixelOrderRGB = KConfigPixelOrderRGB;
+
+	iSecureVideoInfo = iVideoInfo;
+	iSecureVideoInfo.iVideoAddress = (TInt)pV2;
+
+#if 0
+	WriteReg(iPortAddr, FB_ENABLED, 0);
+	WriteReg(IPortAddr, FB_INT_MASK, 0);
+	WriteReg(iPortAddr, FB_BASE, iSecureDisplay ? iSecurevRamPhys : ivRamPhys);
+	WriteReg(iPortAddr, FB_WIDTH, iVideoInfo.iSizeInPixels.iWidth);
+	WriteReg(iPortAddr, FB_HEIGHT, iVideoInfo.iSizeInPixels.iHeight);
+	WriteReg(iPortAddr, FB_BLANK, 0);
+	WriteReg(iPortAddr, FB_ENABLED, 1);
+#endif
+	
+	return KErrNone;
+}
+
+
+TInt DLcdPowerHandler::SetDisplayMode(TInt aMode)
+{
+  if(aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
+	return KErrArgument;
+
+  // store the current mode
+  iVideoInfo.iDisplayMode = aMode;
+
+  // store the current mode for secure screen
+  iSecureVideoInfo.iDisplayMode = aMode;
+
+  return KErrNone;
+}
+
+TInt DLcdPowerHandler::HalFunction(TInt aFunction, TAny* a1, TAny* a2)
+{
+  TInt r=KErrNone;
+  switch(aFunction)
+	{
+	case EDisplayHalScreenInfo:
+	  {
+		TPckgBuf<TScreenInfoV01> vPckg;
+		ScreenInfo(vPckg());
+		Kern::InfoCopy(*(TDes8*)a1,vPckg);
+		break;
+	  }
+	case EDisplayHalWsRegisterSwitchOnScreenHandling:
+	  {
+		iWsSwitchOnScreen=(TBool)a1;
+		break;
+	  }
+	case EDisplayHalWsSwitchOnScreen:
+	  {
+		WsSwitchOnScreen();
+		break;
+	  }
+	case EDisplayHalModeCount:
+	  {
+		TInt ndm = KConfigLcdNumberOfDisplayModes;
+		kumemput32(a1, &ndm, sizeof(ndm));
+		break;
+	  }
+	case EDisplayHalSetMode:
+	  {
+		__KTRACE_OPT(KEXTENSION,Kern::Printf("EDisplayHalSetMode"));
+		__SECURE_KERNEL(
+						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetMode")))
+						return KErrPermissionDenied;
+						)
+		  r = SetDisplayMode((TInt)a1);
+		break;
+	  }
+	case EDisplayHalMode:
+	  {
+		kumemput32(a1, &iVideoInfo.iDisplayMode, sizeof(iVideoInfo.iDisplayMode));
+		r = KErrNone;
+		break;
+	  }
+	case EDisplayHalSetPaletteEntry:
+	  {
+		__SECURE_KERNEL(
+						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetPaletteEntry")))
+						return KErrPermissionDenied;
+						)
+		  r = KErrNotSupported;
+		break;
+	  }
+	case EDisplayHalPaletteEntry:
+	  {
+		TInt entry;
+		kumemget32(&entry, a1, sizeof(TInt));
+		r = KErrNotSupported;
+		break;
+	  }
+	case EDisplayHalSetState:
+	  {
+		__SECURE_KERNEL(
+						if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetState")))
+						return KErrPermissionDenied;
+						)
+		  if((TBool)a1)
+			WsSwitchOnScreen();
+		  else
+			WsSwitchOffScreen();
+		break;
+	  }
+	case EDisplayHalState:
+	  {
+		kumemput32(a1, &iDisplayOn, sizeof(TBool));
+		break;
+	  }
+	case EDisplayHalColors:
+	  {
+		TInt mdc = 1<<24;
+		kumemput32(a1, &mdc, sizeof(mdc));
+		break;
+	  }
+	case EDisplayHalCurrentModeInfo:
+	  {
+		TPckgBuf<TVideoInfoV01> vPckg;
+		r = GetCurrentDisplayModeInfo(vPckg(), (TBool)a2);
+		if(KErrNone == r)
+		  Kern::InfoCopy(*(TDes8*)a1,vPckg);
+		break;
+	  }
+	case EDisplayHalSpecifiedModeInfo:
+	  {
+		TPckgBuf<TVideoInfoV01> vPckg;
+		TInt mode;
+		kumemget32(&mode, a1, sizeof(mode));
+		r = GetSpecifiedDisplayModeInfo(mode, vPckg());
+		if(KErrNone == r)
+		  Kern::InfoCopy(*(TDes8*)a2,vPckg);
+		break;
+	  }	
+	case EDisplayHalSecure:
+	  {
+		kumemput32(a1, &iSecureDisplay, sizeof(TBool));
+		break;
+	  }
+	case EDisplayHalSetSecure:
+	  {
+		__SECURE_KERNEL(
+						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetSecure")))
+						return KErrPermissionDenied;
+						)
+		  SwitchDisplay((TBool)a1);
+		break;
+	  }
+	default:
+	  {
+		r = KErrNotSupported;
+		break;
+	  }			
+	}
+  return r;
+}
+
+TInt DLcdPowerHandler::Create()
+{
+	iDfcQ = Kern::DfcQue0();	// use low priority DFC queue for this driver 
+
+	iPortAddr = KHwBaseClcd;
+
+	// !@!
+#if 0	
+	// Map the video RAM
+	TInt vSize = TSyborg::VideoRamSize();
+	ivRamPhys = TSyborg::VideoRamPhys();
+
+	TInt r = DPlatChunkHw::New(iChunk,ivRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
+	if(r != KErrNone)
+	  return r;
+
+	TUint* pV = (TUint*)iChunk->LinearAddress();
+
+	iSecurevRamPhys = ivRamPhys + vSize;
+	TInt r2 = DPlatChunkHw::New(iSecureChunk,iSecurevRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
+	if(r2 != KErrNone)
+	  return r2;
+
+	TUint* pV2 = (TUint*)iSecureChunk->LinearAddress();
+#endif
+
+	iVideoInfo.iSizeInPixels.iWidth  = KConfigLcdWidth;
+	iVideoInfo.iSizeInPixels.iHeight = KConfigLcdHeight;
+	iVideoInfo.iDisplayMode = KConfigLcdDisplayMode;
+	iVideoInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
+	iVideoInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
+	iVideoInfo.iIsPalettized = KConfigIsPalettized;
+	iVideoInfo.iBitsPerPixel = KConfigBitsPerPixel;
+	iVideoInfo.iSizeInTwips.iWidth = KConfigLcdWidthInTwips;
+	iVideoInfo.iSizeInTwips.iHeight = KConfigLcdHeightInTwips;
+	iVideoInfo.iIsMono = KConfigIsMono;
+	// !@!	iVideoInfo.iVideoAddress = (TInt)pV;
+	iVideoInfo.iIsPixelOrderLandscape = KConfigPixelOrderLandscape;
+	iVideoInfo.iIsPixelOrderRGB = KConfigPixelOrderRGB;
+
+	iSecureVideoInfo = iVideoInfo;
+	// !@! iSecureVideoInfo.iVideoAddress = (TInt)pV2;
+
+	AllocateFrameBuffer();
+	TInt r = Kern::AddHalEntry(EHalGroupDisplay,DoHalFunction,this);
+	if(r != KErrNone)
+	  return r;
+
+	iPowerUpDfc.SetDfcQ(iDfcQ);
+	iPowerDownDfc.SetDfcQ(iDfcQ);
+	iMsgQ.SetDfcQ(iDfcQ);
+	iMsgQ.Receive();
+
+	Add();
+	DisplayOn();
+
+	return KErrNone;
+}
+
+DECLARE_STANDARD_EXTENSION()
+{
+  TInt r = KErrNoMemory;
+  DLcdPowerHandler* pH=new DLcdPowerHandler;
+  if(pH)
+	r = pH->Create();
+  
+  return r;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/fb/syborg_fb.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic frame buffer driver
+*
+*/
+
+#ifndef _SYBORG_FB_H
+#define _SYBORG_FB_H
+
+#include <videodriver.h>
+#include <nkern.h>
+#include <kernel.h>
+#include <kpower.h>
+#include <system.h>
+
+_LIT(KLitLcd,"SYBORG_FB");
+
+const TUint KConfigLcdWidth            = 640;
+const TUint	KConfigLcdHeight	       = 480;
+const TInt	KConfigLcdWidthInTwips     = 9638;
+const TInt	KConfigLcdHeightInTwips    = 7370;
+const TBool KConfigIsMono              = 0;
+const TBool KConfigIsPalettized        = 0;
+const TInt  KCOnfigOffsetToFirstPixel  = 0;
+const TBool KConfigPixelOrderRGB       = 0;
+const TBool KConfigPixelOrderLandscape = 1;
+const TInt  KConfigLcdDisplayMode       = 2;
+//const TInt  KConfigLcdDisplayMode       = 1;
+const TInt  KConfigLcdNumberOfDisplayModes = 3;
+
+
+const TInt  KConfigBitsPerPixel        = 24;
+const TInt  KCOnfigOffsetBetweenLines  = 2560;
+
+class DLcdPowerHandler : public DPowerHandler
+{
+public: // from DPowerHandler
+  void PowerDown(TPowerState);
+  void PowerUp();
+public:	// to prevent a race condition with WServer trying to power up/down at the same time
+  void PowerUpDfc();
+  void PowerDownDfc();
+public:
+  DLcdPowerHandler();
+  TInt Create();
+  void DisplayOn();
+  void DisplayOff();
+  TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2);
+
+  void PowerUpLcd(TBool aSecure);
+  void PowerDownLcd();
+
+  void ScreenInfo(TScreenInfoV01& aInfo);
+  void WsSwitchOnScreen();
+  void WsSwitchOffScreen();
+  void HandleMsg(TMessageBase* aMsg);
+  void SwitchDisplay(TBool aSecure);
+
+private:
+  TInt GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure);
+  TInt GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo);
+  TInt SetDisplayMode(TInt aMode);
+  TInt AllocateFrameBuffer();
+  
+  TBool iDisplayOn;
+  DPlatChunkHw* iChunk;
+  DPlatChunkHw* iSecureChunk;
+  TBool iWsSwitchOnScreen;
+  TBool iSecureDisplay;
+
+public:
+  TDfcQue* iDfcQ;
+  TMessageQue iMsgQ;					// to prevent a race condition with Power Manager trying to power up/down at the same time
+  TDfc iPowerUpDfc;
+  TDfc iPowerDownDfc;	
+
+private:
+  TVideoInfoV01 iVideoInfo;
+  TVideoInfoV01 iSecureVideoInfo;
+  NFastMutex iLock;
+  TPhysAddr ivRamPhys;
+  TPhysAddr iSecurevRamPhys;
+
+public:
+  TLinAddr iPortAddr;
+
+enum {
+    FB_ID               = 0,
+    FB_BASE             = 1,
+    FB_HEIGHT           = 2,
+    FB_WIDTH            = 3,
+    FB_ORIENTATION      = 4,
+    FB_BLANK            = 5,
+    FB_INT_MASK         = 6,
+    /* begin new interface */
+    FB_INTERRUPT_CAUSE  = 7,
+    FB_BPP              = 8,
+    FB_COLOR_ORDER      = 9,
+    FB_BYTE_ORDER       = 10,
+    FB_PIXEL_ORDER      = 11,
+    FB_ROW_PITCH        = 12,
+    FB_ENABLED          = 13,
+    FB_PALETTE_START    = 0x400 >> 2,
+    FB_PALETTE_END   = FB_PALETTE_START+256-1,
+    /* end new interface */
+};
+
+#define FB_INT_VSYNC            (1U << 0)
+#define FB_INT_BASE_UPDATE_DONE (1U << 1)
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/hal/config.hcf	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,75 @@
+EManufacturer=0
+EManufacturerHardwareRev=0
+EManufacturerSoftwareRev=0
+EManufacturerSoftwareBuild=0
+EModel=0
+EMachineUid=0
+EDeviceFamily=0
+EDeviceFamilyRev=0
+ECPU=0
+ECPUArch=0
+ECPUABI=0
+ECPUSpeed = GetCPUSpeed
+ESystemStartupReason = GetSystemStartupReason
+ESystemException = GetSystemException
+ESystemTickPeriod=0
+EMemoryRAM = GetRAMSize
+EMemoryRAMFree = GetFreeRAM
+EMemoryROM = GetROMSize
+EMemoryPageSize=0
+EPowerGood=0
+EPowerBackup=0
+EPowerExternal=0
+EKeyboard=0
+EKeyboardDeviceKeys=0
+EKeyboardAppKeys=0
+EKeyboardClick=0
+EDisplayXPixels=ProcessDisplayCurrentModeInfo
+EDisplayYPixels=ProcessDisplayCurrentModeInfo
+EDisplayXTwips=ProcessDisplayCurrentModeInfo
+EDisplayYTwips=ProcessDisplayCurrentModeInfo
+EDisplayColors=ProcessDisplayColors
+EDisplayState : set = ProcessDisplayState
+EDisplayContrast : set = ProcessDisplayContrast
+EDisplayContrastMax=ProcessDisplayMaxContrast
+EBacklight=0
+EBacklightState :set = ProcessBacklightState
+EPen=0
+EPenX=0
+EPenY=0
+EPenDisplayOn : set = ProcessPenDisplayOnState
+EPenClick=0
+EMouse=0
+EMouseState : set = ProcessMouseState
+EMouseSpeed : set = ProcessMouseSpeed
+EMouseAcceleration : set = ProcessMouseAcceleration
+EMouseButtons=0
+EMouseButtonState = GetMouseButtonState
+ECaseSwitch=0
+ELEDs=0
+ELEDmask : set = ProcessLEDMask
+ESwitches=GetSwitches
+EIntegratedPhone=0
+EDisplayBrightness : set = ProcessDisplayBrightness
+EDisplayBrightnessMax=ProcessDisplayMaxBrightness
+ELanguageIndex : set = 0
+EDisplayIsMono=ProcessDisplaySpecifiedModeInfo
+EDisplayIsPalettized=ProcessDisplaySpecifiedModeInfo
+EDisplayBitsPerPixel=ProcessDisplaySpecifiedModeInfo
+EDisplayNumModes = ProcessDisplayNumModes
+EDisplayMemoryAddress=ProcessDisplayCurrentModeInfo
+EDisplayOffsetToFirstPixel=ProcessDisplaySpecifiedModeInfo
+EDisplayOffsetBetweenLines=ProcessDisplaySpecifiedModeInfo
+EDisplayPaletteEntry : set = ProcessDisplayPaletteEntry
+EDisplayIsPixelOrderRGB=ProcessDisplayCurrentModeInfo
+EDisplayIsPixelOrderLandscape=ProcessDisplayCurrentModeInfo
+EDisplayMode : set = ProcessDisplayMode
+EDebugPort : set = ProcessDebugPort
+EClipboardDrive=0
+ESystemDrive : set = 0
+EDisplayNumberOfScreens=0
+ENanoTickPeriod=0
+EFastCounterFrequency=0
+EFastCounterCountsUp=0
+EHardwareFloatingPoint = GetHardwareFloatingPoint
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/hal/hal.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include        <variant.mmh>
+
+TARGET		    VariantTarget(hal,dll)
+TARGETTYPE		dll
+LINKAS			hal.dll
+NOEXPORTLIBRARY
+
+SOURCEPATH		..\..\hal\src
+SOURCE			hal_main.cpp userhal.cpp
+
+SOURCEPATH		\epoc32\build\generatedcpp\hal
+SOURCE			VariantTarget(values,cpp) VariantTarget(config,cpp)
+
+SYSTEMINCLUDE	\epoc32\include \epoc32\include\kernel
+
+LIBRARY			euser.lib
+DEFFILE			..\..\hal\~\hal.def
+
+UID				0x1000008d 0x100039e8
+VENDORID        0x70000001
+
+CAPABILITY		all	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/hal/values.hda	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,41 @@
+EManufacturer=intel
+EManufacturerHardwareRev=0x1
+EManufacturerSoftwareRev=0x100
+EManufacturerSoftwareBuild=0x250
+EModel=0x42525453
+EMachineUid=OmapH4
+EDeviceFamily=crystal
+EDeviceFamilyRev=0x001
+ECPU=arm
+ECPUArch=0x400
+ECPUABI=arm5
+ECPUSpeed=0
+ESystemStartupReason=cold
+ESystemException=0
+ESystemTickPeriod=15625
+EMemoryRAM=4
+EMemoryRAMFree=2
+EMemoryROM=12
+EMemoryPageSize=0x1000
+EPowerGood=1
+EPowerExternal=1
+EMouse=1
+EMouseState=1
+EMouseSpeed=1
+EMouseAcceleration=1
+EMouseButtons=2
+EMouseButtonState=0
+EMouseX=640
+EMouseY=480
+ECaseSwitch=0
+EIntegratedPhone=0
+ELanguageIndex=0
+EDebugPort=0
+EClipboardDrive=2
+ESystemDrive=0xffff
+EDisplayNumberOfScreens=1
+ENanoTickPeriod=1000
+EFastCounterFrequency=1000000
+EFastCounterCountsUp=1
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/kasyborg.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(kasyborg,dll)
+TARGETTYPE		var
+
+EXPORTLIBRARY	kasyborg
+LINKAS			kasyborg.dll
+
+SYSTEMINCLUDE   .\specific
+
+SOURCEPATH		.\specific
+SOURCE		    syborg.cpp interrupts.cpp assp.cpp
+SOURCE		    syborg.cia interrupts.cia
+
+// now specified in kern_ext.lib
+//LIBRARY			ekern.lib
+
+DEFFILE			.\~\kasyborg.def
+
+NOSTRICTDEF
+
+EPOCALLOWDLLDATA
+
+UID				0x1000008d 0x100039e8
+VENDORID        0x70000001
+
+CAPABILITY		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/keyboard/keyboard.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(ekeyb,dll)
+TARGETTYPE		kext
+ROMTARGET		ekeyb.dll
+
+SYSTEMINCLUDE	AsspNKernIncludePath
+
+SOURCEPATH		.
+SOURCE			syborg_keyboard.cpp
+
+//LIBRARY			ekern.lib
+LIBRARY			PlatformLib
+
+//NOEXPORTLIBRARY
+
+//DEFFILE			..\e32\~\empty.def
+//DEFFILE			.\~\exkey.def
+
+//NOSTRICTDEF
+
+UID				0x100039cf 0x100000db
+VENDORID        0x70000001
+
+CAPABILITY		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/keyboard/syborg_keyboard.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic keyboard driver
+*
+*/
+
+//#define DEBUG
+
+#include "syborg_keyboard.h"
+
+LOCAL_C TInt halFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
+{
+  DKeyboardPs2Soc* pH=(DKeyboardPs2Soc*)aPtr;
+  return pH->HalFunction(aFunction,a1,a2);
+}
+
+void rxMsg(TAny* aPtr)
+{
+  DKeyboardPs2Soc& h=*(DKeyboardPs2Soc*)aPtr;
+  TMessageBase* pM=h.iMsgQ.iMessage;
+  if (pM)
+	h.HandleMsg(pM);
+}
+
+TInt DKeyboardPs2Soc::FifoPop(void)
+{
+  TInt val = iKeyFifo[iFifoPos];
+  iFifoPos++;
+  iFifoCount--;
+  
+  if (iFifoPos == FIFO_SIZE)
+	iFifoPos = 0;
+
+  return val;
+}
+
+void DKeyboardPs2Soc::FifoPush(TInt val)
+{
+  TInt slot;
+
+  if (iFifoCount == FIFO_SIZE)
+	return;
+  
+  slot = iFifoPos + iFifoCount;
+  if (slot >= FIFO_SIZE)
+	slot -= FIFO_SIZE;
+  iKeyFifo[slot] = val;
+  iFifoCount++;
+}
+
+void DKeyboardPs2Soc::Isr(TAny* aPtr)
+{
+  __DEBUG_PRINT("DKeyboardPs2Soc::Isr");
+  DKeyboardPs2Soc& k = *(DKeyboardPs2Soc*)aPtr;
+
+  // Is now auto-clearing
+  while(ReadReg(KHwBaseKmiKeyboard, KBD_FIFO_COUNT)!=0)
+	k.FifoPush(ReadReg(KHwBaseKmiKeyboard, KBD_DATA));
+  
+  //WriteReg(KHwBaseKmiKeyboard,KBD_CLEAR_INT, 0);
+  Interrupt::Clear(EIntKeyboard); 
+  k.iRxDfc.Add();
+}
+
+DKeyboardPs2Soc::DKeyboardPs2Soc()
+  :	DPowerHandler(KLitKeyboard),
+	iRxDfc(RxDfc,this,Kern::DfcQue0(),1),
+	iMsgQ(rxMsg,this,NULL,1)
+{
+  iKeyboardOn = ETrue;
+  iFifoPos = 0;
+  iFifoCount = 0;
+}
+
+TInt DKeyboardPs2Soc::Create()
+{
+  __DEBUG_PRINT("DKeyboardPs2Soc::Create");
+
+  TInt r=KErrNone;
+  iDfcQ=Kern::DfcQue0();
+
+  iFifoPos = iFifoCount = 0;
+
+  r=Kern::AddHalEntry(EHalGroupKeyboard,halFunction,this);
+  if (r!=KErrNone)
+	return r;
+
+  iMsgQ.SetDfcQ(iDfcQ);
+  iMsgQ.Receive();
+
+  r=Interrupt::Bind(EIntKeyboard,Isr,this);
+  if (r==KErrNone) {
+	Add();
+	KeyboardOn();
+  }
+  return r;
+}
+
+void DKeyboardPs2Soc::PowerUp()
+{
+  PowerUpDone();
+}
+
+void DKeyboardPs2Soc::PowerDown(TPowerState)
+{
+  PowerDownDone();
+}
+
+void DKeyboardPs2Soc::KeyboardOn()
+{
+  __DEBUG_PRINT("DKeyboardPs2Soc::KeyboardOn");
+  TInt reg = ReadReg(KHwBaseKmiKeyboard,KBD_ID);
+  
+  Interrupt::Enable(EIntKeyboard);
+  WriteReg(KHwBaseKmiKeyboard,KBD_INT_ENABLE,1);
+}
+
+void DKeyboardPs2Soc::KeyboardOff()
+{
+  __DEBUG_PRINT("DKeyboardPs2Soc::KeyboardOff");
+  Interrupt::Disable(EIntKeyboard);
+  WriteReg(KHwBaseKmiKeyboard,KBD_INT_ENABLE,0);
+}
+
+void DKeyboardPs2Soc::HandleMsg(TMessageBase* aMsg)
+{
+  __DEBUG_PRINT("DKeyboardPs2Soc::HandleMsg");
+  if (aMsg->iValue)
+	KeyboardOn();
+  else
+	KeyboardOff();
+  aMsg->Complete(KErrNone,ETrue);
+}
+
+void DKeyboardPs2Soc::KeyboardInfo(TKeyboardInfoV01& aInfo)
+{
+  aInfo.iKeyboardType=KConfigKeyboardType;
+  aInfo.iDeviceKeys=KConfigKeyboardDeviceKeys;
+  aInfo.iAppsKeys=KConfigKeyboardAppsKeys;
+}
+
+TInt DKeyboardPs2Soc::HalFunction(TInt aFunction, TAny* a1, TAny* a2)
+{
+  TInt r=KErrNone;
+
+  __DEBUG_PRINT("DKeyboardPs2Soc::HalFunction");
+  switch(aFunction)
+	{
+	case EKeyboardHalKeyboardInfo:
+	  {
+		TPckgBuf<TKeyboardInfoV01> kPckg;
+		KeyboardInfo(kPckg());
+		Kern::InfoCopy(*(TDes8*)a1,kPckg);
+		break;
+	  }
+	  // UIKLAF Silent running/power management
+	case EKeyboardHalSetKeyboardState:
+	  {
+		if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EKeyboardHalSetKeyboardState")))
+		  return KErrPermissionDenied;
+		if ((TBool)a1)
+		  {
+			TThreadMessage& m=Kern::Message();
+			m.iValue = ETrue;
+			m.SendReceive(&iMsgQ);
+		  }
+		else
+		  {
+			TThreadMessage& m=Kern::Message();
+			m.iValue = EFalse;
+			m.SendReceive(&iMsgQ);
+		  }
+	  }
+	  break;
+	case EKeyboardHalKeyboardState:
+	  kumemput32(a1, &iKeyboardOn, sizeof(TBool));
+	  break;
+	default:
+	  r=KErrNotSupported;
+	  break;
+	}
+  return r;
+}
+
+void DKeyboardPs2Soc::RxDfc(TAny* aPtr)
+{
+  TRawEvent e;
+  DKeyboardPs2Soc& k = *(DKeyboardPs2Soc*)aPtr;
+
+  while(k.iFifoCount>0) {
+	int keycode = k.FifoPop();
+	int dwn = (keycode & 0x80000000) ? 0 : 1;
+	__DEBUG_PRINT("DKeyboardPs2Soc::RxDfc %d %d", keycode, dwn);
+  
+	keycode &= ~(0x80000000);	
+	if (dwn) {
+	  __DEBUG_PRINT("kbd EKeyDown:%d",keycode);
+	  e.Set(TRawEvent::EKeyDown,KConvertCode[keycode],0);
+	}
+	else {
+	  __DEBUG_PRINT("kbd EKeyUp:%d",keycode);
+	  e.Set(TRawEvent::EKeyUp,KConvertCode[keycode],0);
+	}
+	Kern::AddEvent(e);
+  }
+}
+
+DECLARE_STANDARD_EXTENSION()
+{
+  TInt r=KErrNoMemory;
+  DKeyboardPs2Soc* pK=new DKeyboardPs2Soc;
+  if (pK)
+	r=pK->Create();
+  __KTRACE_OPT(KEXTENSION,__DEBUG_PRINT("Returns %d",r));
+  return r;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/keyboard/syborg_keyboard.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,337 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic keyboard driver
+*
+*/
+
+#ifndef _SYBORG_KEYBOARD_H
+#define _SYBORG_KEYBOARD_H
+
+#include <kpower.h>
+#include <e32keys.h>
+#include <system.h>
+
+#ifdef DEBUG
+#define __DEBUG_PRINT(format...)    Kern::Printf(format)
+#else
+#define __DEBUG_PRINT(format...)    __KTRACE_OPT(KBOOT,Kern::Printf(format))
+#endif
+
+#define FIFO_SIZE 16
+
+_LIT(KLitKeyboard,"Syborg Keyboard");
+const TKeyboard	KConfigKeyboardType = EKeyboard_Full;
+const TInt KConfigKeyboardDeviceKeys = 0;
+const TInt KConfigKeyboardAppsKeys = 0;
+
+class DKeyboardPs2Soc : public DPowerHandler
+{
+public:
+  DKeyboardPs2Soc();
+  TInt Create();
+  TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2);
+  void KeyboardInfo(TKeyboardInfoV01& aInfo);
+  void KeyboardOn();
+  void KeyboardOff();
+  void PowerUp();
+  void PowerDown(TPowerState);
+  void HandleMsg(TMessageBase* aMsg);
+
+private:
+  static void Isr(TAny* aPtr);
+  static void RxDfc(TAny* aPtr);
+
+ private:
+  TInt FifoPop(void);
+  void FifoPush(TInt val);
+
+  TInt iKeyFifo[FIFO_SIZE];
+  TInt iFifoPos;
+  TInt iFifoCount;
+
+private:
+  TDfc iRxDfc;
+  TBool iKeyboardOn;
+
+public:
+  TDfcQue* iDfcQ;
+  TMessageQue iMsgQ;	
+
+  enum {
+    KBD_ID          = 0,
+    KBD_DATA        = 1,
+    KBD_FIFO_COUNT  = 2,
+    KBD_INT_ENABLE  = 3
+  };
+};
+
+const TUint8 KConvertCode[] =
+  {
+	/*00*/ EStdKeyNull,
+	/*01*/ EStdKeyEscape,
+	/*02*/ '1',
+	/*03*/ '2',
+	/*04*/ '3',
+	/*05*/ '4',
+	/*06*/ '5',
+	/*07*/ '6',
+	/*08*/ '7',
+	/*09*/ '8',
+	/*0a*/ '9',
+	/*0b*/ '0',
+	/*0c*/ EStdKeyMinus,
+	/*0d*/ EStdKeyEquals, 
+	/*0e*/ EStdKeyBackspace,
+	/*0f*/ EStdKeyTab,
+	
+	/*10*/ 'Q',
+	/*11*/ 'W',
+	/*12*/ 'E',
+	/*13*/ 'R',
+	/*14*/ 'T',
+	/*15*/ 'Y',
+	/*16*/ 'U',
+	/*17*/ 'I',
+	/*18*/ 'O',
+	/*19*/ 'P',
+	/*1a*/ EStdKeySquareBracketLeft,
+	/*1b*/ EStdKeySquareBracketRight,
+	/*1c*/ EStdKeyEnter,
+	/*1d*/ EStdKeyLeftCtrl,
+	/*1e*/ 'A',
+	/*1f*/ 'S',
+	
+	/*20*/ 'D',
+	/*21*/ 'F',
+	/*22*/ 'G',
+	/*23*/ 'H',
+	/*24*/ 'J',
+	/*25*/ 'K',
+	/*26*/ 'L',
+	/*27*/ EStdKeySemiColon,
+	/*28*/ EStdKeySingleQuote,
+	/*29*/ EStdKeyNull,
+	/*2a*/ EStdKeyLeftShift,
+	/*2b*/ EStdKeyHash,
+	/*2c*/ 'Z',
+	/*2d*/ 'X',
+	/*2e*/ 'C',
+	/*2f*/ 'V',
+	
+	/*30*/ 'B',
+	/*31*/ 'N',
+	/*32*/ 'M',
+	/*33*/ EStdKeyComma,
+	/*34*/ EStdKeyFullStop,
+	/*35*/ EStdKeyForwardSlash,
+	/*36*/ EStdKeyRightShift,
+	/*37*/ EStdKeyPrintScreen,
+	/*38*/ EStdKeyLeftAlt,
+	/*39*/ EStdKeySpace,
+	/*3a*/ EStdKeyCapsLock,
+	/*3b*/ EStdKeyMenu,    // EStdKeyF1,
+	/*3c*/ EStdKeyF2,
+	/*3d*/ EStdKeyF3,
+	/*3e*/ EStdKeyF4,
+	/*3f*/ EStdKeyF5,
+	
+	/*40*/ EStdKeyF6,
+	/*41*/ EStdKeyF7,
+	/*42*/ EStdKeyF8,
+	/*43*/ EStdKeyF9,
+	/*44*/ EStdKeyF10,
+	/*45*/ EStdKeyNull,
+	/*46*/ EStdKeyScrollLock,
+	/*47*/ EStdKeyHome,
+	/*48*/ EStdKeyUpArrow,
+	/*49*/ EStdKeyPageUp,
+	/*4a*/ EStdKeyNull,
+	/*4b*/ EStdKeyLeftArrow,
+	/*4c*/ EStdKeyNull,
+	/*4d*/ EStdKeyRightArrow,
+	/*4e*/ EStdKeyNull,
+	/*4f*/ EStdKeyNull,
+	
+	/*50*/ EStdKeyDownArrow,
+	/*51*/ EStdKeyPageDown,
+	/*52*/ EStdKeyInsert,
+	/*53*/ EStdKeyDelete,
+	/*54*/ EStdKeyNull,
+	/*55*/ EStdKeyNull,
+	/*56*/ EStdKeyBackSlash,
+	/*57*/ EStdKeyF11,
+	/*58*/ EStdKeyF12,
+	/*59*/ EStdKeyNull,
+	/*5a*/ EStdKeyNull,
+	/*5b*/ EStdKeyNull,
+	/*5c*/ EStdKeyNull,
+	/*5d*/ EStdKeyNull,
+	/*5e*/ EStdKeyNull,
+	/*5f*/ EStdKeyNull,
+
+	/*60*/ EStdKeyNull,
+	/*61*/ EStdKeyNull,
+	/*62*/ EStdKeyNull,
+	/*63*/ EStdKeyNull,
+	/*64*/ EStdKeyNull,
+	/*65*/ EStdKeyNull,
+	/*66*/ EStdKeyNull,
+	/*67*/ EStdKeyNull,
+	/*68*/ EStdKeyNull,
+	/*69*/ EStdKeyNull,
+	/*6a*/ EStdKeyNull,
+	/*6b*/ EStdKeyNull,
+	/*6c*/ EStdKeyNull,
+	/*6d*/ EStdKeyNull,
+	/*6e*/ EStdKeyNull,
+	/*6f*/ EStdKeyNull,
+	
+	/*70*/ EStdKeyNull,
+	/*71*/ EStdKeyNull,
+	/*72*/ EStdKeyNull,
+	/*73*/ EStdKeyNull,
+	/*74*/ EStdKeyNull,
+	/*75*/ EStdKeyNull,
+	/*76*/ EStdKeyNull,
+	/*77*/ EStdKeyNull,
+	/*78*/ EStdKeyNull,
+	/*79*/ EStdKeyNull,
+	/*7a*/ EStdKeyNull,
+	/*7b*/ EStdKeyNull,
+	/*7c*/ EStdKeyNull,
+	/*7d*/ EStdKeyNull,
+	/*7e*/ EStdKeyNull,
+	/*7f*/ EStdKeyNull,
+	
+	/*80*/ EStdKeyNull,
+	/*81*/ EStdKeyNull,
+	/*82*/ EStdKeyNull,
+	/*83*/ EStdKeyNull,
+	/*84*/ EStdKeyNull,
+	/*85*/ EStdKeyNull,
+	/*86*/ EStdKeyNull,
+	/*87*/ EStdKeyNull,
+	/*88*/ EStdKeyNull,
+	/*89*/ EStdKeyNull,
+	/*8a*/ EStdKeyNull,
+	/*8b*/ EStdKeyNull,
+	/*8c*/ EStdKeyNull,
+	/*8d*/ EStdKeyNull,
+	/*8e*/ EStdKeyNull,
+	/*8f*/ EStdKeyNull,
+	
+	/*90*/ EStdKeyNull,
+	/*91*/ EStdKeyNull,
+	/*92*/ EStdKeyNull,
+	/*93*/ EStdKeyNull,
+	/*94*/ EStdKeyNull,
+	/*95*/ EStdKeyNull,
+	/*96*/ EStdKeyNull,
+	/*97*/ EStdKeyNull,
+	/*98*/ EStdKeyNull,
+	/*99*/ EStdKeyNull,
+	/*9a*/ EStdKeyNull,
+	/*9b*/ EStdKeyNull,
+	/*9c*/ EStdKeyNull,
+	/*9d*/ EStdKeyNull,
+	/*9e*/ EStdKeyNull,
+	/*9f*/ EStdKeyNull,
+
+  	/*a0*/ EStdKeyNull,
+	/*a1*/ EStdKeyNull,
+	/*a2*/ EStdKeyNull,
+	/*a3*/ EStdKeyNull,
+	/*a4*/ EStdKeyNull,
+	/*a5*/ EStdKeyNull,
+	/*a6*/ EStdKeyNull,
+	/*a7*/ EStdKeyNull,
+	/*a8*/ EStdKeyNull,
+	/*a9*/ EStdKeyNull,
+	/*aa*/ EStdKeyNull,
+	/*ab*/ EStdKeyNull,
+	/*ac*/ EStdKeyNull,
+	/*ad*/ EStdKeyNull,
+	/*ae*/ EStdKeyNull,
+	/*af*/ EStdKeyNull,
+
+  	/*b0*/ EStdKeyNull,
+	/*b1*/ EStdKeyNull,
+	/*b2*/ EStdKeyNull,
+	/*b3*/ EStdKeyNull,
+	/*b4*/ EStdKeyNull,
+	/*b5*/ EStdKeyNull,
+	/*b6*/ EStdKeyNull,
+	/*b7*/ EStdKeyNull,
+	/*b8*/ EStdKeyNull,
+	/*b9*/ EStdKeyNull,
+	/*ba*/ EStdKeyNull,
+	/*bb*/ EStdKeyNull,
+	/*bc*/ EStdKeyNull,
+	/*bd*/ EStdKeyNull,
+	/*be*/ EStdKeyNull,
+	/*bf*/ EStdKeyNull,
+
+  	/*c0*/ EStdKeyNull,
+	/*c1*/ EStdKeyNull,
+	/*c2*/ EStdKeyNull,
+	/*c3*/ EStdKeyNull,
+	/*c4*/ EStdKeyNull,
+	/*c5*/ EStdKeyNull,
+	/*c6*/ EStdKeyNull,
+	/*c7*/ EStdKeyNull,
+	/*c8*/ EStdKeyNull,
+	/*c9*/ EStdKeyNull,
+	/*ca*/ EStdKeyNull,
+	/*cb*/ EStdKeyNull,
+	/*cc*/ EStdKeyNull,
+	/*cd*/ EStdKeyNull,
+	/*ce*/ EStdKeyNull,
+	/*cf*/ EStdKeyNull,
+
+  	/*d0*/ EStdKeyNull,
+	/*d1*/ EStdKeyNull,
+	/*d2*/ EStdKeyNull,
+	/*d3*/ EStdKeyNull,
+	/*d4*/ EStdKeyNull,
+	/*d5*/ EStdKeyNull,
+	/*d6*/ EStdKeyNull,
+	/*d7*/ EStdKeyNull,
+	/*d8*/ EStdKeyNull,
+	/*d9*/ EStdKeyNull,
+	/*da*/ EStdKeyNull,
+	/*db*/ EStdKeyNull,
+	/*dc*/ EStdKeyNull,
+	/*dd*/ EStdKeyNull,
+	/*de*/ EStdKeyNull,
+	/*df*/ EStdKeyNull,
+
+	/*e0*/ EStdKeyNull,
+	/*e1*/ EStdKeyNull,
+	/*e2*/ EStdKeyNull,
+	/*e3*/ EStdKeyNull,
+	/*e4*/ EStdKeyNull,
+	/*e5*/ EStdKeyNull,
+	/*e6*/ EStdKeyNull,
+	/*e7*/ EStdKeyNull,
+	/*e8*/ EStdKeyNull,
+	/*e9*/ EStdKeyNull,
+	/*ea*/ EStdKeyNull,
+	/*eb*/ EStdKeyNull,
+	/*ec*/ EStdKeyNull,
+	/*ed*/ EStdKeyNull,
+	/*ee*/ EStdKeyNull,
+	/*ef*/ EStdKeyNull,
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/keymap/keymap.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,1952 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: This is for a UK Keyboard
+*
+*/
+
+#include <k32keys.h>
+
+//#define US_KEYBOARD
+
+// the "array" parameter must be a true array and not a pointer
+#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
+
+#define TABLE_ENTRY_ANOTHER_CTRL_DIGIT					\
+	{  													\
+		{												\
+		EModifierKeyUp|EModifierFunc,	                \
+		0												\
+		},												\
+		{												\
+		EKeyNull,										\
+		EAnyDigitGivenRadix								\
+		},												\
+		{												\
+		EStateCtrlDigits,								\
+		EAddOnCtrlDigit,								\
+		0												\
+		}												\
+	}
+
+// This table is searched for a match if a match has not been
+// found in the current state's table
+
+LOCAL_D const SFuncTableEntry defaultTable[]=
+	{
+		{ // prevent key up events generating keycodes
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // prevent any modifer key from changing state
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyModifierKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // filter out any unprocessed codes???
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateNormal,
+			EDoNothing,
+			0
+			}
+		}
+	};
+
+// The table indicating which keys change which modifiers;
+// the state field in this table is ignored
+LOCAL_D const SFuncTableEntry modifierTable[]=
+	{
+        {
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyCapsLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierCapsLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyNumLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierNumLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyScrollLock,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			EToggleModifier,
+			EModifierScrollLock
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierAlt|EModifierLeftAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierFunc|EModifierLeftFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierShift|EModifierLeftShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierCtrl|EModifierLeftCtrl
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierLeftCtrl
+			}
+        },
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierAlt|EModifierRightAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightAlt,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightAlt
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierFunc|EModifierRightFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightFunc,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightFunc
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierShift|EModifierRightShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightShift,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightShift
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			0
+			},
+			{
+			EKeyRightCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOnModifier,
+			EModifierCtrl|EModifierRightCtrl
+			}
+		},
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyRightCtrl,
+			EMatchKey
+			},
+			{
+			EStateUnchanged,
+			ETurnOffModifier,
+			EModifierRightCtrl
+			}
+		}
+	};
+
+// table0 to table12 are the tables corresponding to states
+// 0 to 12 respectively
+
+//LOCAL_D const SFuncTableEntry table0[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+LOCAL_D const SFuncTableEntry table1[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAe
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'c',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcCcedilla
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			's',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1EsTset
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOslash
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'd',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcThorn
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			't',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSoftTh
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'l',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LeftChevron
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'r',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1RightChevron
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'x',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1InvExclam
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'q',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1InvQuest
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAo
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'p',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1Pound
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table2[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'y',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcYumlaut
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1SpaceUmlaut
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table3[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUgrave
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1SpaceGrave
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table4[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'y',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcYacute
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceAcute
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table5[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'n',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcNtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOtilde
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceTilde
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTableEntry table6[]=
+	{
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'a',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcAcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'e',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcEcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'i',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcIcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'o',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcOcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			'u',
+			EMatchKeyCaseInsens
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcUcirc
+			}
+		},
+		{
+			{
+			EModifierFunc|EModifierKeyUp,
+			0
+			},
+			{
+			' ',
+			EMatchKey
+			},
+			{
+			EStateNormal,
+			EPassSpecialKeyThru,
+			ELatin1LcSpaceCirc
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+//LOCAL_D const SFuncTableEntry table7[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+//LOCAL_D const SFuncTableEntry table8[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+//LOCAL_D const SFuncTableEntry table9[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+LOCAL_D const SFuncTableEntry table10[]=
+	{
+		{ // filter out up key strokes
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for ctrl-number presses
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierCtrl
+			},
+			{
+			EKeyNull,
+			EAnyDecimalDigit
+			},
+			{
+			EStateDerivedFromDigitEntered,
+			EAddOnCtrlDigit,
+			0
+			}
+		},
+		{ // pass thru any keys which can't be state control keys
+			{
+			EModifierFunc,
+			0,
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EPassKeyThru,
+			0
+			}
+		},
+		{ // pass thru any keys which can't be state control keys
+			{
+			EModifierCtrl,
+			EModifierCtrl,
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EPassKeyThru,
+			0
+			}
+		},
+		{ // check for FN-q
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'q',
+			EMatchKeyCaseInsens
+			},
+			{
+			1,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for FN-z
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'z',
+			EMatchKeyCaseInsens
+			},
+			{
+			2,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for FN-x
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'x',
+			EMatchKeyCaseInsens
+			},
+			{
+			3,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for FN-c
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'c',
+			EMatchKeyCaseInsens
+			},
+			{
+			4,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for FN-v
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'v',
+			EMatchKeyCaseInsens
+			},
+			{
+			5,
+			EDoNothing,
+			0
+			}
+		},
+		{ // check for FN-b
+			{
+			EModifierCtrl|EModifierFunc|EModifierKeyUp,
+			EModifierFunc
+			},
+			{
+			'b',
+			EMatchKeyCaseInsens
+			},
+			{
+			6,
+			EDoNothing,
+			0
+			}
+		},
+		{ // pass thru any non-processed keys
+			{
+			0,
+			0
+			},
+			{
+			EKeyNull,
+			EAnyKey
+			},
+			{
+			EStateUnchanged,
+			EPassKeyThru,
+			0
+			}
+		}
+	};
+
+//LOCAL_D const SFuncTableEntry table11[]=
+//	{
+//	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+//	};
+
+LOCAL_D const SFuncTableEntry table12[]=
+	{  
+		{
+			{
+			EModifierKeyUp,
+			EModifierKeyUp
+			},
+			{
+			EKeyLeftCtrl,
+			EMatchLeftOrRight
+			},
+			{
+			EStateNormal,
+			EPassCtrlDigitsThru,
+			0
+			}
+		},
+	TABLE_ENTRY_ANOTHER_CTRL_DIGIT
+	};
+
+LOCAL_D const SFuncTable genFuncTables[]=
+	{
+		{
+		0,
+		NULL
+		},
+		{
+		ARRAY_LENGTH(table1),
+		&table1[0]
+		},
+		{
+		ARRAY_LENGTH(table2),
+		&table2[0]
+		},
+		{
+		ARRAY_LENGTH(table3),
+		&table3[0]
+		},
+		{
+		ARRAY_LENGTH(table4),
+		&table4[0]
+		},
+		{
+		ARRAY_LENGTH(table5),
+		&table5[0]
+		},
+		{
+		ARRAY_LENGTH(table6),
+		&table6[0]
+		},
+		{
+		0,
+		NULL
+		},
+		{
+		0,
+		NULL
+		},
+		{
+		0,
+		NULL
+		},
+		{
+		ARRAY_LENGTH(table10),
+		&table10[0]
+		},
+		{
+		0,
+		NULL
+		},
+		{
+		ARRAY_LENGTH(table12),
+		&table12[0]
+		}
+	};
+
+LOCAL_D const SFuncTables FuncTables=
+	{
+		{
+		ARRAY_LENGTH(defaultTable),
+		&defaultTable[0]
+		},
+		{
+		ARRAY_LENGTH(modifierTable),
+		&modifierTable[0]
+		},
+	ARRAY_LENGTH(genFuncTables),
+	&genFuncTables[0]
+	};
+
+LOCAL_D const SScanCodeBlock scanCodeBlock_unmodifiable[]=
+	{
+	{EStdKeyLeftShift, EStdKeyScrollLock}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_unmodifiable[]=
+	{
+	EKeyLeftShift,
+	EKeyRightShift,
+	EKeyLeftAlt,
+	EKeyRightAlt,
+	EKeyLeftCtrl,
+	EKeyRightCtrl,
+	EKeyLeftFunc,
+	EKeyRightFunc,
+	EKeyCapsLock,
+	EKeyNumLock,
+	EKeyScrollLock
+	};
+
+// base: this table traps all of the keyboard's scanCodes except those in convKeyCodes_unmodifiable
+LOCAL_D const SScanCodeBlock scanCodeBlock_base[]=
+	{
+	{EStdKeyNull, EStdKeyDownArrow},
+	{'0', '9'},
+	{'A', 'Z'},
+	{EStdKeyF1, EStdKeyDictaphoneRecord},
+	};
+
+LOCAL_D const TUint16 convKeyCodes_base[]=
+	{
+	EKeyNull,
+	EKeyBackspace,
+	EKeyTab,
+	EKeyEnter,
+	EKeyEscape,
+	' ',
+	EKeyPrintScreen,
+	EKeyPause,
+	EKeyHome,
+	EKeyEnd,
+	EKeyPageUp,
+	EKeyPageDown,
+	EKeyInsert,
+	EKeyDelete,
+	EKeyLeftArrow,
+	EKeyRightArrow,
+	EKeyUpArrow,
+	EKeyDownArrow,
+	'0',
+	'1',
+	'2',
+	'3',
+	'4',
+	'5',
+	'6',
+	'7',
+	'8',
+	'9',
+	'a',
+	'b',
+	'c',
+	'd',
+	'e',
+	'f',
+	'g',
+	'h',
+	'i',
+	'j',
+	'k',
+	'l',
+	'm',
+	'n',
+	'o',
+	'p',
+	'q',
+	'r',
+	's',
+	't',
+	'u',
+	'v',
+	'w',
+	'x',
+	'y',
+	'z',
+	EKeyF1,
+	EKeyF2,
+	EKeyF3,
+	EKeyF4,
+	EKeyF5,
+	EKeyF6,
+	EKeyF7,
+	EKeyF8,
+	EKeyF9,
+	EKeyF10,
+	EKeyF11,
+	EKeyF12,
+	EKeyF13,
+	EKeyF14,
+	EKeyF15,
+	EKeyF16,
+	EKeyF17,
+	EKeyF18,
+	EKeyF19,
+	EKeyF20,
+	EKeyF21,
+	EKeyF22,
+	EKeyF23,
+	EKeyF24,
+	'`',
+	',',
+	'.',
+	'/',
+	'\\',
+	';',
+	'\'',
+#ifndef US_KEYBOARD
+	'#',
+#else
+	'\\',
+#endif
+	'[',
+	']',
+	'-',
+	'=',
+	'/',
+	'*',
+	'-',
+	'+',
+	EKeyEnter,
+	EKeyEnd,
+	EKeyDownArrow,
+	EKeyPageDown,
+	EKeyLeftArrow,
+	EKeyNull, // numeric keypad '5'
+	EKeyRightArrow,
+	EKeyHome,
+	EKeyUpArrow,
+	EKeyPageUp,
+	EKeyInsert,
+	EKeyDelete,
+    EKeyMenu,
+    EKeyBacklightOn,
+    EKeyBacklightOff,
+    EKeyBacklightToggle,
+    EKeyIncContrast,
+    EKeyDecContrast,
+    EKeySliderDown,
+    EKeySliderUp,
+    EKeyDictaphonePlay,
+    EKeyDictaphoneStop,
+    EKeyDictaphoneRecord,
+	};
+
+// caps-lock: this table traps those scanCodes which are affected by caps-lock
+LOCAL_D const SScanCodeBlock scanCodeBlock_capsLock[]=
+	{
+	{'A', 'Z'}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_capsLock[]=
+	{
+	'A',
+	'B',
+	'C',
+	'D',
+	'E',
+	'F',
+	'G',
+	'H',
+	'I',
+	'J',
+	'K',
+	'L',
+	'M',
+	'N',
+	'O',
+	'P',
+	'Q',
+	'R',
+	'S',
+	'T',
+	'U',
+	'V',
+	'W',
+	'X',
+	'Y',
+	'Z'
+	};
+
+// shift: this table traps those scanCodes which are affected
+// by shift EXCEPT for those scanCodes affected by caps-lock
+LOCAL_D const SScanCodeBlock scanCodeBlock_shift[]=
+	{
+	{'0', '9'},
+	{EStdKeyXXX, EStdKeyEquals},
+	};
+
+LOCAL_D const TUint16 convKeyCodes_shift[]=
+	{
+	')',
+	'!',
+	'"',
+	ELatin1Pound,
+	'$',
+	'%',
+	'^',
+	'&',
+	'*',
+	'(',
+	ELatin1LogicNot,
+	'<',
+	'>',
+	'?',
+	'|',
+	':',
+	'@',
+	'~',
+	'{',
+	'}',
+	'_',
+	'+'
+	};
+
+// numlock: this table traps those scanCodes which are affected by numlock
+LOCAL_D const SScanCodeBlock scanCodeBlock_numLock[]=
+	{
+	{EStdKeyNkpForwardSlash, EStdKeyNkpFullStop}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_numLock[]=
+	{
+	'/',
+	'*',
+	'-',
+	'+',
+	EKeyEnter,
+	'1',
+	'2',
+	'3',
+	'4',
+	'5',
+	'6',
+	'7',
+	'8',
+	'9',
+	'0',
+	'.'
+	};
+
+// func: this table traps those scanCodes which are affected
+// by func but not shift
+LOCAL_D const SScanCodeBlock scanCodeBlock_func[]=
+	{
+	{'0', '9'},
+	{'K', 'L'},
+	{'U', 'U'},
+	{'I', 'I'},
+	{'O', 'P'},
+	{EStdKeySingleQuote, EStdKeySingleQuote},
+	{EStdKeyLeftArrow, EStdKeyDownArrow},
+	{EStdKeyTab, EStdKeyTab},
+	{EStdKeyEscape, EStdKeyEscape},
+	{'M', 'M'},
+	{EStdKeyComma, EStdKeyFullStop},
+	{EStdKeySpace, EStdKeySpace},
+	{EStdKeyMenu, EStdKeyMenu},
+	};
+
+LOCAL_D const TUint16 convKeyCodes_func[]=
+	{
+	'}',
+	'_',
+	'#',
+	'\\',
+	'@',
+	'<',
+	'>',
+	'[',
+	']',
+	'{',
+	'~',
+	';',
+	'/',
+	'*',
+	'-',
+	'+',
+	':',
+	EKeyHome,
+	EKeyEnd,
+	EKeyPageUp,
+	EKeyPageDown,
+	EKeyCapsLock,
+	EKeyOff,
+	EKeyDecContrast,
+	EKeyHelp,
+	EKeyIncContrast,
+	EKeyBacklightToggle,
+	EKeyDial,
+	};
+
+// func: this table traps those scanCodes which are affected
+// by func and shift - lower case entries
+LOCAL_D const SScanCodeBlock scanCodeBlock_funcUnshifted[]=
+	{
+	{'E', 'E'},
+	};
+
+LOCAL_D const TUint16 convKeyCodes_funcUnshifted[]=
+	{
+	ELatin1LcEacute,
+	};
+
+// func: this table traps those scanCodes which are affected
+// by func and shift - upper case entries
+LOCAL_D const SScanCodeBlock scanCodeBlock_funcShifted[]=
+	{
+	{'E', 'E'},
+	};
+
+LOCAL_D const TUint16 convKeyCodes_funcShifted[]=
+	{
+	ELatin1UcEacute,
+	};
+
+// ctrl: this table traps those scanCodes which are affected by ctrl
+LOCAL_D const SScanCodeBlock scanCodeBlock_ctrl[]=
+	{
+// The space key gets handled else where, otherwise it gets
+// thrown away as a NULL key
+//	{EStdKeySpace, EStdKeySpace},
+
+	{'A', 'Z'}
+	};
+
+LOCAL_D const TUint16 convKeyCodes_ctrl[]=
+	{
+//	0,
+	1,
+	2,
+	3,
+	4,
+	5,
+	6,
+	7,
+	8,
+	9,
+	10,
+	11,
+	12,
+	13,
+	14,
+	15,
+	16,
+	17,
+	18,
+	19,
+	20,
+	21,
+	22,
+	23,
+	24,
+	25,
+	26
+	};
+
+LOCAL_D const SConvSubTable
+	convSubTable_unmodifiable=
+		{
+		&convKeyCodes_unmodifiable[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_unmodifiable),
+			&scanCodeBlock_unmodifiable[0]
+			}
+		},
+    convSubTable_base=
+		{
+		&convKeyCodes_base[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_base),
+			&scanCodeBlock_base[0]
+			}
+		},
+	convSubTable_capsLock=
+		{
+		&convKeyCodes_capsLock[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_capsLock),
+			&scanCodeBlock_capsLock[0]
+			}
+		},
+	convSubTable_shift=
+		{
+		&convKeyCodes_shift[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_shift),
+			&scanCodeBlock_shift[0]
+			}
+		},
+	convSubTable_numLock=
+		{
+		&convKeyCodes_numLock[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_numLock),
+			&scanCodeBlock_numLock[0]
+			}
+        },
+	convSubTable_func=
+		{
+		&convKeyCodes_func[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_func),
+			&scanCodeBlock_func[0]
+			}
+		},
+	convSubTable_funcUnshifted=
+		{
+		&convKeyCodes_funcUnshifted[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_funcUnshifted),
+			&scanCodeBlock_funcUnshifted[0]
+			}
+		},
+	convSubTable_funcShifted=
+		{
+		&convKeyCodes_funcShifted[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_funcShifted),
+			&scanCodeBlock_funcShifted[0]
+			}
+		},
+	convSubTable_ctrl=
+		{
+		&convKeyCodes_ctrl[0],
+			{
+			ARRAY_LENGTH(scanCodeBlock_ctrl),
+			&scanCodeBlock_ctrl[0]
+			}
+		};
+
+// Some modifiers, e.g. shift, may required more than one table (other than "base")
+// to be searched; therefore arrays of tables are required
+LOCAL_D const SConvSubTable
+	* const convSubTableArray_unmodifiable[]={&convSubTable_unmodifiable},
+	* const convSubTableArray_base[]={&convSubTable_base},
+	* const convSubTableArray_capsLock[]={&convSubTable_capsLock},
+	* const convSubTableArray_shift[]={&convSubTable_capsLock, &convSubTable_shift},
+	* const convSubTableArray_capsLockShift[]={&convSubTable_shift},
+	* const convSubTableArray_numLock[]={&convSubTable_numLock},
+	* const convSubTableArray_func[]={&convSubTable_func,&convSubTable_funcUnshifted},
+	* const convSubTableArray_funcShift[]={&convSubTable_func,&convSubTable_funcShifted},
+	* const convSubTableArray_ctrl[]={&convSubTable_ctrl};
+
+// The order of these nodes is VITAL, as the scanCode/modifiers are
+// searched for a match in this order
+LOCAL_D const SConvTableNode convTableNodes[]=
+	{
+		{
+			{
+			0,
+			0
+			},
+		ARRAY_LENGTH(convSubTableArray_unmodifiable),
+		&convSubTableArray_unmodifiable[0]
+		},
+		{
+			{
+			EModifierCtrl,
+			EModifierCtrl
+			},
+		ARRAY_LENGTH(convSubTableArray_ctrl),
+		&convSubTableArray_ctrl[0]
+		},
+		{
+			{
+			EModifierNumLock,
+			EModifierNumLock
+			},
+		ARRAY_LENGTH(convSubTableArray_numLock),
+		&convSubTableArray_numLock[0]
+		},
+		{
+			{
+			EModifierFunc|EModifierShift|EModifierCapsLock,
+			EModifierFunc
+			},
+		ARRAY_LENGTH(convSubTableArray_func),
+		&convSubTableArray_func[0]
+		},
+		{
+			{
+			EModifierFunc|EModifierShift|EModifierCapsLock,
+			EModifierFunc|EModifierShift|EModifierCapsLock
+			},
+		ARRAY_LENGTH(convSubTableArray_func),
+		&convSubTableArray_func[0]
+		},
+		{
+			{
+			EModifierFunc|EModifierShift|EModifierCapsLock,
+			EModifierFunc|EModifierShift
+			},
+		ARRAY_LENGTH(convSubTableArray_funcShift),
+		&convSubTableArray_funcShift[0]
+		},
+		{
+			{
+			EModifierFunc|EModifierShift|EModifierCapsLock,
+			EModifierFunc|EModifierCapsLock
+			},
+		ARRAY_LENGTH(convSubTableArray_funcShift),
+		&convSubTableArray_funcShift[0]
+		},
+		{
+			{
+			EModifierCapsLock|EModifierShift,
+			EModifierCapsLock
+			},
+		ARRAY_LENGTH(convSubTableArray_capsLock),
+		&convSubTableArray_capsLock[0]
+		},
+		{
+			{
+			EModifierShift|EModifierCapsLock,
+			EModifierShift
+			},
+		ARRAY_LENGTH(convSubTableArray_shift),
+		&convSubTableArray_shift[0]
+		},
+		{
+			{
+			EModifierCapsLock|EModifierShift,
+			EModifierCapsLock|EModifierShift
+			},
+		ARRAY_LENGTH(convSubTableArray_capsLockShift),
+		&convSubTableArray_capsLockShift[0]
+		},
+		{
+			{
+			0,
+			0
+			},
+		ARRAY_LENGTH(convSubTableArray_base),
+		&convSubTableArray_base[0]
+		}
+	};
+
+// The top-level exported data structure of all the conversion tables
+LOCAL_D const SConvTable ConvTable=
+	{
+	ARRAY_LENGTH(convTableNodes),
+	&convTableNodes[0]
+	};
+
+// The list of scan-codes on the numeric keypad
+LOCAL_D const SScanCodeBlock keypadScanCodeBlockArray[]=
+	{
+	{EStdKeyNumLock, EStdKeyNumLock},
+	{EStdKeyNkpForwardSlash, EStdKeyNkpFullStop}
+	};
+
+LOCAL_D const SScanCodeBlockList ConvTableKeypadScanCodes=
+	{
+	ARRAY_LENGTH(keypadScanCodeBlockArray),
+	&keypadScanCodeBlockArray[0]
+	};
+
+// The list of non-autorepeating key-codes
+LOCAL_D const TUint16 nonAutorepKeyCodeArray[]=
+	{
+	EKeyEscape,
+	EKeyPrintScreen,
+	EKeyPause,
+	EKeyInsert,
+	EKeyLeftShift,
+	EKeyRightShift,
+	EKeyLeftAlt,
+	EKeyRightAlt,
+	EKeyLeftCtrl,
+	EKeyRightCtrl,
+	EKeyLeftFunc,
+	EKeyRightFunc,
+	EKeyCapsLock,
+	EKeyNumLock,
+	EKeyScrollLock,
+    EKeyMenu,
+    EKeyDictaphonePlay,
+    EKeyDictaphoneStop,
+    EKeyDictaphoneRecord
+	};
+
+LOCAL_D const SKeyCodeList ConvTableNonAutorepKeyCodes=
+	{
+	ARRAY_LENGTH(nonAutorepKeyCodeArray),
+	&nonAutorepKeyCodeArray[0]
+	};
+
+EXPORT_C void KeyDataSettings(TRadix &aRadix,TCtrlDigitsTermination &aCtrlDigitsTermination,TInt &aDefaultCtrlDigitsMaxCount,
+							  TInt &aMaximumCtrlDigitsMaxCount)
+	{
+	aRadix=EDecimal;
+	aCtrlDigitsTermination=ETerminationByCtrlUp;
+	aDefaultCtrlDigitsMaxCount=3;
+	aMaximumCtrlDigitsMaxCount=10;
+	}
+
+EXPORT_C void KeyDataFuncTable(SFuncTables &aFuncTables)
+	{
+	aFuncTables=FuncTables;
+	}
+
+EXPORT_C void KeyDataConvTable(SConvTable &aConvTable, TUint &aConvTableFirstScanCode,TUint &aConvTableLastScanCode,
+							 SScanCodeBlockList &aKeypadScanCode,SKeyCodeList &aNonAutorepKeyCodes)
+	{
+	aConvTable=ConvTable;
+	aConvTableFirstScanCode=scanCodeBlock_base[0].firstScanCode;
+	aConvTableLastScanCode=scanCodeBlock_base[ARRAY_LENGTH(scanCodeBlock_base)-1].lastScanCode;
+	aKeypadScanCode=ConvTableKeypadScanCodes;
+	aNonAutorepKeyCodes=ConvTableNonAutorepKeyCodes;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/keymap/keymap.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+
+TARGET			VariantTarget(ekdata,dll)
+TARGETTYPE		dll
+LINKAS			ekdata.dll
+
+SYSTEMINCLUDE	\epoc32\include
+
+SOURCE			keymap.cpp
+
+LIBRARY			euser.lib
+
+DEFFILE			..\..\e32\~\ekdata.def
+
+NOSTRICTDEF
+
+UID             0x1000008d 0x100039e0
+VENDORID        0x70000001
+
+CAPABILITY 		all
+MACRO			__SECURE_API__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/monitor/monap.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#define	__MONAP_MMP__
+
+#include    <variant.mmh>
+#include    "..\..\e32\kernel\exmondebug.mmp"
+
+TARGET			VariantTarget(exmondebug,dll)
+
+SYSTEMINCLUDE	\epoc32\include\drivers
+SYSTEMINCLUDE   ..\serial
+
+SOURCEPATH		.
+SOURCE			monitor.cpp
+
+LIBRARY			PlatformLib
+
+CAPABILITY		all
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/monitor/monitor.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <monitor.h>
+#include <system_priv.h>
+
+#include "syborg_serial.h"
+
+void CrashDebugger::InitUart()
+{
+  TUint32 debugPortBase = VARIANT_INTERFACE::DebugPortAddr();
+  TUint8 res = ReadReg(debugPortBase, 0);
+  WriteReg(debugPortBase,DCommSyborgSoc::SERIAL_INT_ENABLE,0);
+}
+
+void CrashDebugger::UartOut(TUint aChar)
+{
+  TUint32 debugPortBase = VARIANT_INTERFACE::DebugPortAddr();
+  WriteReg(debugPortBase,DCommSyborgSoc::SERIAL_DATA,aChar);
+}
+
+TUint8 CrashDebugger::UartIn()
+{
+  TUint32 debugPortBase = VARIANT_INTERFACE::DebugPortAddr();
+  while (ReadReg(debugPortBase,DCommSyborgSoc::SERIAL_FIFO_COUNT)==0)
+	;
+
+  return ReadReg(debugPortBase,DCommSyborgSoc::SERIAL_DATA);
+}
+
+TBool CrashDebugger::CheckPower()
+{
+	return EFalse;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/pointer/pointer.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(epointer,dll)
+TARGETTYPE		kext
+LINKAS			epointer.dll
+
+SYSTEMINCLUDE   .
+SYSTEMINCLUDE	AsspNKernIncludePath
+
+SOURCEPATH		.
+SOURCE			syborg_pointer.cpp
+
+//LIBRARY			ekern.lib
+LIBRARY			PlatformLib
+
+//NOEXPORTLIBRARY
+
+//DEFFILE			..\e32\~\empty.def
+//DEFFILE			.\~\cmse.def
+
+//NOSTRICTDEF
+
+UID				0x100039cf 0x100000db
+VENDORID        0x70000001
+
+CAPABILITY 		all
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/pointer/syborg_pointer.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,276 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic pointer driver
+*
+*/
+
+//#define DEBUG
+
+#include <syborg_priv.h>
+#include "syborg_pointer.h"
+
+TPointerRv::TPointerRv():
+  iRxDfc(RxDfc,this,Kern::DfcQue0(),1)
+{
+  __DEBUG_PRINT("TPointerRv::TPointerRv()");
+  TInt r = Interrupt::Bind(EIntPointer,Isr,this);
+  if(r != KErrNone)
+	__KTRACE_OPT(KPANIC, Kern::Printf("TPointerRv::TPointerRv() Interrupt::Bind(%d)=%d",
+									  EIntPointer, r));
+  iPointerOn = ETrue;
+  iLastBut = 0;
+
+  Interrupt::Enable(EIntPointer);
+}
+
+TPointerRv::~TPointerRv()
+{
+}
+
+struct TPointerRv::PData* TPointerRv::FifoPop(void)
+{
+  struct TPointerRv::PData* val = &iPDataFifo[iFifoPos];
+  iFifoPos++;
+  iFifoCount--;
+  
+  if (iFifoPos == FIFO_SIZE)
+	iFifoPos = 0;
+
+  return val;
+}
+
+void TPointerRv::FifoPush(struct TPointerRv::PData* val)
+{
+  TInt slot;
+  
+  if (iFifoCount == FIFO_SIZE)
+	return;
+  
+  slot = iFifoPos + iFifoCount;
+  if (slot >= FIFO_SIZE)
+	slot -= FIFO_SIZE;
+  iPDataFifo[slot] = *val;
+  iFifoCount++;
+
+  //  __DEBUG_PRINT("TPointerRv::FifoPush %d %d %d %d",val->x, val->y, val->z, val->but);
+  //  __DEBUG_PRINT("TPointerRv::FifoPush %d %d %d %d",iPDataFifo[slot].x, iPDataFifo[slot].y, iPDataFifo[slot].z, iPDataFifo[slot].but);
+
+}
+
+void TPointerRv::Init3()
+{
+  __DEBUG_PRINT("TPointerRv::Init3");
+
+  TInt reg = ReadReg(KHwBaseKmiPointer,POINTER_ID);
+  WriteReg(KHwBaseKmiPointer,POINTER_INT_ENABLE,1);
+  
+  TInt r = Kern::AddHalEntry(EHalGroupMouse,DoPointerHalFunction,this);
+  if(r != KErrNone)
+	__KTRACE_OPT(KPANIC, Kern::Printf("TPointerRv::Init3(): Kern::AddHalEntry()=%d", r));
+
+  // Get information about the screen display mode
+  TPckgBuf<TVideoInfoV01> buf;
+  TVideoInfoV01& videoInfo = buf();
+
+  r = Kern::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&buf, NULL);
+  if(r != KErrNone)
+	__KTRACE_OPT(KPANIC, Kern::Printf("TPointerRv::Init3(): Kern::HalFunction(EDisplayHalCurrentModeInfo)=%d", r));
+  
+  iScreenWidth  = videoInfo.iSizeInPixels.iWidth;
+  iScreenHeight = videoInfo.iSizeInPixels.iHeight;
+  iDisplayMode  = videoInfo.iDisplayMode;
+  ix = iy = 0;
+
+  iXFactor = Fixed(iScreenWidth) / Fixed(0x8000);
+  iYFactor = Fixed(iScreenHeight) / Fixed(0x8000);
+  
+  iFifoPos = iFifoCount = 0;
+}
+
+
+void TPointerRv::Process(TPointerRv *i, struct TPointerRv::PData *pd)
+{
+  TRawEvent e;
+
+  //  __DEBUG_PRINT("Event: X=%d Y=%d Point %d", pd->x, pd->y, pd->but);
+  //  __DEBUG_PRINT("  Last X=%d Y=%d Point %d", i->ix, i->iy, i->iLastBut);
+
+  //  i->ix += pd->x;
+  //  i->iy += pd->y;
+  
+  i->ix = int(Fixed(pd->x) * i->iXFactor);
+  i->iy = int(Fixed(pd->y) * i->iYFactor);
+
+  switch(pd->but)
+	{
+	case 0:  // Button released
+	  switch(i->iLastBut)
+		{
+		case 0:
+		  if( (pd->x!=0) || (pd->y!=0) ) {
+			e.Set(TRawEvent::EPointerMove, i->ix, i->iy);
+			__DEBUG_PRINT("1 EPointerMove (x:%d y:%d)", i->ix, i->iy);
+		  }
+		  goto fin;
+		case 1: // Left
+		  e.Set(TRawEvent::EButton1Up, i->ix, i->iy);
+		  __DEBUG_PRINT("2 EButton1UP (x:%d y:%d)", i->ix, i->iy);
+		  goto fin;
+		case 2: // Right
+		  e.Set(TRawEvent::EButton2Up, i->ix, i->iy);
+		  __DEBUG_PRINT("3 EButton2UP (x:%d y:%d)", i->ix, i->iy);
+		  goto fin;
+		}
+	case 1: // Left
+	  if (i->iLastBut == 0) {
+		e.Set(TRawEvent::EButton1Down, i->ix, i->iy);
+		__DEBUG_PRINT("4 EButton1Down (x:%d y:%d)", i->ix, i->iy);
+	  }
+	  else if( (pd->x!=0) || (pd->y!=0) ) {
+		e.Set(TRawEvent::EPointerMove, i->ix, i->iy);
+		__DEBUG_PRINT("5 EPointerMove (x:%d y:%d)", i->ix, i->iy);
+	  }
+	  break;
+	case 2: // Right
+	  if (i->iLastBut == 0) {
+		e.Set(TRawEvent::EButton2Down, i->ix, i->iy);
+		__DEBUG_PRINT("6 EButton2Down (x:%d y:%d)", i->ix, i->iy);
+	  }
+	  else if( (pd->x!=0) || (pd->y!=0) ) {
+		e.Set(TRawEvent::EPointerMove, i->ix, i->iy);
+		__DEBUG_PRINT("7 EPointerMove (x:%d y:%d)", i->ix, i->iy);
+	  }
+	  break;
+
+	}
+ fin:
+  Kern::AddEvent(e);
+  i->iLastBut = pd->but;
+}
+
+void TPointerRv::RxDfc(TAny* aPtr)
+{
+  __DEBUG_PRINT("TPointerRv::RxDfc");
+
+  TPointerRv* i = static_cast<TPointerRv*>(aPtr);  
+
+  while(i->iFifoCount>0) {
+	struct TPointerRv::PData *pd= i->FifoPop();
+	Process(i,pd);
+  }
+}
+
+void TPointerRv::Isr(TAny* aPtr)
+{
+  __DEBUG_PRINT("TPointerRv::Isr");
+
+  TPointerRv& k = *(TPointerRv*)aPtr;
+  // interrupts are now auto clear
+
+  while(ReadReg(KHwBaseKmiPointer, POINTER_FIFO_COUNT)!=0) {
+	struct TPointerRv::PData pd;
+	pd.x = ReadReg(KHwBaseKmiPointer,POINTER_X);
+	pd.y = ReadReg(KHwBaseKmiPointer,POINTER_Y);
+	pd.z = ReadReg(KHwBaseKmiPointer,POINTER_Z);
+	pd.but = ReadReg(KHwBaseKmiPointer,POINTER_BUTTONS);  
+	k.FifoPush(&pd);
+	WriteReg(KHwBaseKmiPointer,POINTER_LATCH,0);	
+  }
+  
+  //  WriteReg(KHwBaseKmiPointer,POINTER_CLEAR_INT,0);
+  Interrupt::Clear(EIntPointer); 
+  k.iRxDfc.Add();
+}
+
+TInt TPointerRv::DoPointerHalFunction(TAny* aThis, TInt aFunction, TAny* a1, TAny* a2)
+{
+  return static_cast<TPointerRv*>(aThis)->PointerHalFunction(aFunction,a1,a2);
+}
+
+TInt TPointerRv::PointerHalFunction(TInt aFunction, TAny* a1, TAny* /*a2*/)
+{
+  __DEBUG_PRINT("TPointerRv::PointerHalFunction");
+
+  TInt r=KErrNone;
+
+  switch(aFunction)
+    {
+	case EMouseHalMouseState:
+	  {
+		kumemput32(a1, (TBool*)&iPointerOn, sizeof(TBool));
+		break;
+	  }			
+	case EMouseHalSetMouseState:
+	  {
+	        __SECURE_KERNEL(
+	           if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,
+		        __PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EMouseHalSetMouseState")))
+		     return KErrPermissionDenied;
+		   );
+		if(((TBool)a1 == HAL::EMouseState_Visible) && (iPointerOn == (TBool)EFalse))
+		  {
+			iPointerOn=(TBool)ETrue;
+		  }            
+		else if(((TBool)a1 == HAL::EMouseState_Invisible) && (iPointerOn==(TBool)ETrue))        	    
+		  {
+			iPointerOn=(TBool)EFalse;
+		  }            
+		break;
+	  }            
+	case EMouseHalMouseInfo:
+	  {
+		TPckgBuf<TMouseInfoV01> vPckg;
+		TMouseInfoV01& xyinfo = vPckg();
+		xyinfo.iMouseButtons = 2;
+		xyinfo.iMouseAreaSize.iWidth = iScreenWidth;
+		xyinfo.iMouseAreaSize.iHeight = iScreenHeight;
+		xyinfo.iOffsetToDisplay.iX = 0;
+		xyinfo.iOffsetToDisplay.iY = 0;
+		Kern::InfoCopy(*(TDes8*)a1,vPckg);
+		break;
+	  }		    
+        case EMouseHalSetMouseSpeed:
+	  {
+	        __SECURE_KERNEL(
+	           if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,
+		        __PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EMouseHalSetMouseSpeed")))
+		     return KErrPermissionDenied;
+		   );
+		// fall thru to NotSupported
+	  }
+        case EMouseHalSetMouseAcceleration:
+	  {
+	        __SECURE_KERNEL(
+	           if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,
+		        __PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EMouseHalSetMouseAcceleration")))
+		     return KErrPermissionDenied;
+		   );
+		// fall thru to NotSupported
+	  }
+	default:
+	  {
+		r = KErrNotSupported;
+		break;
+	  }			
+	}
+  return r;
+}
+
+DECLARE_STANDARD_EXTENSION()
+{
+  __DEBUG_PRINT("DECLARE_STANDARD_EXTENSION");
+  TPointerRv *d = new TPointerRv;
+  d->Init3();
+  return KErrNone;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/pointer/syborg_pointer.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic pointer driver
+*
+*/
+
+#ifndef _SYBORG_POINTER_H
+#define _SYBORG_POINTER_H
+
+#include <kernel.h>
+#include <system.h>
+#include <videodriver.h>
+#include <hal.h>
+
+#define FIFO_SIZE 16
+
+#ifdef DEBUG
+#define __DEBUG_PRINT(format...)    Kern::Printf(format)
+#else
+#define __DEBUG_PRINT(format...)    __KTRACE_OPT(KBOOT,Kern::Printf(format))
+#endif
+
+class TPointerRv
+{
+public:
+  TPointerRv();
+  virtual ~TPointerRv();
+  static TInt DoPointerHalFunction(TAny* aThis, TInt aFunction, TAny* a1, TAny* a2);
+  TInt PointerHalFunction(TInt aFunction, TAny* a1, TAny* a2);
+  void Init3();
+
+ private:
+  struct PData {
+	TInt x;
+	TInt y;
+	TInt z;
+	TInt but;
+  };
+
+  struct PData* FifoPop(void);
+  void FifoPush(struct PData*);
+
+  struct PData iPDataFifo[FIFO_SIZE];
+  TInt iFifoPos;
+  TInt iFifoCount;
+
+ private:
+  static void Isr(TAny* aPtr);
+  static void RxDfc(TAny* aPtr );
+  static void Process(TPointerRv *i, struct PData *);
+
+  TDfc iRxDfc;
+	
+  TBool iPointerOn;       // cursor visiability
+  TInt  iScreenWidth;
+  TInt  iScreenHeight;
+  TInt  iDisplayMode;
+
+  TInt ix,iy;
+  TInt iLastBut;
+
+  
+ public:
+
+  enum {
+    POINTER_ID          = 0,
+    POINTER_LATCH       = 1,
+    POINTER_FIFO_COUNT  = 2,
+    POINTER_X           = 3,
+    POINTER_Y           = 4,
+    POINTER_Z           = 5,
+    POINTER_BUTTONS     = 6,
+    POINTER_INT_ENABLE  = 7
+  };
+
+ private:
+  // Fixed point maths
+  class Fixed {
+
+  private:
+	int g;
+	const static int BP = 8;
+	const static int BP2 = BP*2;
+	enum FixedRaw { RAW };
+    Fixed(FixedRaw, int guts) : g(guts) {}
+	
+  public:
+    Fixed() : g(0) {}
+    Fixed(const Fixed& a) : g( a.g ) {}
+    Fixed(int a) : g( a << BP ) {}
+	operator int() { return g>>BP; }
+	Fixed operator +() const { return Fixed(RAW,g); }
+	Fixed operator -() const { return Fixed(RAW,-g); }
+	Fixed operator +(const Fixed& a) const { return Fixed(RAW, g + a.g); }
+	Fixed operator -(const Fixed& a) const { return Fixed(RAW, g - a.g); }
+	Fixed operator *(const Fixed& a) const { return Fixed(RAW,  (int)( ((long long)g * (long long)a.g ) >> BP)); }
+	Fixed operator /(const Fixed& a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(a.g)) >> BP) ); }
+  };
+
+  Fixed iXFactor;
+  Fixed iYFactor;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/rom/base_syborg.iby	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Used by techview roms
+*
+*/
+
+#ifndef __BASE_SYBORG_IBY__
+#define __BASE_SYBORG_IBY__
+
+#define HEAPMAX(x)
+//#define FIXED	fixed
+#define FIXED
+
+kerneltrace 0x80000000
+
+memmodel multiple 0x100000
+//memmodel flexible 0x100000 0x1000 -0x4000
+//dlldatatop 0x7f000000
+
+multikernel
+bootbinary=		KERNEL_DIR\_PLATFORM_NAME_bootloader_bootrom.bin
+
+debugport 0
+romsize=0x2000000
+romlinearbase=0x80000000
+romalign=0x10
+kerneldataaddress=0xC8000000
+kernelheapmin=0x08000			// calculated at boot time
+kernelheapmax=0x00FFC000
+dataaddress=0x400000
+defaultstackreserve=0x200000
+romchecksum=0x12345678
+
+// Must align kernel to 16K boundary since exception vectors will be mapped at 0xFFFF0000
+primary[VARID]=		KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_ekern.exe		\sys\bin\ekern.exe	code-align 0x4000
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_btracex.ldd 	\sys\bin\btracex.ldd
+file=			ABI_DIR\DEBUG_DIR\btracec.dll	            		\sys\bin\btracec.dll
+
+define BTRACEX_LDD _PLATFORM_NAME_btracex.ldd
+            
+variant[VARID]=		KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_kasyborg.dll 	\sys\bin\kasyborg.dll
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_exmoncommon.dll    	\sys\bin\exmoncommon.dll
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_exmondebug.dll     	\sys\bin\exmondebug.dll
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\kdebug.dll			        \sys\bin\kdebug.dll
+
+#ifdef RMDEBUG
+#include "..\include\trk.iby"
+#endif
+
+// IEEE-mode VFP support
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\evfp.dll			        \sys\bin\evfp.dll
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_lcd.dll		\sys\bin\lcd.dll
+
+device[VARID]=		KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_eserial.pdd		\sys\bin\euart1.pdd
+device[VARID]=		KERNEL_DIR\DEBUG_DIR\ecomm.ldd				\sys\bin\ecomm.ldd
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\elocd.ldd				\sys\bin\elocd.ldd
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_epointer.dll	\sys\bin\epointer.dll
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_medint.pdd	        \sys\bin\medint.pdd
+
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\exstart.dll		 	\sys\bin\exstart.dll
+
+// Keyboard driver
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_ekeyb.dll		\sys\bin\ekeyb.dll
+
+// Kernel pipe
+device[VARID]=		KERNEL_DIR\DEBUG_DIR\pipelib.ldd			\sys\bin\pipelib.ldd
+
+// Host Filesystem
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_svphostfsdriver.ldd sys\bin\svphostfsdriver.ldd
+file=			KERNEL_DIR\DEBUG_DIR\svphostfsy.fsy			sys\bin\svphostfsy.fsy
+file=			KERNEL_DIR\DEBUG_DIR\svphostfs.exe			sys\bin\svphostfs.exe
+file=			KERNEL_DIR\DEBUG_DIR\svphostfsstart.exe			sys\bin\sysstart.exe
+
+// file=			KERNEL_DIR\DEBUG_DIR\stdnew.dll				sys\bin\stdnew.dll
+
+// Snap Driver
+extension[VARID]=	KERNEL_DIR\DEBUG_DIR\_PLATFORM_NAME_svpsnapdriver.ldd	sys\bin\svpsnapdriver.ldd
+file=			KERNEL_DIR\DEBUG_DIR\snapapp.exe			sys\bin\snapapp.exe
+
+// Estart drive mapping setup files.
+data=			EPOCROOT##epoc32\rom\syborg\estart.txt			\sys\data\estart.txt
+
+define	HAL_DLL		_PLATFORM_NAME_hal.dll
+define	ESTART_EXE	e32strt.exe
+define	KEYMAP_FILE	_PLATFORM_NAME_ekdata
+#define	SCDV_DLL        _PLATFORM_NAME_scdv.dll
+#define	EUSER_DLL	_PLATFORM_NAME_euser.dll
+
+#endif  // __BASE_SYBORG_IBY__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/rom/header.iby	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#define HEAPMAX(x)
+
+#define VARID		0x0b0a0001
+#define MAGIC		0x0b0a0001
+#define ALL			0x0b0a0001
+#define FIXED
+
+kerneltrace 0x80000000
+
+memmodel multiple 0x100000
+//memmodel flexible 0x100000 0x1000 -0x4000
+//dlldatatop 0x7f000000
+
+trace 0x10
+collapse arm gcc 0
+multikernel
+
+version=0.01
+bootbinary=\epoc32\release\##MAIN##\_syborg_bootloader_bootrom.bin
+
+debugport 0
+romsize=0x2000000
+romlinearbase=0x80000000
+romalign=0x10
+kerneldataaddress=0xC8000000
+kernelheapmin=0x08000			// calculated at boot time
+kernelheapmax=0x00FFF000
+dataaddress=0x400000
+defaultstackreserve=0x200000
+romchecksum=0x12345678
+
+nowrapper				// no rom header
+
+#ifdef UNICODE
+unicode
+#endif
+
+#define VARIANT_PATH syborg
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/rom/kernel.iby	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Used by textshell roms
+*
+*/
+
+//#define USE_AUTOEXEC
+
+#define	EUSER_DLL	_##VARIANT##_EUSER.DLL
+
+// Must align kernel to 16K boundary since exception vectors will be mapped at 0xFFFF0000
+primary[VARID]=		\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_EKERN.EXE		\sys\bin\EKERN.EXE	code-align 0x4000
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_BTRACEX.LDD		\sys\bin\BTRACEX.LDD
+variant[VARID]=		\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_KASYBORG.DLL		\sys\bin\KASYBORG.DLL
+
+// IEEE-mode VFP support
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\EVFP.DLL				\sys\bin\EVFP.DLL
+
+// Common monitor support. Must be before both interactive debugger and automatic logger.
+extension[VARID]=   	\Epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_EXMONCOMMON.DLL 	\sys\bin\EXMONCOMMON.DLL
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_EXMONDEBUG.DLL  	\sys\bin\EXMONDEBUG.DLL
+
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\KDEBUG.DLL				\sys\bin\KDEBUG.DLL
+
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_LCD.DLL		\sys\bin\LCD.DLL
+device[VARID]=		\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_ESERIAL.PDD    	\sys\bin\ESERIAL.PDD
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\ELOCD.LDD				\sys\bin\ELOCD.LDD
+
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_EPOINTER.DLL		\sys\bin\EPOINTER.DLL
+
+device[VARID]=		\epoc32\release\##KMAIN##\##BUILD##\ECOMM.LDD				\sys\bin\ECOMM.LDD
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\EXSTART.DLL				\sys\bin\EXSTART.DLL
+
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_EKEYB.DLL		\sys\bin\EKEYB.DLL
+
+file[VARID]=		\epoc32\release\##MAIN##\##BUILD##\_##VARIANT##_EKDATA.DLL		\sys\bin\EKDATA.DLL
+
+// Kernel pipe
+device[VARID]=      	\epoc32\release\##KMAIN##\##BUILD##\PIPELIB.LDD 		        \sys\bin\PIPELIB.LDD
+
+// Host Filesystem
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_svphostfsdriver.ldd	\sys\bin\svphostfsdriver.ldd
+file=			\epoc32\release\##KMAIN##\##BUILD##\svphostfsy.fsy			\sys\bin\svphostfsy.fsy
+file=			\epoc32\release\##KMAIN##\##BUILD##\svphostfs.exe			\sys\bin\svphostfs.exe
+file=			\epoc32\release\##KMAIN##\##BUILD##\svphostfsstart.exe			\sys\bin\sysstart.exe
+
+// Snap Driver
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_svpsnapdriver.ldd  \sys\bin\svpsnapdriver.ldd
+file=			\epoc32\release\##KMAIN##\##BUILD##\snapapp.exe			\sys\bin\snapapp.exe
+
+// Estart
+data=               	\epoc32\rom\syborg\ESTART.TXT					    \sys\data\ESTART.TXT
+
+#ifdef USE_AUTOEXEC
+data=               	\epoc32\rom\##VARIANT##\AUTOEXEC.BAT        					AUTOEXEC.BAT
+#endif
+
+extension[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\_##VARIANT##_MEDINT.PDD	    \sys\bin\MEDINT.PDD
+//device[VARID]=	\epoc32\release\##KMAIN##\##BUILD##\D_DEBUG.LDD					\sys\bin\D_DEBUG.LDD
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/serial/serial.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <variant.mmh>
+#include "kernel\kern_ext.mmh"
+
+TARGET			VariantTarget(eserial,pdd)
+TARGETTYPE		pdd
+
+SYSTEMINCLUDE	\epoc32\include\drivers
+SYSTEMINCLUDE	AsspNKernIncludePath
+
+SOURCEPATH		.
+SOURCE			syborg_serial.cpp
+
+LIBRARY			PlatformLib
+
+EPOCALLOWDLLDATA
+
+UID				0 0x1000015b
+VENDORID        0x70000001
+
+ROMTARGET		eserial.pdd
+
+CAPABILITY		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/serial/syborg_serial.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,252 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic serial driver
+*
+* TODO: Handle multiple Units, hardcoded FIFO Size
+*/
+
+#include "syborg_serial.h"
+
+//#define DPRINT(x) Kern::Printf(x)
+//#define DPRINT2(x,y) Kern::Printf(x,y)
+
+#define DPRINT(x)
+#define DPRINT2(x,y)
+
+// ---------------------------------------------------------------
+// ---------------------------------------------------------------
+
+DDriverSyborgComm::DDriverSyborgComm()
+{
+  iVersion=TVersion(KCommsMajorVersionNumber,KCommsMinorVersionNumber,KCommsBuildVersionNumber);
+}
+
+TInt DDriverSyborgComm::Install()
+{
+  DPRINT("DDriverSyborgComm::Install");
+  return SetName(&KPddName);
+}
+
+void DDriverSyborgComm::GetCaps(TDes8 &aDes) const
+{
+  DPRINT("DDriverSyborgComm::GetCaps");
+
+  TCommCaps3 capsBuf;
+  TCommCapsV03 &c=capsBuf();
+  c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
+  c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
+  c.iStopBits=KCapsStop1|KCapsStop2;
+  c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
+  c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
+  c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
+  c.iSIR=0;
+  c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
+  c.iFifo=KCapsHasFifo;
+  c.iRoleCaps=0;
+  c.iFlowControlCaps=0;
+  c.iBreakSupported=ETrue;
+  aDes.FillZ(aDes.MaxLength());
+  aDes=capsBuf.Left(Min(capsBuf.Length(),aDes.MaxLength()));
+}
+
+TInt DDriverSyborgComm::Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
+{
+  DPRINT("DDriverSyborgComm::Create");
+
+  DCommSyborgSoc* pD=new DCommSyborgSoc;
+  aChannel=pD;
+  TInt r=KErrNoMemory;
+  if (pD)
+	r=pD->DoCreate(aUnit,anInfo);
+  return r;
+}
+
+TInt DDriverSyborgComm::Validate(TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& aVer)
+{
+  DPRINT("DDriverSyborgComm::Validate");
+  if ((!Kern::QueryVersionSupported(iVersion,aVer)) || 
+	  (!Kern::QueryVersionSupported(aVer,TVersion(KMinimumLddMajorVersion,KMinimumLddMinorVersion,KMinimumLddBuild))))
+	return KErrNotSupported;
+  return KErrNone;
+}
+
+// ---------------------------------------------------------------
+// ---------------------------------------------------------------
+
+DCommSyborgSoc::DCommSyborgSoc()
+{
+}
+
+DCommSyborgSoc::~DCommSyborgSoc()
+{
+  Interrupt::Unbind(iIrq);
+}
+
+TInt DCommSyborgSoc::DoCreate(TInt aUnit, const TDesC8* /*anInfo*/)
+{
+  DPRINT2("DCommSyborgSoc::DoCreate %d",aUnit);
+  switch(aUnit)
+	{
+	case 0:
+	  iPortAddr = KHwBaseUart0;
+	  iIrq = EIntSerial0;
+	  break;
+	case 1:
+	  iPortAddr = KHwBaseUart1;
+	  iIrq = EIntSerial1;
+	  break;
+	case 2:
+	  iPortAddr = KHwBaseUart2;
+	  iIrq = EIntSerial2;
+	  break;
+	case 3:
+	  iPortAddr = KHwBaseUart3;
+	  iIrq = EIntSerial3;
+	  break;
+	default:
+	  iPortAddr = KHwBaseUart0;
+	  iIrq = EIntSerial0;
+	  break;
+	}
+
+  Interrupt::Bind(EIntSerial0,Isr,this);
+
+  return KErrNone;
+
+}
+
+TInt DCommSyborgSoc::Start()
+{
+  DPRINT("DCommSyborgSoc::Start");
+  WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x1);
+  Interrupt::Enable(iIrq);
+  return KErrNone;
+}
+
+void DCommSyborgSoc::Stop(TStopMode aMode)
+{
+  DPRINT("DCommSyborgSoc::Stop");
+  WriteReg(iPortAddr, SERIAL_INT_ENABLE, 0x0);
+  Interrupt::Disable(iIrq);
+}
+
+void DCommSyborgSoc::Break(TBool aState)
+{
+  DPRINT("DCommSyborgSoc::Break");
+}
+
+void DCommSyborgSoc::EnableTransmit()
+{
+  DPRINT("DCommSyborgSoc::EnableTransmit");
+  while (Kern::PowerGood())
+	{
+	  TInt r=TransmitIsr();
+	  if (r<0)
+		break;
+	  WriteReg(iPortAddr, SERIAL_DATA, r);
+	}
+}
+
+TUint DCommSyborgSoc::Signals() const
+{
+  DPRINT("DCommSyborgSoc::Signals");
+  return(0);
+}
+  
+void DCommSyborgSoc::SetSignals(TUint aSetMask, TUint aClearMask)
+{
+  DPRINT("DCommSyborgSoc::SetSignals");
+}
+
+TInt DCommSyborgSoc::ValidateConfig(const TCommConfigV01 &aConfig) const
+{
+  DPRINT("DCommSyborgSoc::ValidateConfig");
+  return KErrNone;
+}
+
+void DCommSyborgSoc::Configure(TCommConfigV01 &aConfig)
+{
+  DPRINT("DCommSyborgSoc::Configure");
+}
+
+void DCommSyborgSoc::Caps(TDes8 &aCaps) const
+{
+  DPRINT("DCommSyborgSoc::Caps");
+  TCommCaps3 capsBuf;
+  TCommCapsV03 &c=capsBuf();
+  c.iRate=KCapsBps110|KCapsBps150|KCapsBps300|KCapsBps600|KCapsBps1200|KCapsBps2400|KCapsBps4800|KCapsBps9600|KCapsBps19200|KCapsBps38400|KCapsBps57600|KCapsBps115200|KCapsBps230400;
+  c.iDataBits=KCapsData5|KCapsData6|KCapsData7|KCapsData8;
+  c.iStopBits=KCapsStop1|KCapsStop2;
+  c.iParity=KCapsParityNone|KCapsParityEven|KCapsParityOdd;
+  c.iHandshake=KCapsObeyXoffSupported|KCapsSendXoffSupported|KCapsObeyCTSSupported|KCapsFailCTSSupported|KCapsObeyDSRSupported|KCapsFailDSRSupported|KCapsObeyDCDSupported|KCapsFailDCDSupported|KCapsFreeRTSSupported|KCapsFreeDTRSupported;
+  c.iSignals=KCapsSignalCTSSupported|KCapsSignalDSRSupported|KCapsSignalDCDSupported|KCapsSignalRTSSupported|KCapsSignalDTRSupported;
+  c.iSIR=0;
+  c.iNotificationCaps=KNotifyDataAvailableSupported|KNotifySignalsChangeSupported;
+  c.iFifo=KCapsHasFifo;
+  c.iRoleCaps=0;
+  c.iFlowControlCaps=0;
+  c.iBreakSupported=ETrue;
+  aCaps.FillZ(aCaps.MaxLength());
+  aCaps=capsBuf.Left(Min(capsBuf.Length(),aCaps.MaxLength()));
+}
+
+TInt DCommSyborgSoc::DisableIrqs()
+{
+  DPRINT("DCommSyborgSoc::DisableIrqs");
+  return NKern::DisableAllInterrupts();
+}
+
+void DCommSyborgSoc::RestoreIrqs(TInt aIrq)
+{
+  DPRINT("DCommSyborgSoc::RestoreIrqs");
+  NKern::RestoreInterrupts(aIrq);
+}
+
+TDfcQue* DCommSyborgSoc::DfcQ(TInt /*aUnit*/)
+{
+  return Kern::DfcQue0();
+}
+
+void DCommSyborgSoc::CheckConfig(TCommConfigV01& aConfig)
+{
+  DPRINT("DCommSyborgSoc::CheckConfig");
+}
+
+void DCommSyborgSoc::Isr(TAny* aPtr)
+{
+  DCommSyborgSoc& d=*(DCommSyborgSoc*)aPtr;
+  TUint rx[32];
+  TInt rxi=0;
+
+  DPRINT2("DCommSyborgSoc::Isr %x",d.iIrq);
+
+  // Is now auto clear
+  //  WriteReg(d.iPortAddr, SERIAL_CLEAR_INT, 0x0); // clear interrupts
+
+  while(ReadReg(d.iPortAddr, SERIAL_FIFO_COUNT)!=0) {
+	TUint ch = ReadReg(d.iPortAddr, SERIAL_DATA);
+	rx[rxi++]=ch;
+  }
+  d.ReceiveIsr(rx,rxi,0);
+}
+
+// ---------------------------------------------------------------
+// ---------------------------------------------------------------
+
+DECLARE_STANDARD_PDD()
+{
+  DPRINT("DECLARE_STANDARD_PDD()");
+  return new DDriverSyborgComm;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/serial/syborg_serial.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Minimalistic serial driver
+*
+*/
+
+#ifndef _SYBORG_SERIAL_H
+#define _SYBORG_SERIAL_H
+
+#include <comm.h>
+#include <e32hal.h>
+#include "system.h"
+
+const TInt KMinimumLddMajorVersion=1;
+const TInt KMinimumLddMinorVersion=1;
+const TInt KMinimumLddBuild=1;
+
+class DDriverSyborgComm : public DPhysicalDevice
+{
+public:
+  DDriverSyborgComm();
+  virtual TInt Install();
+  virtual void GetCaps(TDes8 &aDes) const;
+  virtual TInt Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
+  virtual TInt Validate(TInt aUnit, const TDesC8* anInfo, const TVersion &aVer);
+};
+
+class DCommSyborgSoc : public DComm
+{
+public:
+  DCommSyborgSoc();
+  ~DCommSyborgSoc();
+  TInt DoCreate(TInt aUnit, const TDesC8* anInfo);
+public:
+  virtual TInt Start();
+  virtual void Stop(TStopMode aMode);
+  virtual void Break(TBool aState);
+  virtual void EnableTransmit();
+  virtual TUint Signals() const;
+  virtual void SetSignals(TUint aSetMask, TUint aClearMask);
+  virtual TInt ValidateConfig(const TCommConfigV01 &aConfig) const;
+  virtual void Configure(TCommConfigV01 &aConfig);
+  virtual void Caps(TDes8 &aCaps) const;
+  virtual TInt DisableIrqs();
+  virtual void RestoreIrqs(TInt aIrq);
+  virtual TDfcQue* DfcQ(TInt aUnit);
+  virtual void CheckConfig(TCommConfigV01& aConfig);  
+  static void Isr(TAny* aPtr);
+
+public:
+  TLinAddr iPortAddr;
+  TInt iIrq;
+
+  enum {
+    SERIAL_ID           = 0,
+    SERIAL_DATA         = 1,
+    SERIAL_FIFO_COUNT   = 2,
+    SERIAL_INT_ENABLE   = 3,
+    SERIAL_DMA_TX_ADDR  = 4,
+    SERIAL_DMA_TX_COUNT = 5, /* triggers dma */
+    SERIAL_DMA_RX_ADDR  = 6,
+    SERIAL_DMA_RX_COUNT = 7 /* triggers dma */
+  };
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/assp.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: implementation of class Syborg
+*
+*/
+
+#include <syborg_priv.h>
+#include <hal_data.h>
+
+#ifdef __EMI_SUPPORT__
+#include <emi.h>
+#endif
+
+//#define ASSP_DEBUG
+
+#ifdef ASSP_DEBUG
+#define __DEBUG_PRINT(format...)    Kern::Printf(format)
+#else
+#define __DEBUG_PRINT(format...)    __KTRACE_OPT(KBOOT,Kern::Printf(format))
+#endif
+
+Syborg* Syborg::Variant=NULL;
+// !@!
+#if 0
+TPhysAddr Syborg::VideoRamPhys;
+TPhysAddr Syborg::VideoRamPhysSecure;		// Secure display memory
+#endif
+
+GLDEF_D Syborg TheVariant;
+
+// Wait for interrupt idle routine
+extern TInt SyborgWFIIdle();
+
+DECLARE_STANDARD_ASSP()
+
+EXPORT_C Asic* VariantInitialise()
+{
+	return &TheVariant;
+}
+
+void Syborg::Idle()
+{
+	// Use the basic Wait For Interrupt call to idle
+	TInt irq = NKern::DisableAllInterrupts();
+#ifdef __EMI_SUPPORT__
+	EMI::EnterIdle();
+#endif
+	SyborgWFIIdle();
+#ifdef __EMI_SUPPORT__
+	EMI::LeaveIdle();
+#endif
+	NKern::RestoreInterrupts(irq);
+}
+
+TUint32 Syborg::NanoWaitCalibration()
+{
+	return 17;	// 2 cycles approx 17ns at 125MHz
+}
+
+TInt Syborg::VariantHal(TInt aFunction, TAny* a1, TAny* a2)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Syborg::VariantHal(%d, %0x, %0x)",aFunction,a1,a2));
+
+	switch(aFunction)
+    {
+		case EVariantHalVariantInfo:
+		{
+			TVariantInfoV01Buf infoBuf;
+			TVariantInfoV01& info = infoBuf();
+			TUint clock=0;
+			info.iRomVersion = Epoc::RomHeader().iVersion;
+    		info.iMachineUniqueId = (TInt64(HALData::EMachineUid_OmapH4)<<32);
+   			info.iLedCapabilities = (8<<16) + KLedMaskGreen1;
+			info.iProcessorClockInKHz = clock;
+			info.iSpeedFactor = clock/25;
+			Kern::InfoCopy(*(TDes8*)a1,infoBuf);
+			break;
+	    }
+		case EVariantHalDebugPortSet:
+	    {
+			TUint32 thePort = (TUint32)a1;
+			switch(thePort) // Accept UART(0-3)
+		    {
+				case 0:
+				case 1:
+			    case 2:
+                case 3:
+                {
+                    TSyborg::MarkDebugPortOff();           // mark port is not initialised
+					Kern::SuperPage().iDebugPort = thePort; // update the super page
+                    Syborg::DebugInit();                   // init debug port        
+                    break;
+                }
+				case (TUint32)KNullDebugPort:               // debug output supressed
+                {
+                    TSyborg::MarkDebugPortOff();           // mark port is not initialised
+					Kern::SuperPage().iDebugPort = thePort; // update the super page
+					break;
+                }
+				default:
+					return KErrNotSupported;
+		    }
+			break;
+	    }
+		case EVariantHalDebugPortGet:
+	    {
+			TUint32 thePort = Kern::SuperPage().iDebugPort;
+			kumemput32(a1, &thePort, sizeof(TUint32));
+			break;
+	    }
+		case EVariantHalSwitches:
+	    {
+		  TUint32 x = 0; //Register32(KHwBaseSystemReg+KHoRoSystemSw);
+			kumemput32(a1, &x, sizeof(x));
+			break;
+	    }
+		case EVariantHalLedMaskSet:
+	    {
+		  //SetRegister32(KHwBaseSystemReg+KHoRwSystemLed, (TUint32)a1 & 0xFF);
+			break;
+	    }
+		case EVariantHalLedMaskGet:
+	    {
+		  TUint32 x = 0; //Register32(KHwBaseSystemReg+KHoRwSystemLed);
+			kumemput32(a1, &x, sizeof(x));
+			break;
+	    }
+		case EVariantHalCustomRestartReason:
+	    {
+			// Restart reason is stored in super page
+		  TInt x = (Kern::SuperPage().iHwStartupReason); // & KmRestartCustomReasons) >> KsRestartCustomReasons;
+			kumemput32(a1, &x, sizeof(TInt));
+			break;
+	    }
+		case EVariantHalCustomRestart:
+	    {
+            __KERNEL_CAPABILITY_CHECK(
+                if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,
+			       __PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EVariantHalCustomRestart")))
+				    return KErrPermissionDenied;
+            )
+			  Kern::Restart(0);
+			break;
+	    }
+		default:
+    	{
+			return KErrNotSupported;
+	    }
+    }
+	return KErrNone;
+}
+
+TPtr8 Syborg::MachineConfiguration()
+{
+	return TPtr8((TUint8*)&Kern::MachineConfig(),40,40);
+}
+
+EXPORT_C Syborg::Syborg()
+{
+	iDebugPortBase = TSyborg::DebugPortAddr(); // initialised in bootstrap
+}
+
+EXPORT_C TMachineStartupType Syborg::StartupReason()
+{
+	TUint s = Kern::SuperPage().iHwStartupReason;
+	__DEBUG_PRINT("Syborg::StartupReason CPU page value 0x%08X", s);
+	return EStartupColdReset;
+}
+
+EXPORT_C void Syborg::Init1()
+{
+	__DEBUG_PRINT("Syborg::Init1()");
+
+	// Enable the CLCD in the System registers
+	SyborgInterrupt::Init1();
+}
+
+EXPORT_C void Syborg::Init3()
+{
+	NTimerQ& m = *(NTimerQ*)NTimerQ::TimerAddress();
+	m.iRounding = -5;
+		
+	TInt r = Interrupt::Bind(EIntTimer1,SyborgInterrupt::MsTimerTick,&m);
+	if (r != KErrNone)
+	{
+		Kern::Fault("BindMsTick",r);
+	}
+
+	TSyborg::Init3();
+	TSyborg::ClearTimerInt(KHwBaseCounterTimer);
+
+	r = Interrupt::Enable(EIntTimer1);
+	if (r != KErrNone)
+	{
+		Kern::Fault("EnbMsTick",r);
+	}
+
+	TSyborg::SetTimerLoad(KHwBaseCounterTimer, K1000HzTickMatchLoad);
+	//	TSyborg::SetTimerLoad(KHwBaseCounterTimer, 1000000);
+	TSyborg::SetTimerMode(KHwBaseCounterTimer, TSyborg::ETimerModePeriodic);	
+	TSyborg::EnableTimerInterrupt(KHwBaseCounterTimer);
+	TSyborg::EnableTimer(KHwBaseCounterTimer, TSyborg::EEnable);
+	
+	SyborgInterrupt::Init3();
+
+	// !@!
+#if 0
+	// Allocate physical RAM for video
+	TInt vSize = TSyborg::VideoRamSize();
+
+	r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhys);
+	if (r != KErrNone)
+	{
+		Kern::Fault("AllocVideoRam",r);
+	}
+
+	// Allocate physical RAM for secure display
+	r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhysSecure);
+	if (r != KErrNone)
+	{
+		Kern::Fault("AllocVideoRam 2",r);
+	}
+#endif
+	__DEBUG_PRINT("Finished Syborg::Init3()");
+}
+
+EXPORT_C void Syborg::DebugInit()
+{
+	iDebugPortBase = TSyborg::DebugPortAddr();
+
+    if(iDebugPortBase != (TUint32)KNullDebugPort)   // supress debug output
+    {
+	  TUint8 res = ReadReg(iDebugPortBase, 0);
+    }
+}
+
+//
+// Output a character to the debug port
+//
+EXPORT_C void Syborg::DebugOutput(TUint aLetter)
+{
+	if(!iDebugPortBase)
+    {
+		DebugInit();
+	}
+
+    if(iDebugPortBase != (TUint32)KNullDebugPort)   // supress debug output
+    {
+	  WriteReg(iDebugPortBase,1,aLetter);
+    }
+}
+
+EXPORT_C TInt Syborg::MsTickPeriod()
+{
+	return 1000;
+}
+
+EXPORT_C TInt Syborg::SystemTimeInSecondsFrom2000(TInt& aTime)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("RTC READ: %d",aTime));
+	return KErrNone;
+}
+
+EXPORT_C TInt Syborg::SetSystemTimeInSecondsFrom2000(TInt aTime)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Set RTC: %d",aTime));					// do this here to allow the value to be loaded...
+	return KErrNone;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/highrestimer.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+/**
+ * @file
+ * @internalTechnology
+ *
+ * The highrestimer.h header file defines how to access the high resoltion
+ * timer, if one is supported.  This file is used by default if the variant does
+ * not export one to \epoc32\include\nkern. 
+ */
+
+#ifndef __HIGHRESTIMER_H__
+#define __HIGHRESTIMER_H__
+//
+// Copyright (c) 2008 Symbian Ltd. All rights reserved.
+//
+
+#include <syborg.h>
+
+/**
+ * Macro indicating that a high resolution timer is supported.
+ */
+#define HAS_HIGH_RES_TIMER
+
+/**
+ * Assembler macro to get the the current value of the high res timer and place
+ * it in the specified register.
+ * Reads the 32-bit value from a free-running counter that represents the current time. 
+ * Syborg timers have 'microsecond resolution'. NB. This value comes from the host clock
+ * and so there is a good chance that the kernels tick based notion of time (elapsed) and that
+ * measured by the free running timer will get out of kilter. This affects t_cputime from e32test
+ * amongst other things.
+ */
+//#define GET_HIGH_RES_TICK_COUNT(Rd) asm("nop");
+// Hi-jacking r10 for tmp, not good if Rd is R10 -- grepping the the kernel shows it's not (for now)
+#define GET_HIGH_RES_TICK_COUNT(Rd)						         \
+  asm("push {r10}");										     \
+  asm("mov r10, #2");										     \
+  asm("ldr "#Rd", =%a0"               : : "i" (KHwBaseRtc + 4)); \
+  asm("str r10, ["#Rd", #%a0]"        : : "i" (0));			     \
+  asm("pop {r10}");                                              \
+  asm("ldr "#Rd", =%a0"               : : "i" (KHwBaseRtc + 8)); \
+  asm("ldr "#Rd", ["#Rd", #%a0]"      : : "i" (0));              
+
+/**
+ * The frequency of the timer in Hz.
+ */
+const TInt KHighResTimerFrequency = 1000000;
+
+/**
+ * Macro indicating that the timer counts up if defined.
+ */
+#define HIGH_RES_TIMER_COUNTS_UP
+
+#endif  // __HIGHRESTIMER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/interrupts.cia	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Syborg interrupt control and dispatch
+*
+*/
+
+#include <e32cia.h>
+#include <syborg_priv.h>
+#include <cpudefs.h>
+
+// CIA symbols for ASSP code?
+#if defined(__GCC32__)
+// CIA symbol macros for Gcc98r2
+#define CSM_ZN7NTimerQ4TickEv " Tick__7NTimerQ"
+#elif defined(__ARMCC__)
+// CIA symbol macros for RVCT
+#define CSM_ZN7NTimerQ4TickEv " __cpp(NTimerQ::Tick)"
+#else
+// CIA symbol macros for EABI assemblers
+#define CSM_ZN7NTimerQ4TickEv " _ZN7NTimerQ4TickEv"
+#endif
+
+/********************************************************************
+ * Wait for interrupt idle routine which does not disable interrupts
+ ********************************************************************/
+ 
+__NAKED__ void SyborgWFIIdle()
+{
+	// Enter an idle state and wait for interrupts
+	asm("mov r0, #0");
+	asm("mcr p15, 0, r0, c7, c0, 4");
+	asm("bx lr");
+}
+
+/********************************************************************
+ * Service 1ms tick interrupt & timer 1 interrupt
+ ********************************************************************/
+
+__NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/)
+{
+	// Service 1ms tick interrupt
+	asm("ldr r1, __KHwCounterTimer");
+	asm("push {r0}");
+	asm("mov r0, #1");
+	asm("str r0, [r1, #24]");
+	asm("pop {r0}");
+	asm("b "CSM_ZN7NTimerQ4TickEv);
+	asm("bx lr");
+
+	asm("__KHwCounterTimer:");
+	asm(".word %a0" : : "i" ((TInt)KHwBaseCounterTimer));
+}
+
+/********************************************************************
+ * Interrupt handling/dispatch
+ ********************************************************************/
+// IRQ dispatcher
+// Enter with r0-r3, r12 and return address on IRQ stack
+// Must preserve r4-r11
+// Uses r4,r5,r12
+__NAKED__ void SyborgInterrupt::IrqDispatch()
+{
+	asm("push {r4,r5,lr} ");
+	asm("ldr r4, __KHwBaseSic");
+	asm("ldr r12, __SicHandlerStart");
+	asm("ldr r5, [r4, #8]");  // r5 - pending interrupt
+	asm("adr lr, Clear");
+	asm("add r12, r5, lsl #3");
+	asm("ldm r12, {r0, pc}");
+	
+	asm("Clear:");
+	//	asm("str r5, [r4, #16]");        // TODO: error
+	asm("pop {r4,r5,pc}");
+
+	asm("__KHwBaseSic:");
+	asm(".word %a0" : : "i" ((TInt)KHwBaseSic));
+	asm("__SicHandlerStart:");
+	asm(".word %a0" : : "i" ((TInt)&Handlers[0]));
+}
+
+__NAKED__ void SyborgInterrupt::FiqDispatch()
+{
+	// FIQ dispatcher
+	// Enter with return address on FIQ stack
+	// We may use r8-r12, but must preserve other registers
+	// NOTE: STACK IS MISALIGNED ON ENTRY (1 WORD PUSHED)
+	asm("push {r0-r3,lr}");
+	// FIQ Handler to go in here.
+	// Not needed because no FIQs are currently used
+	asm("pop {r0-r3,pc}");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/interrupts.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Syborg interrupt control and dispatch
+*
+*/
+
+#include <syborg_priv.h>
+
+SInterruptHandler SyborgInterrupt::Handlers[KNumSyborgInts];
+
+void SyborgInterrupt::DisableAndClearAll()
+{
+  WriteReg(KHwBaseSic, 3, 0);
+}
+
+void SyborgInterrupt::Init1()
+{
+	__KTRACE_OPT(KBOOT,Kern::Printf("SyborgInterrupt::Init1()"));
+
+	for(TUint i = 0; i < KNumSyborgInts; i++)
+	{
+		Handlers[i].iPtr = (TAny*)i;
+		Handlers[i].iIsr = Spurious;
+	}
+
+	DisableAndClearAll();
+	
+	Arm::SetIrqHandler((TLinAddr)SyborgInterrupt::IrqDispatch);
+	Arm::SetFiqHandler((TLinAddr)SyborgInterrupt::FiqDispatch);
+}
+
+void SyborgInterrupt::Init3()
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("SyborgInterrupt::Init3()"));
+}
+
+void SyborgInterrupt::Spurious(TAny* anId)
+{
+	// Handle an unexpected interrupt
+	Kern::Fault("SpuriousInt", (TInt)anId);
+}
+
+EXPORT_C TInt Interrupt::Bind(TInt anId, TIsr anIsr, TAny* aPtr)
+{
+  __KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::Bind(anId=%d anIsr=0x%X aPtr=0x%X)",anId,anIsr,aPtr));
+	if((anId >= 0) && ((TUint)anId < KNumSyborgInts))
+	{
+		SInterruptHandler& h = SyborgInterrupt::Handlers[anId];
+		TInt irq = NKern::DisableAllInterrupts();
+        TInt r;
+		if(h.iIsr != SyborgInterrupt::Spurious)
+		{
+            r = KErrInUse;
+	    }
+		else
+		{
+    	    h.iPtr = aPtr;
+	    	h.iIsr = anIsr;
+            r = KErrNone;
+		}
+		NKern::RestoreInterrupts(irq);
+		return r;
+	}
+	return KErrArgument;
+}
+
+EXPORT_C TInt Interrupt::Unbind(TInt anId)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::Unbind(%d)",anId));
+	if((anId >= 0) && ((TUint)anId < KNumSyborgInts))
+	{
+		SInterruptHandler& h = SyborgInterrupt::Handlers[anId];
+		TInt irq = NKern::DisableAllInterrupts();
+    	TInt r;
+		if(h.iIsr == SyborgInterrupt::Spurious)
+		{
+			r = KErrGeneral;
+		}
+		else
+		{
+            // Reset pointer to handler back to default
+			h.iPtr = (TAny*)anId;
+			h.iIsr = SyborgInterrupt::Spurious;	
+			// Disable the interrupt
+			TSyborg::DisableInt(anId);
+			r = KErrNone;
+        }
+		NKern::RestoreInterrupts(irq);
+    	return r;
+	}
+	return KErrArgument;
+}
+
+EXPORT_C TInt Interrupt::Enable(TInt anId)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::Enable(%d)",anId));
+	if((anId >= 0) && ((TUint)anId < KNumSyborgInts))
+	{
+		if(SyborgInterrupt::Handlers[anId].iIsr == SyborgInterrupt::Spurious)
+		{
+	        return KErrNotReady;
+		}
+		else
+		{
+		  TSyborg::EnableInt(anId);
+		  return KErrNone;
+		}
+	}
+	return KErrArgument;
+}
+
+EXPORT_C TInt Interrupt::Disable(TInt anId)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::Disable(%d)",anId));
+	if((anId >= 0) && ((TUint)anId < KNumSyborgInts))
+	{
+	  TSyborg::DisableInt(anId);
+	  return KErrNone;
+	}
+	return KErrArgument;
+}
+
+EXPORT_C TInt Interrupt::Clear(TInt anId)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::Clear(%d)",anId));
+	if((anId >= 0) && ((TUint)anId < KNumSyborgInts))
+	{
+        return KErrNone;
+	}
+	return KErrArgument;
+}
+
+EXPORT_C TInt Interrupt::SetPriority(TInt anId, TInt aPriority)
+{
+	__KTRACE_OPT(KHARDWARE,Kern::Printf("Interrupt::SetPriority(anId=%d aPriority=0x%X)",anId,aPriority));
+	return KErrNotSupported;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/syborg.cfg	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,2348 @@
+############################################################
+## AUTO-GENERATED CONFIGURATION FILE
+## CommDB Database Dump Utility
+## 1.1
+############################################################
+
+############################################################
+## Network
+## 
+[Network]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=Intranet
+	FIELD_COUNT=1
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=mRouter
+	FIELD_COUNT=1
+END_ADD
+
+
+############################################################
+## ModemBearer
+## 
+[ModemBearer]
+ADD_TEMPLATE
+	Name=Default Modem
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=0
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=Null Modem 115200bps
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=US Robotics Sportster
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=57600
+	Handshaking=244
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=AFTERDIALUNTILANSWER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT&F1
+	DataInitString=AT
+	FaxInitString=AT&d2
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 4
+	Name=Dacom Surfer
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=57600
+	Handshaking=244
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=AFTERDIALUNTILANSWER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT&F
+	DataInitString=AT
+	FaxInitString=AT&d2
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 5
+	Name=GSM Mobile Phone via Infrared
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=IRCOMM::0
+	TSYName=MM
+	CSYName=IRCOMM
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=196
+	SpecialRate=0
+	XonChar=17
+	XoffChar=19
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=ATZ
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 6
+	Name=GSM Mobile Phone via Serial
+	Agent=CSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=19200
+	Handshaking=196
+	SpecialRate=0
+	XonChar=17
+	XoffChar=19
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=ATZ
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 7
+	Name=GPRS Ericsson R520m via IR
+	Agent=PSD.agt
+	IfName=PPP
+	PortName=IRCOMM::0
+	TSYName=MM
+	CSYName=IRCOMM
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=4
+	SpecialRate=0
+	XonChar=17
+	XoffChar=19
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=ATZ
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 8
+	Name=GPRS Ericsson R520m/T68i via Serial
+	Agent=PSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=19200
+	Handshaking=4
+	SpecialRate=0
+	XonChar=17
+	XoffChar=19
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=ATZ
+	DataInitString=AT
+	FaxInitString=AT
+	IspInitString=*99***1#
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=70
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 9
+	Name=GPRS Motorola Mobile Phone via Serial
+	Agent=PSD.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=57600
+	Handshaking=4
+	SpecialRate=0
+	XonChar=17
+	XoffChar=19
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=ATZ
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 10
+	Name=WinTunnel Modem
+	Agent=null.agt
+	IfName=PPP
+	PortName=COMM::6
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 11
+	Name=mRouterWinsBearer
+	Agent=mRouterAgent.agt
+	IfName=PPP
+	PortName=WINS::0
+	TSYName=MM
+	CSYName=WINSCSY
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=9999
+	LastSessionClosedTimeout=180
+	LastSocketClosedTimeout=30
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 12
+	Name=mRouterRs232Bearer
+	Agent=mRouterAgent.agt
+	IfName=PPP
+	PortName=COMM::0
+	TSYName=MM
+	CSYName=ECUART
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=9999
+	LastSessionClosedTimeout=180
+	LastSocketClosedTimeout=30
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 13
+	Name=mRouterIrBearer
+	Agent=mRouterAgent.agt
+	IfName=PPP
+	PortName=IRCOMM::0
+	TSYName=MM
+	CSYName=IRCOMM
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=9999
+	LastSessionClosedTimeout=180
+	LastSocketClosedTimeout=30
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 14
+	Name=mRouterBtBearer
+	Agent=mRouterAgent.agt
+	IfName=PPP
+	PortName=BTCOMM::0
+	TSYName=MM
+	CSYName=BTCOMM
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=9999
+	LastSessionClosedTimeout=180
+	LastSocketClosedTimeout=30
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 15
+	Name=mRouterUsbBearer
+	Agent=mRouterAgent.agt
+	IfName=PPP
+	PortName=ACM::0
+	TSYName=MM
+	CSYName=ECACM
+	DataBits=8
+	StopBits=1
+	Parity=NONE
+	Rate=115200
+	Handshaking=52
+	SpecialRate=0
+	XonChar=0
+	XoffChar=0
+	FaxClassPref=AUTO
+	SpeakerPref=NEVER
+	SpeakerVolPref=QUIET
+	ModemInitString=AT
+	DataInitString=AT
+	FaxInitString=AT
+	DialPauseLength=S8=
+	SpeakerVolContorlLow=L0
+	SpeakerVolControlMedium=L1
+	SpeakerVolControlHigh=L2
+	SpeakerAlwaysOff=M0
+	SpeakerOnUntilCarrier=M1
+	SpeakerAlwaysOn=M2
+	SpeakerOnAfterUntilCarrier=M3
+	DialToneWaitModifier=W
+	CallProgress1=X1
+	CallProgress2=X2
+	CallProgress3=X3
+	CallProgress4=X4
+	EchoOff=E0
+	VerboseText=V1
+	QuietOn=Q1
+	QuietOff=Q0
+	DialCommandStateModifier=;
+	OnLine=O
+	ResetConfiguration=Z
+	ReturnToFactoryDefs=&F
+	DCDOnDuringLink=&C1
+	DTRHangUp=&D2
+	DSRAlwaysOn=&S0
+	RTSCTSHandshake=&K3
+	XonXoffHandshake=&K4
+	EscapeCharacter=+
+	EscapeGuardPeriod=S12
+	NoDialTone=NO DIAL TONE
+	Busy=BUSY
+	NoAnswer=NO ANSWER
+	Carrier=CARRIER
+	Connect=CONNECT
+	CompressionClass5=COMPRESSION:CLASS 5
+	CompressionV42bis=COMPRESSION:V.42 bis
+	CompressionNone=COMPRESSION:NONE
+	ProtocolLAPD=PROTOCOL:LAPD
+	ProtocolALT=PROTOCOL:ALT
+	ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR
+	ProtocolNone=PROTOCOL:NONE
+	MessageCentreNumber=+44123456789
+	MessageValidityPeriod=1440
+	MessageDeliveryReport=FALSE
+	MinimumSignalLevel=9905
+	LastSocketActivityTimeout=9999
+	LastSessionClosedTimeout=180
+	LastSocketClosedTimeout=30
+	SIRSettings=0
+	CommRole=0
+	FIELD_COUNT=69
+END_ADD
+
+
+############################################################
+## LANBearer
+## 
+[LANBearer]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=EKA1 Assabet on-board Ethernet
+	Agent=nullagt.agt
+	IfName=ethint
+	LDDFilename=ethercard
+	LDDName=EtherCard
+	PDDFilename=EtherSmc
+	PDDName=EtherCard.Smc
+	PacketDriverName=EtherPkt.drv
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=11
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=EKA2 Assabet on-board Ethernet
+	Agent=nullagt.agt
+	IfName=ethint
+	LDDFilename=enet
+	LDDName=Ethernet
+	PDDFilename=ethernet
+	PDDName=Ethernet.Assabet
+	PacketDriverName=EtherPkt.drv
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=11
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=EKA1 emulator Ethernet
+	Agent=nullagt.agt
+	IfName=ethint
+	LDDFilename=ethercard
+	LDDName=Ethercard
+	PDDFilename=etherwins
+	PDDName=Ethercard.wins
+	PacketDriverName=EtherPkt.drv
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=11
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 4
+	Name=EKA2 emulator Ethernet
+	Agent=nullagt.agt
+	IfName=ethint
+	LDDFilename=enet
+	LDDName=Ethernet
+	PDDFilename=ethernet
+	PDDName=Ethernet.Wins
+	PacketDriverName=EtherPkt.drv
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=11
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 5
+	Name=EKA2 SYBORG on-board Ethernet
+	Agent=nullagt.agt
+	IfName=ethint
+	LDDFilename=enet
+	LDDName=Ethernet
+	PDDFilename=ethernet
+	PDDName=Ethernet.SYBORG
+	PacketDriverName=EtherPkt.drv
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=11
+END_ADD
+
+############################################################
+## Location
+## 
+[Location]
+ADD_TEMPLATE
+	Name=Default Location
+	IntlPrefixCode=+
+	NatPrefixCode=0
+	NatCode=44
+	Mobile=TRUE
+	UsePulseDial=FALSE
+	WaitForDialTone=FALSE
+	PauseAfterDialout=0
+	FIELD_COUNT=8
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=Office
+	IntlPrefixCode=00
+	NatPrefixCode=0
+	NatCode=44
+	AreaCode=171
+	DialOutCode=9,
+	Mobile=FALSE
+	UsePulseDial=FALSE
+	WaitForDialTone=FALSE
+	PauseAfterDialout=0
+	FIELD_COUNT=10
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=Office Direct Dial
+	IntlPrefixCode=00
+	NatPrefixCode=0
+	NatCode=44
+	AreaCode=171
+	Mobile=FALSE
+	UsePulseDial=FALSE
+	WaitForDialTone=FALSE
+	PauseAfterDialout=0
+	FIELD_COUNT=9
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 4
+	Name=Mobile
+	IntlPrefixCode=+
+	NatPrefixCode=0
+	NatCode=44
+	Mobile=TRUE
+	UsePulseDial=FALSE
+	WaitForDialTone=FALSE
+	PauseAfterDialout=0
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 5
+	Name=Home
+	IntlPrefixCode=00
+	NatPrefixCode=0
+	NatCode=44
+	AreaCode=181
+	Mobile=FALSE
+	UsePulseDial=TRUE
+	WaitForDialTone=TRUE
+	PauseAfterDialout=0
+	FIELD_COUNT=9
+END_ADD
+
+
+############################################################
+## Chargecard
+## 
+[Chargecard]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=Dummy BT Chargecard
+	AccountNumber=144,12345678
+	Pin=0000
+	LocalRule=HG
+	NatRule=HFG
+	IntlRule=HEFG
+	FIELD_COUNT=6
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=Dummy Mercury Chargecard
+	AccountNumber=0500800800,,12345678
+	Pin=****
+	LocalRule=HG
+	NatRule=J,K,0FG
+	IntlRule=HEFG
+	FIELD_COUNT=6
+END_ADD
+
+
+############################################################
+## GlobalSettings
+## 
+[GlobalSettings]
+ADD_SECTION
+	WAPAccessPoint=1
+	RedialAttempts=3
+	SmsBearer=1
+	SmsReceiveMode=2
+	GPRSAttachMode=1
+	AcceptIncomingGprs=1
+	GPRSClassCBearer=GSM
+	ConnectionAttempts=2
+	ModemForDataAndFax=2
+	ModemForPhoneServicesAndSMS=2
+	LocationForDataAndFax=2
+	LocationForPhoneServicesAndSMS=2
+	DefaultNetwork=1
+	BearerAvailabilityCheckTSY=mm
+	FIELD_COUNT=14
+END_ADD
+
+
+############################################################
+## DialOutISP
+## 
+[DialOutISP]
+ADD_TEMPLATE
+	Name=Default Dial Out ISP
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=TRUE
+	DisplayPCT=FALSE
+	IfPromptForAuth=TRUE
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=28
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=NT RAS
+	Description=Test
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=TRUE
+	LoginScript=CHARMAP \[windows-1252\]\nLOOP 10\n{\nSEND "CLIENT"+<0x0d>\nWAIT 3\n{\n"SERVER" OK\n}\n}\nEXIT KErrNoAnswer$\n\nOK:\nEXIT\n
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	IfAuthName=RasUser
+	IfAuthPass=pass
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=35
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=ISP01
+	Description=PlaceHolder for ISP01
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=TRUE
+	IfAuthName=xxx
+	IfAuthPass=yyy
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 4
+	Name=ISP02
+	Description=PlaceHolder for ISP02
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=TRUE
+	IfAuthName=xxx
+	IfAuthPass=yyy
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 5
+	Name=ISP03
+	Description=PlaceHolder for ISP03
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=TRUE
+	IfAuthName=xxx
+	IfAuthPass=yyy
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 6
+	Name=ISP04
+	Description=PlaceHolder for ISP04
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=TRUE
+	IfAuthName=xxx
+	IfAuthPass=yyy
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 7
+	Name=ISP05
+	Description=PlaceHolder for ISP05
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=TRUE
+	IfAuthName=xxx
+	IfAuthPass=yyy
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 8
+	Name=mRouterDialOutIsp
+	Description=mRouterDialOutIsp
+	Type=INTERNETONLY
+	DialResolution=TRUE
+	UseLoginScript=FALSE
+	PromptForLogin=FALSE
+	DisplayPCT=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	IfAuthName=IfAuthPass=
+	IfAuthPass=AuthRetries=0
+	AuthRetries=0
+	IfCallbackEnabled=FALSE
+	CallbackTimeout=0
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	BearerService=0
+	BearerProtocol=UNSPECIFIED
+	RlpVersion=0
+	IwfToMs=0
+	MsToIwf=0
+	AckTimer=0
+	RetransmissionAttempts=0
+	ResequencePeriod=0
+	V42Compression=0
+	V42Codewords=0
+	V42MaxLength=0
+	Asymmetry=0
+	UserInitUpgrade=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=34
+END_ADD
+
+
+############################################################
+## DialInISP
+## 
+[DialInISP]
+ADD_TEMPLATE
+	Name=Default Dial In ISP
+	UseLoginScript=FALSE
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=9
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=Dial In ISP01
+	UseLoginScript=FALSE
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableIPHeaderComp=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	EnableSWComp=FALSE
+	UseEdge=FALSE
+	FIELD_COUNT=9
+END_ADD
+
+
+############################################################
+## OutgoingGPRS
+## 
+[OutgoingGPRS]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=GPRS01
+	APN=gprs01APNPlaceHolder
+	PDPType=IPV4
+	ReqPrecedence=0
+	ReqDelay=0
+	ReqReliability=0
+	ReqPeakThroughput=0
+	ReqMeanThroughput=0
+	MinPrecedence=0
+	MinDelay=0
+	MinReliability=0
+	MinPeakThroughput=0
+	MinMeanThroughput=0
+	DataCompression=FALSE
+	HeaderCompression=FALSE
+	GprsUseEdge=FALSE
+	AnonymousAccess=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	AuthRetries=1
+	IpDNSAddrFromServer=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	IpAddrFromServer=TRUE
+	GprsAccessPointType=0
+	QosWarningTimeout=0
+	FIELD_COUNT=26
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=GPRS02
+	APN=gprs02APNPlaceHolder
+	PDPType=IPV4
+	ReqPrecedence=0
+	ReqDelay=0
+	ReqReliability=0
+	ReqPeakThroughput=0
+	ReqMeanThroughput=0
+	MinPrecedence=0
+	MinDelay=0
+	MinReliability=0
+	MinPeakThroughput=0
+	MinMeanThroughput=0
+	DataCompression=FALSE
+	HeaderCompression=FALSE
+	GprsUseEdge=FALSE
+	AnonymousAccess=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	AuthRetries=1
+	IpDNSAddrFromServer=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	IpAddrFromServer=TRUE
+	GprsAccessPointType=0
+	QosWarningTimeout=0
+	FIELD_COUNT=26
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=GPRS03
+	APN=gprs03APNPlaceHolder
+	PDPType=IPV4
+	ReqPrecedence=0
+	ReqDelay=0
+	ReqReliability=0
+	ReqPeakThroughput=0
+	ReqMeanThroughput=0
+	MinPrecedence=0
+	MinDelay=0
+	MinReliability=0
+	MinPeakThroughput=0
+	MinMeanThroughput=0
+	DataCompression=FALSE
+	HeaderCompression=FALSE
+	GprsUseEdge=FALSE
+	AnonymousAccess=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	AuthRetries=1
+	IpDNSAddrFromServer=FALSE
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	IpAddrFromServer=TRUE
+	GprsAccessPointType=0
+	QosWarningTimeout=0
+	FIELD_COUNT=26
+END_ADD
+
+
+############################################################
+## IncomingGPRS
+## 
+[IncomingGPRS]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=Incoming GPRS Settings PlaceHolder
+	APN=Test
+	PDPType=IPV4
+	ReqPrecedence=1
+	ReqDelay=1
+	ReqReliability=1
+	ReqPeakThroughput=1
+	ReqMeanThroughput=1
+	MinPrecedence=1
+	MinDelay=1
+	MinReliability=1
+	MinPeakThroughput=1
+	MinMeanThroughput=1
+	DataCompression=FALSE
+	HeaderCompression=FALSE
+	GprsUseEdge=FALSE
+	AnonymousAccess=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	IfAuthName=RasUser
+	IfAuthPass=pass
+	AuthRetries=1
+	IpDNSAddrFromServer=TRUE
+	IpNameServer1=0.0.0.0
+	IpNameServer2=0.0.0.0
+	EnableLCPExtension=FALSE
+	DisablePlainTextAuth=FALSE
+	PDPAddress=0.0.0.0
+	IpAddrFromServer=TRUE
+	FIELD_COUNT=29
+END_ADD
+
+
+############################################################
+## DefaultGPRS
+## 
+[DefaultGPRS]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=Dummy Default GPRS Settings
+	Usage=1
+	APN=Access point name
+	PDPType=IPV6
+	PDPAddress=www.wid.com
+	Precedence=1
+	Delay=1
+	Reliability=1
+	PeakThroughput=1
+	MeanThroughput=1
+	MinPrecedence=1
+	MinDelay=1
+	MinReliability=1
+	MinPeakThroughput=1
+	MinMeanThroughput=1
+	DataCompression=TRUE
+	HeaderCompression=TRUE
+	GprsUseEdge=FALSE
+	AnonymousAccess=TRUE
+	FIELD_COUNT=19
+END_ADD
+
+
+############################################################
+## CDMA2000PacketServiceTable
+## 
+[CDMA2000PacketServiceTable]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=test name cdma2000
+	IwfName=Test2000
+	ServiceOption=HIGHSPEEDCDMA2000DATA
+	PdpType=IPV4
+	ReqFwdPriority=PRIORITY04
+	ReqRevPriority=PRIORITY04
+	ReqFwdBitrate=32KBPS
+	ReqRevBitrate=32KBPS
+	ReqFwdLoss=LOSS1
+	ReqRevLoss=LOSS1
+	ReqFwdMaxdelay=40MS
+	ReqRevMaxdelay=40MS
+	MinFwdBitrate=32KBPS
+	MinRevBitrate=32KBPS
+	AccptFwdLoss=LOSS2
+	AccptRevLoss=LOSS2
+	AccptFwdMaxdelay=120MS
+	AccptRevMaxdelay=120MS
+	EnableIPHeaderComp=FALSE
+	AnonymousAccess=FALSE
+	IfNetworks=ip
+	IfPromptForAuth=FALSE
+	IfAuthName=RasUser
+	IfAuthPass=pass
+	AuthRetries=1
+	IpNetMask=255.255.255.0
+	IpGateway=10.0.0.1
+	IpAddrFromServer=TRUE
+	IpDNSAddrFromServer=TRUE
+	EnableLCPExtension=TRUE
+	DisablePlainTextAuth=TRUE
+	ApType=2
+	QosWarningTimeout=1000000
+	RlpMode=TRANSPARENT
+	CDMAMobileIP=FALSE
+	CDMAMobileIPTimeout=10000000
+	CDMANaiType=0
+	FIELD_COUNT=37
+END_ADD
+
+
+############################################################
+## DefaultCDMA2000SettingsTable
+## 
+[DefaultCDMA2000SettingsTable]
+
+############################################################
+## LANService
+## 
+[LANService]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=Ethernet
+	IfNetworks=ip,ip6
+	IpNetMask=255.255.255.0
+	#IpGateway=194.72.6.1
+	IpAddrFromServer=FALSE
+	IpAddr=169.254.172.4
+	IpDNSAddrFromServer=FALSE
+	#IpNameServer1=194.72.6.51
+	#IpNameServer2=194.72.6.52
+	#FIELD_COUNT=9
+	FIELD_COUNT=6
+END_ADD
+
+
+############################################################
+## IAP
+## 
+[IAP]
+ADD_SECTION
+# COMMDB_ID = 1
+	Name=NT RAS with Null Modem
+	IAPService=2
+	IAPServiceType=DialOutISP
+	IAPBearer=2
+	IAPBearerType=ModemBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=CSD IAP PlaceHolder01
+	IAPService=3
+	IAPServiceType=DialOutISP
+	IAPBearer=2
+	IAPBearerType=ModemBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 3
+	Name=CSD IAP PlaceHolder02
+	IAPService=4
+	IAPServiceType=DialOutISP
+	IAPBearer=2
+	IAPBearerType=ModemBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 4
+	Name=GPRS IAP PlaceHolder01
+	IAPService=1
+	IAPServiceType=OutgoingGPRS
+	IAPBearer=8
+	IAPBearerType=ModemBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=4
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 5
+	Name=GPRS IAP PlaceHolder02
+	IAPService=2
+	IAPServiceType=OutgoingGPRS
+	IAPBearer=8
+	IAPBearerType=ModemBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=4
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 6
+	Name=mRouter Rs232
+	IAPService=8
+	IAPServiceType=DialOutISP
+	IAPBearer=12
+	IAPBearerType=ModemBearer
+	IAPNetwork=2
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 7
+	Name=mRouter Ir
+	IAPService=8
+	IAPServiceType=DialOutISP
+	IAPBearer=13
+	IAPBearerType=ModemBearer
+	IAPNetwork=2
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 8
+	Name=mRouter BT
+	IAPService=8
+	IAPServiceType=DialOutISP
+	IAPBearer=14
+	IAPBearerType=ModemBearer
+	IAPNetwork=2
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 9
+	Name=mRouter USB
+	IAPService=8
+	IAPServiceType=DialOutISP
+	IAPBearer=15
+	IAPBearerType=ModemBearer
+	IAPNetwork=2
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 10
+	Name=mRouter Wins
+	IAPService=8
+	IAPServiceType=DialOutISP
+	IAPBearer=11
+	IAPBearerType=ModemBearer
+	IAPNetwork=2
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 11
+	Name=VPN IAP
+	IAPService=2
+	IAPServiceType=VpnService
+	IAPBearer=2
+	IAPBearerType=VirtualBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 12
+	Name=EKA1 Assabet on-board ethernet
+	IAPService=1
+	IAPServiceType=LANService
+	IAPBearer=1
+	IAPBearerType=LANBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 13
+	Name=EKA2 Assabet on-board ethernet
+	IAPService=1
+	IAPServiceType=LANService
+	IAPBearer=2
+	IAPBearerType=LANBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 14
+	Name=EKA1 emulator ethernet
+	IAPService=1
+	IAPServiceType=LANService
+	IAPBearer=3
+	IAPBearerType=LANBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 15
+	Name=EKA2 emulator ethernet
+	IAPService=1
+	IAPServiceType=LANService
+	IAPBearer=4
+	IAPBearerType=LANBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 16
+	Name=EKA2 SYBORG on-board ethernet
+	IAPService=1
+	IAPServiceType=LANService
+	IAPBearer=5
+	IAPBearerType=LANBearer
+	IAPNetwork=1
+	IAPNetworkWeighting=0
+	Location=2
+	FIELD_COUNT=8
+END_ADD
+
+
+############################################################
+## ConnectionPreferences
+## 
+[ConnectionPreferences]
+ADD_SECTION
+	Ranking=0
+	Direction=OUTGOING
+	DialogPref=PROMPT
+	BearerSet=CSD
+	IAP=1
+	FIELD_COUNT=5
+END_ADD
+
+ADD_SECTION
+	Ranking=1
+	Direction=OUTGOING
+	DialogPref=PROMPT
+	BearerSet=CSD
+	IAP=1
+	FIELD_COUNT=5
+END_ADD
+
+
+############################################################
+## BTDeviceTable
+## 
+[BTDeviceTable]
+
+############################################################
+## BTSecurityTable
+## 
+[BTSecurityTable]
+
+############################################################
+## BTDefaultTable
+## 
+[BTDefaultTable]
+
+############################################################
+## Proxies
+## 
+[Proxies]
+ADD_SECTION
+# COMMDB_ID = 1
+	ISP=2
+	ProxyServiceType=DialOutISP
+	UseProxyServer=TRUE
+	ProxyServerName=www.dummyproxy.com
+	ProtocolName=http
+	PortNumber=80
+	Exceptions=www.dummyproxy.com/exception
+	FIELD_COUNT=7
+END_ADD
+
+
+############################################################
+## AgentLookup
+## 
+[AgentLookup]
+
+############################################################
+## WAPAccessPoint
+## 
+[WAPAccessPoint]
+ADD_TEMPLATE
+	Name=Default Dial In ISP
+	CurrentBearer=WAPIPBearer
+	FIELD_COUNT=2
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=Dummy WAP Settings
+	CurrentBearer=WAPIPBearer
+	StartPage=www.wapstart.com
+	FIELD_COUNT=3
+END_ADD
+
+
+############################################################
+## WAPIPBearer
+## 
+[WAPIPBearer]
+ADD_TEMPLATE
+	AccessPointId=0
+	IAP=0
+	WSPOption=CONNECTIONLESS
+	Security=FALSE
+	ProxyPortNumber=0
+	FIELD_COUNT=5
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	AccessPointId=2
+	GatewayAddress=www.wapgateway.com
+	IAP=2
+	WSPOption=CONNECTIONORIENTED
+	Security=FALSE
+	ProxyPortNumber=1
+	FIELD_COUNT=6
+END_ADD
+
+
+############################################################
+## WAPSMSBearer
+## 
+[WAPSMSBearer]
+ADD_TEMPLATE
+	AccessPointId=0
+	WSPOption=CONNECTIONLESS
+	Security=FALSE
+	FIELD_COUNT=3
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	AccessPointId=2
+	GatewayAddress=+4412345678901
+	ServiceCentreAddress=+442071234567
+	WSPOption=CONNECTIONORIENTED
+	Security=FALSE
+	FIELD_COUNT=5
+END_ADD
+
+
+############################################################
+## SecureSocketTable
+## 
+[SecureSocketTable]
+ADD_SECTION
+# COMMDB_ID = 1
+	ProtocolName=ssl3.0
+	ProtoLibrary=ssladaptor.dll
+	FIELD_COUNT=2
+END_ADD
+
+ADD_SECTION
+# COMMDB_ID = 2
+	ProtocolName=tls1.0
+	ProtoLibrary=ssladaptor.dll
+	FIELD_COUNT=2
+END_ADD
+
+
+############################################################
+## BTPersistTable
+## 
+[BTPersistTable]
+############################################################
+## ERROR
+## AccessTypeTable
+############################################################
+############################################################
+## ERROR
+## Error opening table
+############################################################
+############################################################
+## ERROR
+## Unable to find the specified object or missing required field values
+############################################################
+
+############################################################
+## VirtualBearer
+## 
+[VirtualBearer]
+ADD_TEMPLATE
+	Name=Default VPN Bearer
+	Agent=VPN.agt
+	IfName=VPN.nif
+	LastSocketActivityTimeout=180
+	LastSessionClosedTimeout=30
+	LastSocketClosedTimeout=60
+	FIELD_COUNT=6
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=VPN Bearer1
+	Agent=ntras.agt
+	IfName=ppp.nif
+	LastSocketActivityTimeout=-1
+	LastSessionClosedTimeout=-1
+	LastSocketClosedTimeout=-1
+	FIELD_COUNT=6
+END_ADD
+
+
+############################################################
+## VpnService
+## 
+[VpnService]
+ADD_TEMPLATE
+	Name=Default VPN
+	Policy=DefaultVPNpolicy
+	HomeIAP=1
+	HomeNetwork=0
+	FIELD_COUNT=4
+END_TEMPLATE
+
+ADD_SECTION
+# COMMDB_ID = 2
+	Name=VPN1
+	Policy=VPNpolicy1
+	HomeIAP=2
+	HomeNetwork=1
+	FIELD_COUNT=4
+END_ADD
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/syborg.cia	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <syborg_priv.h>
+
+//
+//	Timer Access Functions
+//
+
+// Set the starting count value for a timer
+EXPORT_C void __NAKED__ TSyborg::SetTimerLoad(TUint /*aTimerBase*/, TUint32 /*aValue*/)
+{
+  asm("str r1, [r0, #12]");
+  asm("bx lr");
+}
+
+// Read the load register (starting count value)
+EXPORT_C TUint __NAKED__ TSyborg::TimerLoad(TUint /*aTimerBase*/)
+{
+  asm("ldr r0, [r0, #12]");
+  asm("bx lr");
+}
+
+// Read the actual timer value
+EXPORT_C TUint __NAKED__ TSyborg::TimerValue(TUint /*aTimerBase*/)
+{
+	asm("ldr r0, [r0, #16]");
+    asm("bx lr");
+}
+
+// Clear the timer interrupt by writing a value to Timer x clear register
+// The written value doesn't matter as any value will clear the interrupt.
+EXPORT_C void __NAKED__ TSyborg::ClearTimerInt(TUint /*aTimerBase*/)
+{
+	asm("mov r1, #1");	
+	asm("str r1, [r0, #24]");
+    asm("bx lr");
+}
+
+//
+//Interrupt Controller Acces Functions
+//
+
+// Enable specified motherboard Int on either the PIC/SIC
+EXPORT_C void __NAKED__ TSyborg::EnableInt(TUint /*anId*/)
+{
+  asm("ldr r1, __KHwInt");
+  asm("str r0, [r1, #20]");
+  asm("bx lr");
+}
+
+// Disable specified motherboard Int on either the PIC/SIC
+EXPORT_C void __NAKED__ TSyborg::DisableInt(TUint /*anId*/)
+{
+  asm("ldr r1, __KHwInt");
+  asm("str r0, [r1, #16]");
+  asm("bx lr");
+	
+	asm("__KHwInt:");
+	asm(".word %a0" : : "i" (TInt)(KHwBaseSic));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/syborg.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <syborg_priv.h>
+
+//#define DEBUG
+
+#ifdef DEBUG
+#define __DEBUG_PRINT(format...)    Kern::Printf(format)
+#else
+#define __DEBUG_PRINT(format...)    __KTRACE_OPT(KBOOT,Kern::Printf(format))
+#endif
+
+void TSyborg::Init3()
+{
+//  SetTimerMode(KHwBaseCounterTimer, ETimerModePeriodic); 
+//  EnableTimer(KHwBaseCounterTimer, EEnable);
+}
+
+EXPORT_C TBool TSyborg::IsTimerEnabled(TUint aTimerBase)
+{
+  __DEBUG_PRINT("TSyborg::IsTimerEnabled");
+  return ReadReg(aTimerBase, 1);
+}
+
+EXPORT_C void TSyborg::EnableTimerInterrupt(TUint aTimerBase)
+{
+  __DEBUG_PRINT("TSyborg::EnableTimerInterrupt");
+  WriteReg(aTimerBase,5,1);
+}
+
+EXPORT_C void TSyborg::DisableTimerInterrupt(TUint aTimerBase)
+{
+  __DEBUG_PRINT("TSyborg::DisableTimerInterrupt");
+  WriteReg(aTimerBase,5,0);
+}
+
+EXPORT_C void TSyborg::EnableTimer(TUint aTimerBase, TState aState)
+{
+  __DEBUG_PRINT("TSyborg::EnableTimer");
+  //  TUint32 mode = ReadReg(aTimerBase, 1);
+  if (aState == EEnable)
+	WriteReg(aTimerBase, 1, 1);
+  else
+	WriteReg(aTimerBase, 1, 0);
+}
+
+EXPORT_C TSyborg::TTimerMode TSyborg::TimerMode(TUint aTimerBase)
+{
+  __DEBUG_PRINT("TSyborg::TimerMode");
+  if (ReadReg(aTimerBase, 2))
+	return ETimerModeOneShot;
+  else
+	return ETimerModePeriodic;
+}
+
+EXPORT_C void TSyborg::SetTimerMode(TUint aTimerBase, TTimerMode aValue)
+{
+  __DEBUG_PRINT("TSyborg::SetTimerMode");
+  if (aValue == ETimerModePeriodic)
+	WriteReg(aTimerBase, 2, 0);
+  else
+	WriteReg(aTimerBase, 2, 1);
+}
+
+// Return base address of debug UART
+// (as selected in obey file or with eshell debugport command)
+EXPORT_C TUint32 TSyborg::DebugPortAddr()
+{
+	// Defaults to UART 0
+    switch (Kern::SuperPage().iDebugPort)
+    {
+        case KNullDebugPort:        // debug supressed
+            return (TUint32)KNullDebugPort;
+        case 1:
+            return KHwBaseUart1;
+        case 2:
+            return KHwBaseUart2;
+        case 3:
+            return KHwBaseUart3;
+        case 0:
+        default:
+            return KHwBaseUart0;
+    }
+}
+
+EXPORT_C void TSyborg::MarkDebugPortOff()
+{
+	TheVariant.iDebugPortBase = 0;
+}
+
+EXPORT_C TInt TSyborg::VideoRamSize()
+{
+  return 4*640*480;
+}
+
+// !@! 
+EXPORT_C TPhysAddr TSyborg::VideoRamPhys()
+{
+#if 0
+  __KTRACE_OPT(KEXTENSION,Kern::Printf("TSyborg::VideoRamPhys: VideoRamPhys=0x%x", Syborg::VideoRamPhys));
+#endif
+  return 0;
+
+}
+
+EXPORT_C TPhysAddr TSyborg::VideoRamPhysSecure()
+{
+#if 0
+  return Syborg::VideoRamPhysSecure;
+#endif
+  return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/syborg.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,132 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SYBORG_H__
+#define __SYBORG_H__
+
+#include <e32const.h>
+#include <platform.h>
+#include <e32hal.h>
+#include <assp.h>
+#include <kern_priv.h>
+#include <mmboot.h>     // KPrimaryIOBase
+
+#ifndef __SYBORG__
+#define __SYBORG__
+#endif
+
+const TUint KHwBasePeripherals  = KPrimaryIOBase;       
+const TUint KHwLinSeparation	= 0x1000;
+
+const TUint KHwBaseSic				= KHwBasePeripherals + 0x00*KHwLinSeparation;
+// intended for use as a free-running counter. Reading the value register of a free-running syborg counter returns a microsec value
+const TUint KHwBaseRtc				= KHwBasePeripherals + 0x01*KHwLinSeparation;
+// intended for use as an alarm generating timer with a resolution of 1 microsecond
+const TUint KHwBaseCounterTimer			= KHwBasePeripherals + 0x02*KHwLinSeparation;
+const TUint KHwBaseKmiKeyboard			= KHwBasePeripherals + 0x03*KHwLinSeparation;
+const TUint KHwBaseKmiMouse			= KHwBasePeripherals + 0x04*KHwLinSeparation;
+const TUint KHwBaseKmiPointer			= KHwBasePeripherals + 0x04*KHwLinSeparation;
+const TUint KHwBaseClcd				= KHwBasePeripherals + 0x05*KHwLinSeparation;
+const TUint KHwBaseUart0			= KHwBasePeripherals + 0x06*KHwLinSeparation;
+const TUint KHwBaseUart1			= KHwBasePeripherals + 0x07*KHwLinSeparation;
+const TUint KHwBaseUart2			= KHwBasePeripherals + 0x08*KHwLinSeparation;
+const TUint KHwBaseUart3			= KHwBasePeripherals + 0x09*KHwLinSeparation;
+const TUint KHwSVPHostFileSystemDevice		= KHwBasePeripherals + 0x0a*KHwLinSeparation;
+const TUint KHwSVPSnapDevice			= KHwBasePeripherals + 0x0b*KHwLinSeparation;
+const TUint KHwSVPNetDevice			= KHwBasePeripherals + 0x0c*KHwLinSeparation;
+const TUint KHwSVPNandDevice			= KHwBasePeripherals + 0x0d*KHwLinSeparation;
+const TUint KHwSVPAudioDevice			= KHwBasePeripherals + 0x0e*KHwLinSeparation;
+const TUint KHwSVPPlatformDevice		= KHwBasePeripherals + 0x0f*KHwLinSeparation;
+
+	
+enum TSyborgInterruptId
+{
+  EIntTimer0 = 0,     /* RTC -- not used */
+  EIntTimer1 = 1,     /* Interval Timer */
+  EIntKeyboard = 2,
+    EIntPointer = 3,
+  //  EIntMouse = 3,
+  EIntFb = 4,
+  EIntSerial0 = 5,
+  EIntSerial1 = 6,
+  EIntSerial2 = 7,
+  EIntSerial3 = 8
+};
+
+// Timer Mode
+const TUint KPeriodic			= 0x0;
+const TUint KOneShot		    = 0x1;
+
+class TSyborg
+{
+public:
+	// generic enums
+	enum TState
+	{
+		EEnable,
+		EDisable
+	};
+	enum TLock
+	{
+		ELocked=0,
+		EUnlocked=0xA05F
+	};
+    enum TTimerMode
+	{
+	  ETimerModePeriodic=KPeriodic,
+	  ETimerModeOneShot=KOneShot,
+	};
+public:
+    // Initialisation of class
+	static void Init3();
+
+    // Accessor methods for timers 
+	IMPORT_C static void EnableTimerInterrupt(TUint aTimerBase);                    // Enable the timer interrupt
+	IMPORT_C static void DisableTimerInterrupt(TUint aTimerBase);                   // Disable the timer interrupt
+    IMPORT_C static void SetTimerLoad(TUint aTimerBase, TUint32 aValue);			// Set the starting count value for a timer
+    IMPORT_C static TUint TimerLoad(TUint aTimerBase);							    // Read the load register (starting count value)
+    IMPORT_C static TUint TimerValue(TUint aTimerBase);							    // Read the actual timer value
+    IMPORT_C static void ClearTimerInt(TUint aTimerBase); 						    // Clear the timer interrupt
+    IMPORT_C static TBool IsTimerEnabled(TUint aTimerBase);						    // Enquire as to whether the timer is enabled
+    IMPORT_C static void EnableTimer(TUint aTimerBase, TState aState);			    // Enable/disable the timer (start/stop it running)
+    IMPORT_C static TTimerMode TimerMode(TUint aTimerBase);						    // Find out what mode the timer is running in
+    IMPORT_C static void SetTimerMode(TUint aTimerBase, TTimerMode aValue);		    // Set the timer mode (periodic or free running)
+	
+    // Accessor methods for interrupts
+    IMPORT_C static void  EnableInt(TUint anId);					
+    IMPORT_C static void  DisableInt(TUint anId);					
+        
+	IMPORT_C static TInt VideoRamSize();
+	IMPORT_C static TPhysAddr VideoRamPhys();
+	IMPORT_C static TPhysAddr VideoRamPhysSecure();
+
+	// Debug Port Specific
+	IMPORT_C static TUint32 DebugPortAddr();
+	IMPORT_C static void MarkDebugPortOff();
+};
+
+static inline TUint32 ReadReg(TUint32 base, TUint8 aReg)
+{
+  return *(volatile TUint32 *)(base + (aReg << 2));
+}
+
+static inline void WriteReg(TUint32 base, TUint8 aReg, TUint32 aVal)
+{
+  *(volatile TUint32*)(base + (aReg<<2)) = aVal;
+}
+
+#endif  // __SYBORG_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/syborg_priv.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SYBORG_PRIV_H__
+#define __SYBORG_PRIV_H__
+
+#include <e32const.h>
+#include <arm.h>
+#include <assp.h>
+#include <syborg.h>
+
+#define	_LOCK		TInt irq=NKern::DisableAllInterrupts();
+#define	_UNLOCK		NKern::RestoreInterrupts(irq);
+
+const TUint32 K1000HzTickMatchLoad = 1000;
+const TInt KNumSyborgInts = 64;
+
+class SyborgInterrupt : public Interrupt
+{
+public:
+	static void IrqDispatch();
+	static void FiqDispatch();
+	static void DisableAndClearAll();
+	static void Init1();
+	static void Init3();
+	static void Spurious(TAny* anId);
+    static void MsTimerTick(TAny* aPtr);
+
+	static SInterruptHandler Handlers[KNumSyborgInts];
+};
+
+class Syborg : public Asic
+{
+public:
+	IMPORT_C Syborg();
+
+public:
+	// Initialisation
+	IMPORT_C virtual TMachineStartupType StartupReason();
+	IMPORT_C virtual void Init1();
+	IMPORT_C virtual void Init3();
+
+	// Power management
+	IMPORT_C virtual void Idle();
+
+	IMPORT_C void DebugInit();
+	IMPORT_C virtual void DebugOutput(TUint aChar);
+
+	// Timing
+	IMPORT_C virtual TInt MsTickPeriod();
+	IMPORT_C virtual TInt SystemTimeInSecondsFrom2000(TInt& aTime);
+	IMPORT_C virtual TInt SetSystemTimeInSecondsFrom2000(TInt aTime);
+	IMPORT_C virtual TUint32 NanoWaitCalibration();
+
+	// HAL
+	virtual TInt VariantHal(TInt aFunction, TAny* a1, TAny* a2);
+
+	// Machine configuration
+	virtual TPtr8 MachineConfiguration();
+
+	TUint32 iDebugPortBase;
+
+	static Syborg* Variant;
+	static TPhysAddr VideoRamPhys;
+	static TPhysAddr VideoRamPhysSecure;
+	NTimerQ* iTimerQ;
+};
+
+GLREF_D Syborg TheVariant;
+
+#endif  // __SYBORG_PRIV_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/system.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SYSTEM_H__
+#define __SYSTEM_H__
+
+#ifndef __BOOTLOADER_VARIANTCONFIG_H__
+#include <syborg.h>
+#endif
+
+#define VARIANT_INTERFACE           TSyborg
+_LIT(KPddName,"Comm.SYBORG_SERIAL");
+
+#endif  // __SYSTEM_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/system_priv.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SYSTEM_PRIV_H__
+#define __SYSTEM_PRIV_H__
+
+#include "system.h"
+#include <syborg_priv.h>
+
+#endif  // __SYSTEM_PRIV_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/specific/variantmediadef.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __VARIANTMEDIADEF_H__
+#define __VARIANTMEDIADEF_H__
+
+// Variant parameters for IRAM Media Driver (MEDINT.PDD)
+#define IRAM_DRIVECOUNT 1
+#define IRAM_DRIVELIST  0       // C:
+#define IRAM_NUMMEDIA   1	
+#define IRAM_DRIVENAME "IRam"
+
+#endif  // __VARIANTMEDIADEF_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/driver/stringops.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+		
+char * strchr (const char *p, int ch)
+	{
+	char c;
+
+	c = ch;
+	for (;; ++p) 
+		{
+		if (*p == c)
+			return ((char *)p);
+		if (*p == '\0')
+			return (char *)(0);
+		}
+	/* NOTREACHED */
+	}
+
+unsigned int strlen(const char *str)
+	{
+	const char *s;
+	for (s = str; *s; ++s)	{	}
+
+	return(s - str);
+	}
+
+int strcmp(const char *s1, const char *s2)
+	{
+	while (*s1 == *s2++)
+		if (*s1++ == 0)
+			return (0);
+	return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
+	}
+
+void * memchr(const void *s, int c, unsigned n)
+	{
+	if (n != 0) 
+		{
+		const unsigned char *p = s;
+		do 
+			{
+			if (*p++ == (unsigned char)c)
+				return ((void *)(p - 1));
+			} while (--n != 0);
+	
+		}
+	// Not found
+	return (void *)0;
+	}
+
+int memcmp(const void *s1, const void *s2, unsigned n)
+	{
+	if (n != 0) 
+		{
+		const unsigned char *p1 = s1, *p2 = s2;
+
+		do 
+			{
+			if (*p1++ != *p2++)
+				return (*--p1 - *--p2);
+			} while (--n != 0);
+		}
+	return (0);
+	}
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/driver/svphostfsdriver.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,919 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Device driver for SVP Host file system access
+*
+*/
+
+#ifdef __WINS__
+#error - this driver cannot be built for emulation
+#endif
+
+#include <e32def.h>
+#include <e32cmn.h>
+#include <u32std.h>
+#include <kernel.h>
+#include <kern_priv.h>
+#include <arm.h>
+#include <cache.h>
+#include <nkern.h>
+#include <u32hal.h>
+
+#include <system.h>
+
+#include "rsvphostfsdriver.h"
+
+#include "libfdt.h"
+
+// Debug messages - uncomment define below
+//#define SVPDBG 
+#ifdef SVPDBG
+#define DP(format...) Kern::Printf(format)
+#else
+#define DP(format...)
+#endif
+		
+#define SVP_HOST_FS_DEVICE_ID  0xc51d0008
+#define SVP_PLATFORM_DEVICE_ID 0xc51d1000
+		
+class DSVPHostFsDriverFactory : public DLogicalDevice
+{
+public:
+
+	DSVPHostFsDriverFactory();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+};
+
+class DSVPHostFsChannel : public DLogicalChannel
+{
+public:
+
+	DSVPHostFsChannel(DLogicalDevice* aLogicalDevice);
+	~DSVPHostFsChannel();
+
+	virtual TInt DoCreate(TInt aUnit, const TDesC* anInfo, const TVersion& aVer);	
+	virtual void HandleMsg(TMessageBase* aMsg);
+	
+protected:
+	virtual void DoCancel(TInt aReqNo);
+	virtual TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
+	virtual TInt DoControl(TInt aFunction, TAny *a1, TAny *a2);
+	
+private:
+	TInt MkDir(TSVPHostFsMkDirInfo* aInfo);
+	TInt RmDir(TSVPHostFsRmDirInfo* aInfo);
+	TInt Delete(TSVPHostFsDeleteInfo* aInfo);
+	TInt Rename(TSVPHostFsRenameInfo* aInfo);
+	TInt Replace(TSVPHostFsReplaceInfo* aInfo);
+	TInt Entry(TSVPHostFsEntryInfo* aInfo);
+	TInt SetEntry(TSVPHostFsSetEntryInfo* aInfo);
+	TInt FileOpen(TSVPHostFsFileOpenInfo* aInfo);
+	TInt FileClose(TUint32 aDrive, TUint32 aHandle);
+	TInt FileRead(TSVPHostFsFileReadInfo* aInfo);
+	TInt FileWrite(TSVPHostFsFileWriteInfo* aInfo);
+	TInt FileSetSize(TSVPHostFsFileSetSizeInfo* aInfo);
+	TInt FileSetEntry(TSVPHostFsSetEntryInfo* aInfo);
+	TInt DirOpen(TSVPHostFsDirOpenInfo* aInfo);
+	TInt Flush(TUint32 aDrive);
+	TInt DirClose(TUint32 aDrive, TUint32 aHandle);
+	TInt DirRead(TSVPHostFsDirReadInfo* aInfo);
+
+	TInt GetID(TUint32 aDrive, TUint32 * aId);
+
+        TInt SetUpDrives();
+	TInt GetDriveMap(TAny * aMap);
+
+private:
+	DThread* iClientThread;
+	TDfcQue* iDFCQue;
+	TUint32 iDriveMap[DRIVE_MAP_SIZE] ; 
+
+};
+
+
+#define RET_IF_ERROR(v, e) { if ((v = (e)) != KErrNone) return v; }
+
+
+#define	EDeviceID	0
+#define	EOp		1
+#define ETreeStart	1
+#define	EResult		2
+#define	EArg0		3
+#define	EArg1		4
+#define	EArg2		5
+#define	EArg3		6
+
+static inline TUint32 SVPReadReg(TUint32 dev, TUint32 aReg)
+	{
+	DP("** ReadReg @ 0x%08x (%d)",dev,aReg);
+
+	return *(volatile TUint32 *)(dev + (aReg << 2));
+	}
+
+static inline void SVPWriteReg(TUint32 dev, TUint32 aReg, TUint32 aVal)
+	{
+	DP("** WriteReg @ 0x%08x (%d,%d)",dev,aReg,aVal);
+
+	*(volatile TUint32*)(dev + (aReg << 2)) = aVal;
+	}
+
+static inline void SVPInvoke(TUint32 dev, TUint32 aVal)
+	{
+	DP("** Invoke @ 0x%08x (%d)",dev,aVal);
+
+	*(TUint32*)(dev + (EOp << 2)) = aVal;
+	}
+
+/////////////////////////////////////////////////////////////////////////
+//
+// DSVPHostFsDriverFactory
+//
+/////////////////////////////////////////////////////////////////////////
+
+//
+// DSVPHostFsDriverFactory constructor
+//
+DSVPHostFsDriverFactory::DSVPHostFsDriverFactory()
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsDriverFactory::DSVPHostFsDriverFactory()");
+
+	iVersion = TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);    
+	}
+
+//
+// DSVPHostFsDriverFactory::Create
+//
+TInt DSVPHostFsDriverFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsDriverFactory::Create()");
+
+	aChannel = new DSVPHostFsChannel(this);
+	
+	return aChannel ? KErrNone : KErrNoMemory;
+	}
+
+//
+// DSVPHostFsDriverFactory::Install
+//
+TInt DSVPHostFsDriverFactory::Install()
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsDriverFactory::Install()");
+
+	return(SetName(&KSVPHostFsDriverName));
+	}
+
+//
+// DSVPHostFsDriverFactory::Install
+//
+void DSVPHostFsDriverFactory::GetCaps(TDes8& aDes) const
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsDriverFactory::GetCaps()");
+
+	TCapsSVPHostFsDriver b;
+	b.iVersion = TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber);
+	aDes.FillZ(aDes.MaxLength());
+	aDes.Copy((TUint8 *)&b, Min(aDes.MaxLength(), sizeof(b)));
+	}
+
+
+/////////////////////////////////////////////////////////////////////////
+//
+// DSVPHostFsChannel implementation
+//
+/////////////////////////////////////////////////////////////////////////
+
+//
+// DSVPHostFsChannel constructor
+//
+DSVPHostFsChannel::DSVPHostFsChannel(DLogicalDevice* aLogicalDevice)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DSVPHostFsChannel()");
+
+	iDevice = aLogicalDevice;
+	
+	iClientThread = &Kern::CurrentThread();
+	iClientThread->Open();
+	}
+
+//
+// DSVPHostFsChannel destructor
+//
+DSVPHostFsChannel::~DSVPHostFsChannel()
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::~DSVPHostFsChannel()");
+	Kern::SafeClose((DObject*&)iClientThread, NULL);
+	}
+
+//
+// DSVPHostFsChannel::DoCreate
+//
+TInt DSVPHostFsChannel::DoCreate(TInt /*aUnit*/, const TDesC* anInfo, const TVersion& aVer)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoCreate()");
+
+  	if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), aVer))
+		return KErrNotSupported; 
+  	
+		       
+	//Setup the driver for receiving client messages
+	SetDfcQ(Kern::DfcQue0());
+	iMsgQ.Receive();  	
+
+	SetUpDrives();
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoCreate()- checking device");
+	TUint id = SVPReadReg(KHwSVPHostFileSystemDevice, EDeviceID);
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoCreate()- checked device- 0x%08x -expected 0x%08x", 
+		id, SVP_HOST_FS_DEVICE_ID);
+	return id == SVP_HOST_FS_DEVICE_ID ? KErrNone :	KErrHardwareNotAvailable;
+	}
+
+TInt DSVPHostFsChannel::SetUpDrives()
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::SetUpDrives() @ 0x%08x", KHwSVPPlatformDevice) ;
+	TUint32 platId = SVPReadReg(KHwSVPPlatformDevice, EDeviceID); 
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::SetUpDrives()- checked device- 0x%08x -expected 0x%08x", 
+		platId, SVP_PLATFORM_DEVICE_ID);
+	if (platId != SVP_PLATFORM_DEVICE_ID) return KErrHardwareNotAvailable;
+
+	TUint32 * fdt = (TUint32 *)((char *)(SVPReadReg(KHwSVPPlatformDevice, ETreeStart) + KHwSVPPlatformDevice)); 
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::SetUpDrives()- device tree @ 0x%08x", fdt);
+
+	// Iteratate over the tree looking for "syborg,hostfs" nodes.
+	const char * compatible = "syborg,hostfs" ; 
+	int offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
+	while (offset != -FDT_ERR_NOTFOUND) 
+		{
+		if (offset < 0)
+			{
+			DP("FDT: Node not found %d", offset) ;
+			return KErrHardwareNotAvailable	; 
+			}
+
+		int lenp1, lenp2 = 0; 
+		TUint32 * deviceAddressp = (TUint32 *)fdt_getprop(fdt,offset,"reg",&lenp1); 
+
+		if (!deviceAddressp)
+			{
+			DP("FDT format error: reg %d", lenp1);
+			return KErrHardwareNotAvailable	; 
+			}
+
+
+		TUint32 * driveNumberp = (TUint32 *)fdt_getprop(fdt,offset,"drive-number",&lenp2);
+		if (!driveNumberp)
+			{
+			DP("FDT format error: drive-number %d", lenp2);
+			return KErrHardwareNotAvailable	; 
+			}
+		TUint32 deviceAddressPhys = bswap_32(*deviceAddressp);
+
+#define PhysicalToLinear(addr) ((addr & (~(Epoc::LinearToPhysical(KPrimaryIOBase)))) | KPrimaryIOBase)
+	
+		TUint32 deviceAddressLin = PhysicalToLinear(deviceAddressPhys) ; 
+		TUint32 driveNumber = bswap_32(*driveNumberp) ;
+		DP("FDT: dev address phys 0x%08x lin 0x%08x len1 %d drive number %08x len2 %d", 
+			deviceAddressPhys, deviceAddressLin, lenp1, driveNumber, lenp2) ; 
+		TUint32 fsId = SVPReadReg(deviceAddressLin, EDeviceID) ; 
+		DP("FDT: dev id 0x%08x", fsId) ; 
+		if (fsId != SVP_HOST_FS_DEVICE_ID) return KErrHardwareNotAvailable ;
+
+		// we have a disagreement about the base number of the drives: 0 or 1?
+		iDriveMap[driveNumber-1] = deviceAddressLin ; 
+		offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
+		}
+	return KErrNone;
+	}
+	
+//
+// DSVPHostFsChannel::DoCancel
+//
+void DSVPHostFsChannel::DoCancel(TInt aReqNo)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoCancel() %x(%d)", aReqNo, aReqNo);
+	}
+
+//
+// DSVPHostFsChannel::DoRequest
+//
+TInt DSVPHostFsChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoRequest() %x(%d)", aReqNo, aReqNo);
+
+	TInt err = KErrGeneral;         
+
+	(void)aStatus;
+
+	switch(aReqNo)
+		{
+	        case RSVPHostFsDriver::EMkDir:
+			{
+			err = MkDir((TSVPHostFsMkDirInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::ERmDir:
+			{
+			err = RmDir((TSVPHostFsRmDirInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EDelete:
+			{
+			err = Delete((TSVPHostFsDeleteInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::ERename:
+			{
+			err = Rename((TSVPHostFsRenameInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EReplace:
+			{
+			err = Replace((TSVPHostFsReplaceInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EEntry:
+			{
+			err = Entry((TSVPHostFsEntryInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::ESetEntry:
+			{
+			err = SetEntry((TSVPHostFsSetEntryInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileOpen:
+			{
+			err = FileOpen((TSVPHostFsFileOpenInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EDirOpen:
+			{
+			err = DirOpen((TSVPHostFsDirOpenInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileClose:
+			{
+			err = FileClose((TUint32)a1, (TUint32)a2);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileRead:
+			{
+			err = FileRead((TSVPHostFsFileReadInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileWrite:
+			{
+			err = FileWrite((TSVPHostFsFileWriteInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileSetSize:
+			{
+			err = FileSetSize((TSVPHostFsFileSetSizeInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EFileFlushAll:
+			{
+		    err = Flush((TUint32)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EDirClose:
+			{
+		        err = DirClose((TUint32)a1, (TUint32)a2);
+			break;
+			}
+	        case RSVPHostFsDriver::EDirRead:
+			{
+		        err = DirRead((TSVPHostFsDirReadInfo*)a1);
+			break;
+			}
+	        case RSVPHostFsDriver::EGetDeviceID:
+			{
+		  err = GetID((TUint32)a1, (TUint32*)a2); 
+			break;
+			}
+	        case RSVPHostFsDriver::EGetDriveMap:
+			{
+		        err = GetDriveMap((TUint32*)a1);
+			break;
+			}
+
+		default:
+			{
+			err = KErrGeneral;
+			}
+		}
+	
+	if (KErrNone != err)
+		{
+		DP("Error %d from DoRequest", err);
+		}
+	
+	return err;
+	}
+
+//
+// DSVPHostFsChannel::DoControl
+//
+TInt DSVPHostFsChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DoControl()");
+
+	DP("DoControl Function %d", aFunction);
+
+	TInt err = KErrGeneral;         
+
+	/* There should be a good reason to use a control rather than a request. */
+
+	if (KErrNone != err)
+		{
+		DP("** (SVPHOSTFSDRIVER) Error %d from control function", err);
+		}
+	
+	return err;
+	}
+
+void DSVPHostFsChannel::HandleMsg(TMessageBase* aMsg)
+	{
+	
+	TThreadMessage& m = *(TThreadMessage*)aMsg;
+	TInt id = m.iValue;
+
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::HandleMsg() %x(%d)", id, id);
+
+	if (id == (TInt)ECloseMsg)
+		{
+		m.Complete(KErrNone, EFalse); 
+		return;
+		}
+	if (id == KMaxTInt)
+		{
+		// DoCancel
+		DoCancel(m.Int0());
+		m.Complete(KErrNone, ETrue); 
+		return;
+		}
+	if (id < 0)
+		{
+		// DoRequest
+		TRequestStatus* pStatus = (TRequestStatus*)m.Ptr0();
+		TInt r = DoRequest(~id, pStatus, m.Ptr1(), m.Ptr2());
+		//		if (r != KErrNone)
+		Kern::RequestComplete(iClientThread,pStatus,r);
+		m.Complete(KErrNone, ETrue);
+		}
+	else
+		{
+		// DoControl
+		TInt r = DoControl(id, m.Ptr0(), m.Ptr1());
+		m.Complete(r, ETrue);
+		}
+	}
+
+TInt DSVPHostFsChannel::MkDir(TSVPHostFsMkDirInfo* aInfo)
+	{
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::MkDir()");
+
+	TSVPHostFsMkDirInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsMkDirInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+	
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPWriteReg(device, EArg2, info.iFlags);
+	SVPInvoke(device, RSVPHostFsDriver::EMkDir);
+
+	return SVPReadReg(device, EResult);
+
+	}
+
+TInt DSVPHostFsChannel::RmDir(TSVPHostFsRmDirInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::RmDir()");
+
+	TSVPHostFsRmDirInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsRmDirInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPInvoke(device, RSVPHostFsDriver::ERmDir);
+
+	return SVPReadReg(device, EResult);
+
+	}
+
+TInt DSVPHostFsChannel::Delete(TSVPHostFsDeleteInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::Delete()");
+
+	TSVPHostFsDeleteInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsDeleteInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPInvoke(device, RSVPHostFsDriver::EDelete);
+
+	return SVPReadReg(device, EResult);
+
+	}
+
+TInt DSVPHostFsChannel::Rename(TSVPHostFsRenameInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::Rename()");
+
+	TSVPHostFsRenameInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsRenameInfo)));
+
+	if (!info.iOldName)
+		return KErrArgument;
+
+	if (!info.iNewName)
+		return KErrArgument;
+
+	TUint16 oldPathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iOldName, (TUint8*)oldPathData, info.iOldLength*2));
+
+	TUint16 newPathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iNewName, (TUint8*)newPathData, info.iNewLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)oldPathData));
+	SVPWriteReg(device, EArg1, info.iOldLength);
+	SVPWriteReg(device, EArg2, Epoc::LinearToPhysical((TUint32)newPathData));
+	SVPWriteReg(device, EArg3, info.iNewLength);
+	SVPInvoke(device, RSVPHostFsDriver::ERename);
+
+	return SVPReadReg(device, EResult);
+
+	}
+
+TInt DSVPHostFsChannel::Replace(TSVPHostFsReplaceInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::Replace()");
+
+	TSVPHostFsReplaceInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsReplaceInfo)));
+
+	if (!info.iOldName)
+		return KErrArgument;
+
+	if (!info.iNewName)
+		return KErrArgument;
+
+	TUint16 oldPathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iOldName, (TUint8*)oldPathData, info.iOldLength*2));
+
+	TUint16 newPathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iNewName, (TUint8*)newPathData, info.iNewLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)oldPathData));
+	SVPWriteReg(device, EArg1, info.iOldLength);
+	SVPWriteReg(device, EArg2, Epoc::LinearToPhysical((TUint32)newPathData));
+	SVPWriteReg(device, EArg3, info.iNewLength);
+	SVPInvoke(device, RSVPHostFsDriver::EReplace);
+
+	return SVPReadReg(device, EResult);
+
+	}
+
+TInt DSVPHostFsChannel::Entry(TSVPHostFsEntryInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::Entry()");
+
+	TSVPHostFsEntryInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsEntryInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPInvoke(device, RSVPHostFsDriver::EEntry);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	TUint32 att = SVPReadReg(device, EArg0);
+	TUint32 modified = SVPReadReg(device, EArg1);
+	TUint32 filesize = SVPReadReg(device, EArg2);
+	// TODO: Yuk! Hack alert! Say EWindows for now. But really should probably say EUnknown,
+	// since the device won't tell us. Not sure if it can (easily) given remote mounting etc.
+	// However this probably delays the problem. On the other hand it is probably best to make
+	// the file service guess, since it need only guess once, and cache its guess.
+	TUint32 filetimetype = EWindows;
+
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iAtt, (TUint8*)&att, sizeof(att)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iModified, (TUint8*)&modified, sizeof(modified)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iSize, (TUint8*)&filesize, sizeof(filesize)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iTimeType, (TUint8*)&filetimetype, sizeof(filetimetype)));
+	return KErrNone;
+	}
+
+TInt DSVPHostFsChannel::SetEntry(TSVPHostFsSetEntryInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::SetEntry()");
+	return KErrNotSupported;
+	}
+
+TInt DSVPHostFsChannel::Flush(TUint32 aDrive)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::Flush()");
+	TUint32 device = iDriveMap[aDrive];
+	SVPInvoke(device, RSVPHostFsDriver::EFileFlushAll);
+
+	return KErrNone;
+	}
+
+TInt DSVPHostFsChannel::DirOpen(TSVPHostFsDirOpenInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DirOpen()");
+
+	TSVPHostFsDirOpenInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsDirOpenInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPInvoke(device, RSVPHostFsDriver::EDirOpen);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	// handle is in arg 0
+	TUint32 handle = SVPReadReg(device, EArg0);
+	return Kern::ThreadRawWrite(iClientThread, &aInfo->iHandle, (TUint8*)&handle, sizeof(handle));
+	}
+
+TInt DSVPHostFsChannel::FileOpen(TSVPHostFsFileOpenInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileOpen()");
+
+	TSVPHostFsFileOpenInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsFileOpenInfo)));
+
+	if (!info.iName)
+		return KErrArgument;
+
+	TUint16 pathData[KMaxPath];
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, info.iName, (TUint8*)pathData, info.iLength*2));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, Epoc::LinearToPhysical((TUint32)pathData));
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPWriteReg(device, EArg2, info.iMode);
+	SVPWriteReg(device, EArg3, info.iOpen);
+	SVPInvoke(device, RSVPHostFsDriver::EFileOpen);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	TUint32 handle = SVPReadReg(device, EArg0);
+	TUint32 att = SVPReadReg(device, EArg1);
+	TUint32 modified = SVPReadReg(device, EArg2);
+	TUint32 size = SVPReadReg(device, EArg3);
+	TUint32 timeType = EWindows;
+
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iHandle, (TUint8*)&handle, sizeof(handle)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iAtt, (TUint8*)&att, sizeof(att)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iModified, (TUint8*)&modified, sizeof(modified)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iSize, (TUint8*)&size, sizeof(size)));
+	return Kern::ThreadRawWrite(iClientThread, &aInfo->iTimeType, (TUint8*)&timeType, sizeof(timeType));
+
+	}
+
+TInt DSVPHostFsChannel::FileClose(TUint32 aDrive, TUint32 aHandle)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileClose()");
+
+	TUint32 device = iDriveMap[aDrive];
+	SVPWriteReg(device, EArg0, aHandle);
+	SVPInvoke(device, RSVPHostFsDriver::EFileClose);
+	return SVPReadReg(device, EResult);
+	}
+
+TInt DSVPHostFsChannel::FileRead(TSVPHostFsFileReadInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileRead()");
+
+	char buf[0x400];
+	TSVPHostFsFileReadInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsFileReadInfo)));
+
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileRead handle %d length %d pos %d phys_addr 0x%08x info.iBuf 0x%08x",
+	   info.iHandle, info.iLength, info.iPos, Epoc::LinearToPhysical((TUint32)buf), info.iBuf);
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, info.iHandle);
+	SVPWriteReg(device, EArg1, info.iPos);	
+	SVPWriteReg(device, EArg2, Epoc::LinearToPhysical((TUint32)buf));
+	SVPWriteReg(device, EArg3, info.iLength);	
+	SVPInvoke(device, RSVPHostFsDriver::EFileRead);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	TUint32 len = SVPReadReg(device, EArg0);
+
+	DP("** (SVPHOSTFSDRIVER)  Read %d bytes", len);
+
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iLength, (TUint8*)&len, sizeof(len)));
+	return Kern::ThreadRawWrite(iClientThread, (TUint8*)info.iBuf, (TUint8*)&buf, len);
+	}
+
+TInt DSVPHostFsChannel::FileWrite(TSVPHostFsFileWriteInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileWrite()");
+
+	char buf[0x400];
+	TSVPHostFsFileWriteInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsFileWriteInfo)));
+
+	DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileWrite handle %d length %d pos %d phys_addr 0x%08x info.iBuf 0x%08x", 
+	   info.iHandle, info.iLength, info.iPos, Epoc::LinearToPhysical((TUint32)buf), info.iBuf);
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, (TUint8 *)info.iBuf, buf, info.iLength));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, info.iHandle);
+	SVPWriteReg(device, EArg1, info.iPos);	
+	SVPWriteReg(device, EArg2, Epoc::LinearToPhysical((TUint32)buf));
+	SVPWriteReg(device, EArg3, info.iLength);	
+	SVPInvoke(device, RSVPHostFsDriver::EFileWrite);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	TUint32 len = SVPReadReg(device, EArg0);
+
+	DP("** (SVPHOSTFSDRIVER)  Wrote %d bytes", len);
+
+        return Kern::ThreadRawWrite(iClientThread, &aInfo->iLength, (TUint8*)&len, sizeof(len));
+	}
+
+TInt DSVPHostFsChannel::FileSetSize(TSVPHostFsFileSetSizeInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileSetSize()");
+  
+	TSVPHostFsFileSetSizeInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsFileSetSizeInfo)));
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, info.iHandle);
+	SVPWriteReg(device, EArg1, info.iLength);
+	SVPInvoke(device, RSVPHostFsDriver::EFileSetSize);
+
+	TUint32 res = SVPReadReg(device, EResult);
+
+	RET_IF_ERROR(err, res);
+
+	return res;
+	}
+
+TInt DSVPHostFsChannel::FileSetEntry(TSVPHostFsSetEntryInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::FileSetEntry()");
+
+	return KErrNotSupported;
+	}
+
+TInt DSVPHostFsChannel::DirClose(TUint32 aDrive, TUint32 aHandle)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DirClose()");
+
+	TUint32 device = iDriveMap[aDrive];
+	SVPWriteReg(device, EArg0, aHandle);
+	SVPInvoke(device, RSVPHostFsDriver::EDirClose);
+	return SVPReadReg(device, EResult);
+	}
+
+TInt DSVPHostFsChannel::DirRead(TSVPHostFsDirReadInfo* aInfo)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::DirRead()");
+
+	TUint16 name[KMaxPath];
+	TSVPHostFsDirReadInfo info;
+	TInt err = KErrNone;
+
+	RET_IF_ERROR(err, Kern::ThreadRawRead(iClientThread, aInfo, (TUint8*)&info, sizeof(TSVPHostFsDirReadInfo)));
+
+
+	TUint32 device = iDriveMap[info.iDrive];
+	SVPWriteReg(device, EArg0, info.iHandle);
+	SVPWriteReg(device, EArg1, Epoc::LinearToPhysical((TUint32)name));
+	SVPWriteReg(device, EArg2, KMaxPath);
+	SVPInvoke(device, RSVPHostFsDriver::EDirRead);
+
+	RET_IF_ERROR(err, SVPReadReg(device, EResult));
+
+	TUint32 att = SVPReadReg(device, EArg0);
+	TUint32 modified = SVPReadReg(device, EArg1);
+	TUint32 filesize = SVPReadReg(device, EArg2);
+	TUint32 namesize = SVPReadReg(device, EArg3);
+	// TODO: Yuk! Hack alert! Say EWindows for now. But really should probably say EUnknown,
+	// since the device won't tell us. Not sure if it can (easily) given remote mounting etc.
+	// However this probably delays the problem. On the other hand it is probably best to make
+	// the file service guess, since it need only guess once, and cache its guess.
+	TUint32 filetimetype = EWindows;
+
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iAtt, (TUint8*)&att, sizeof(att)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iModified, (TUint8*)&modified, sizeof(modified)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iSize, (TUint8*)&filesize, sizeof(filesize)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iTimeType, (TUint8*)&filetimetype, sizeof(filetimetype)));
+	RET_IF_ERROR(err, Kern::ThreadRawWrite(iClientThread, &aInfo->iLength, (TUint8*)&namesize, sizeof(namesize)));
+	return Kern::ThreadRawWrite(iClientThread, &aInfo->iName, (TUint8*)&name, namesize * sizeof(TUint16));
+	}
+
+TInt DSVPHostFsChannel::GetID(TUint32 aDrive, TUint32 * aId)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::GetID");
+	TUint32 device = iDriveMap[aDrive];
+        TUint32 id = SVPReadReg(device, EDeviceID);
+	return Kern::ThreadRawWrite(iClientThread, aId, &id, sizeof(TUint32));
+	}
+
+TInt DSVPHostFsChannel::GetDriveMap(TAny * aMap)
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsChannel::GetDriveMap");
+	return Kern::ThreadRawWrite(iClientThread, aMap, iDriveMap, sizeof(iDriveMap));
+	}
+
+DECLARE_EXTENSION_LDD()
+	{
+        DP("** (SVPHOSTFSDRIVER) DSVPHostFsDriverFactory created");
+        return new DSVPHostFsDriverFactory;
+	}
+
+DECLARE_STANDARD_EXTENSION()
+	{
+        DP("** (SVPHOSTFSDRIVER) SVPHostFs extension entry point");
+
+	DP("** (SVPHOSTFSDRIVER) Creating LocDrv device");
+	TInt r;
+	DSVPHostFsDriverFactory* device = new DSVPHostFsDriverFactory;
+	if (device==NULL)
+		r=KErrNoMemory;
+	else
+		r=Kern::InstallLogicalDevice(device);
+
+	DP("** (SVPHOSTFSDRIVER) Installing LocDrv device in kernel returned %d",r);
+
+	return r;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/driver/svphostfsdriver.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SVPHOSTFSDRIVER_H__
+#define __SVPHOSTFSDRIVER_H__
+
+
+#include "rsvphostfsdriver.h"
+
+// Debug messages
+//#define SVPDBG
+#ifdef SVPDBG
+#define LOG_MSG(x) Kern::Printf(x)
+#define LOG_MSG2(x, y) Kern::Printf(x, y)
+#else
+#define LOG_MSG(x)
+#define LOG_MSG2(x, y)
+#endif
+
+
+//
+// class DSVPHostFsDriverFactory
+//
+class DSVPHostFsDriverFactory : public DLogicalDevice
+{
+public:
+
+	DSVPHostFsDriverFactory();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+};
+
+//
+// DSVPHostFsChannel
+//
+class DSVPHostFsChannel : public DLogicalChannel
+{
+public:
+
+	DSVPHostFsChannel(DLogicalDevice* aLogicalDevice);
+	~DSVPHostFsChannel();
+
+	virtual TInt DoCreate(TInt aUnit, const TDesC* anInfo, const TVersion& aVer);	
+	virtual void HandleMsg(TMessageBase* aMsg);
+	
+protected:
+	virtual void DoCancel(TInt aReqNo);
+	virtual TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
+	virtual TInt DoControl(TInt aFunction, TAny *a1, TAny *a2);
+	
+private:
+	TInt DirOpen(TSVPHostFsDirOpenInfo* aInfo);
+	TInt DirClose(TUint32 aHandle);
+	TInt DirRead(TSVPHostFsDirReadInfo* aInfo);
+
+private:
+	DThread* iClientThread;
+	
+	
+	TDfcQue* iDFCQue;
+
+};
+
+#endif //__SVPHOSTFSDRIVER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/rsvphostfsdriver.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,167 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32uid.h>
+
+#include <rsvphostfsdriver.h>
+
+#include "svphostfsy.h"
+
+#ifdef DP
+#undef DP
+#define DP(f...)
+#endif
+
+TInt RSVPHostFsDriver::Open()
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::Open()"));
+	return DoCreate(KSVPHostFsDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), KNullUnit, NULL, NULL);
+	}
+
+TInt RSVPHostFsDriver::MkDir(TSVPHostFsMkDirInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::MkDir()"));
+	return DoSVPRequest(EMkDir, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::RmDir(TSVPHostFsRmDirInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::RmDir()"));
+	return DoSVPRequest(ERmDir, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::Delete(TSVPHostFsDeleteInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::Delete()"));
+	return DoSVPRequest(EDelete, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::Rename(TSVPHostFsRenameInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::Rename()"));
+	return DoSVPRequest(ERename, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::Replace(TSVPHostFsReplaceInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::Replace()"));
+	return DoSVPRequest(EReplace, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::ReadUid(const TDesC& /*aName*/,TEntry& /*anEntry*/)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::ReadUid()"));
+	return KErrNone;
+	}
+
+TInt RSVPHostFsDriver::Entry(TSVPHostFsEntryInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::Entry()"));
+	return DoSVPRequest(EEntry, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::SetEntry(TSVPHostFsSetEntryInfo &aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::SetEntry()"));
+	return  DoSVPRequest(ESetEntry, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::FileOpen(TSVPHostFsFileOpenInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileOpen()"));
+	return DoSVPRequest(EFileOpen, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::FileClose(TUint32 aDrive, TUint32 aHandle)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileClose()"));
+	return DoSVPRequest(EFileClose, (TAny *)aDrive, (TAny *)aHandle);
+	}
+
+TInt RSVPHostFsDriver::FileRead(TSVPHostFsFileReadInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileRead()"));
+	return  DoSVPRequest(EFileRead, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::FileWrite(TSVPHostFsFileWriteInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileWrite()"));
+	return  DoSVPRequest(EFileWrite, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::FileSetSize(TSVPHostFsFileSetSizeInfo &aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileSetSize()"));
+	return  DoSVPRequest(EFileSetSize, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::FileSetEntry(TSVPHostFsSetEntryInfo &aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FileSetEntry()"));
+	return  KErrNotSupported;
+	}
+
+TInt RSVPHostFsDriver::FlushData(TUint32 aDrive)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FlushData()"));
+	return DoSVPRequest(EFileFlushAll, (TAny *)aDrive);
+	}
+
+TInt RSVPHostFsDriver::FlushAll(TUint32 aDrive)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::FlushAll()"));
+	return DoSVPRequest(EFileFlushAll, (TAny *)aDrive);
+	}
+
+TInt RSVPHostFsDriver::DirOpen(TSVPHostFsDirOpenInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::DirOpen()"));
+	return DoSVPRequest(EDirOpen, &aInfo);
+	}
+
+TInt RSVPHostFsDriver::DirClose(TUint32 aDrive, TUint32 aHandle)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::DirClose()"));
+	return DoSVPRequest(EDirClose, (TAny *)aDrive, (TAny *)aHandle);
+	}
+
+TInt RSVPHostFsDriver::DirRead(TSVPHostFsDirReadInfo& aInfo)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::DirRead()"));
+	return  DoSVPRequest(EDirRead, &aInfo);
+	}
+
+TUint32 RSVPHostFsDriver::GetDeviceID(TUint32 aDrive)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::GetDeviceID()"));
+
+	TUint32 id;
+	TInt r = DoSVPRequest(EGetDeviceID, (TAny *) aDrive, &id);
+	return (r != KErrNone) ? r : id;
+	}
+
+TInt RSVPHostFsDriver::GetDriveMap(TUint32 * aMap)
+	{
+	DP(_L("** (rsvphostfsdriver.cpp) RSVPHostFsDriver::GetDeviceID()"));
+
+	return DoSVPRequest(EGetDriveMap, (TAny *)aMap);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphost.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,691 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: f32test\fsstress\t_remote.cpp
+*
+*/
+
+#if !defined(__F32FILE_H__)
+#include <f32file.h>
+#endif
+#if !defined(__E32TEST_H__)
+#include <e32test.h>
+#endif
+#if !defined(__T_STD_H__)
+#include "t_std.h"
+#endif
+#if !defined(__T_REMFSY_H__)
+#include "t_remfsy.h"
+#endif
+
+GLDEF_D RTest test(_L("T_REMOTE - DEFAULT DRIVE"));
+GLDEF_D RTest testx(_L("X Drive (WINS) <-> D Drive (MARM)"));
+GLDEF_D RTest testy(_L("Y Drive (WINS) <-> C Drive (MARM)"));
+GLDEF_D RTest testq(_L("REMOTE Q Drive"));
+
+LOCAL_D TFileName gBatchFile;
+LOCAL_D TBool gRunByBatch=EFalse;
+
+GLDEF_D TFileName gExeFileName(RProcess().FileName());
+
+/*
+INFORMATION - What this test is all about
+
+T_REMOTE tests the asynchronous remote file system implementation, introduced in
+F32 release 110 and refined in release 112.  The test sets up and mounts four drives,
+the default drive (usually C on WINS and MARM), a remote drive (Q) and two others, on
+MARM these are C and D, on WINS these are X and Y.  The remote filesystem is the only
+system treated asynchronously by F32.  
+
+The test sets up a thread for each drive and runs a number of tests on each drive.
+In the remote filesystem case, a dummy filesystem has been implemented, this is built
+as T_REMFSY.fsy.  The tests are designed to stress a number of fileserver API
+functions.  The test MultipleSessions() is adapted from another F32 test T_SESSION.
+It sets up an array of fileserver connections and then uses each connection to run
+a number of tests - alternating between connections to stress F32 as it does so.  The
+test should therefore be testing multiple fileserver connections on multiple drives -
+the remote filesystem running concurrently with the other drives.  There should be
+no failure or confusion between fileserver sessions.  Each drive has a separate test
+console which should complete successfully.
+
+NOTE: TO RUN THIS CARD SUCCESSFULLY ON MARM A CF CARD IS REQUIRED
+
+*/
+
+LOCAL_C void Test0(RTest& aTest)
+//
+//	Scan for open files - no sessions
+//	
+	{
+	aTest.Next(_L("Scan for open files with no sessions open"));
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+	if (list==NULL)
+		return;
+	TInt count=list->Count();
+	if (count==1)
+		{
+		gRunByBatch=ETrue;
+		gBatchFile=(*list)[0].iName;
+		delete list;
+		fileScan.NextL(list);
+		if (list==NULL)
+			return;
+		count=list->Count();
+		}
+	while (count--)
+		{
+		TEntry entry=(*list)[count];
+		aTest.Printf(_L("%d) EntryName = %S\n"),count,&entry.iName);
+		}
+	//aTest.Printf(_L("Test will fail unless files are closed.\n"));
+	//aTest.Printf(_L("Press any key ...\n"));
+	//aTest.Getch();
+	}
+
+
+LOCAL_C void Test1()	
+//
+//	This test is only called by default drive
+//	Test OpenFileScan			
+//
+	{
+	test.Next(_L("Scan for open files - one session only"));
+
+	RFile file1,file2,file3;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	TInt r=file1.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(TheFs,fn,EFileRead);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+
+	if (gRunByBatch)
+		{
+		test(list!=NULL);
+		test(list->Count()==1);
+		TEntry entry=(*list)[0];
+		test(entry.iName.FindF(_L(".BAT"))>=0);
+		delete list;
+		fileScan.NextL(list);
+		}
+
+	test(list!=NULL);
+	TInt count=list->Count();
+	test(count==3);
+	TEntry entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	TThreadId threadId=fileScan.ThreadId();
+	RThread current;
+	TThreadId currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list==NULL);
+
+	file1.Close();
+	file2.Close();
+	file3.Close();
+	}
+
+LOCAL_C void Test2()
+//
+// Test openfilescan - empty, full, empty.
+//
+	{
+	test.Next(_L("Scan for open files - empty sessions"));
+
+	RFs fs1,fs2,fs3,fs4;
+	TInt r=fs1.Connect();
+	test(r==KErrNone);
+	r=fs2.Connect();
+	test(r==KErrNone);
+	r=fs3.Connect();
+	test(r==KErrNone);
+	r=fs4.Connect();
+	test(r==KErrNone);
+
+	RFile file1,file2,file3;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file1.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(fs2,fn,EFileRead);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+
+	if (gRunByBatch)
+		{
+		test(list!=NULL);
+		test(list->Count()==1);
+		TEntry entry=(*list)[0];
+		test(entry.iName.FindF(_L(".BAT"))>=0);
+		delete list;
+		fileScan.NextL(list);
+		}
+
+	test(list!=NULL);
+	TInt count=list->Count();
+	test(count==3);
+	TEntry entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	TThreadId threadId=fileScan.ThreadId();
+	RThread current;
+	TThreadId currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list==NULL);
+
+	file1.Close();
+	file2.Close();
+	file3.Close();
+	fs1.Close();
+	fs2.Close();
+	fs3.Close();
+	fs4.Close();
+	}
+
+LOCAL_C void Test3()
+//
+// Test openfilescan - empty, full, empty full
+//
+	{
+	test.Next(_L("Scan for open files - multiple sessions"));
+
+	RFs fs1,fs2,fs3,fs4;
+	TInt r=fs1.Connect();
+	test(r==KErrNone);
+	r=fs2.Connect();
+	test(r==KErrNone);
+	r=fs3.Connect();
+	test(r==KErrNone);
+	r=fs4.Connect();
+	test(r==KErrNone);
+
+	RFile file1,file2,file3;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file1.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	r=file1.Open(fs4,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(fs4,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(fs4,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+
+	if (gRunByBatch)
+		{
+		test(list!=NULL);
+		test(list->Count()==1);
+		TEntry entry=(*list)[0];
+		test(entry.iName.FindF(_L(".BAT"))>=0);
+		delete list;
+		fileScan.NextL(list);
+		}
+
+	test(list!=NULL);
+	TInt count=list->Count();
+	test(count==3);
+	TEntry entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	TThreadId threadId=fileScan.ThreadId();
+	RThread current;
+	TThreadId currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list!=NULL);
+	count=list->Count();
+	test(count==3);
+	entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	threadId=fileScan.ThreadId();
+	currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list==NULL);
+
+	file1.Close();
+	file2.Close();
+	file3.Close();
+	fs1.Close();
+	fs2.Close();
+	fs3.Close();
+	fs4.Close();
+	}
+
+LOCAL_C void Test4()
+//
+// Test openfilescan - rdirs, empty, full, empty rdirs.
+//
+	{
+	test.Next(_L("Scan for open files - check RDir sessions are ignored"));
+
+	RFs fs1,fs2,fs3,fs4;
+	TFileName fn;
+	TInt r=fs1.Connect();
+	test(r==KErrNone);
+	r=fs2.Connect();
+	test(r==KErrNone);
+	r=fs3.Connect();
+	test(r==KErrNone);
+	r=fs4.Connect();
+	test(r==KErrNone);
+
+	RDir dir1,dir2,dir3,dir4;
+	fn = _L("Z:\\TEST\\*.XDE");
+	fn[0] = gExeFileName[0];
+	r=dir1.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir2.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir3.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir4.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+
+	RFile file1,file2,file3;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file1.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(fs2,fn,EFileRead);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(fs2,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	RDir dir5,dir6,dir7,dir8;
+	fn = _L("Z:\\TEST\\*.XDE");
+	fn[0] = gExeFileName[0];
+	r=dir5.Open(fs4,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir6.Open(fs4,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir7.Open(fs4,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir8.Open(fs4,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+
+	if (gRunByBatch)
+		{
+		test(list!=NULL);
+		test(list->Count()==1);
+		TEntry entry=(*list)[0];
+		test(entry.iName.FindF(_L(".BAT"))>=0);
+		delete list;
+		fileScan.NextL(list);
+		}
+
+	test(list!=NULL);
+	TInt count=list->Count();
+	test(count==3);
+	TEntry entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	TThreadId threadId=fileScan.ThreadId();
+	RThread current;
+	TThreadId currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list==NULL);
+
+	file1.Close();
+	file2.Close();
+	file3.Close();
+	dir1.Close();	dir2.Close();
+	dir3.Close();	dir4.Close();
+	dir5.Close();	dir6.Close();
+	dir7.Close();	dir8.Close();
+	fs1.Close();	fs2.Close();
+	fs3.Close();	fs4.Close();
+	}
+
+LOCAL_C void Test5()
+//
+// Test OpenFileScan
+//
+	{
+
+	test.Next(_L("Scan for open files - mixed RDirs and RFiles"));
+
+	RFile file1,file2,file3;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	TInt r=file1.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FILE.CPP");
+	fn[0] = gExeFileName[0];
+	r=file2.Open(TheFs,fn,EFileRead);
+	test(r==KErrNone);
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	r=file3.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	test(r==KErrNone);
+	
+	RDir dir1,dir2,dir3,dir4;
+	fn = _L("Z:\\TEST\\*.XDE");
+	fn[0] = gExeFileName[0];
+	r=dir1.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir2.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir3.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+	r=dir4.Open(TheFs,fn,KEntryAttMaskSupported);
+	test(r==KErrNone);
+
+	CFileList* list;
+	TOpenFileScan fileScan(TheFs);
+	fileScan.NextL(list);
+
+	if (gRunByBatch)
+		{
+		test(list!=NULL);
+		test(list->Count()==1);
+		TEntry entry=(*list)[0];
+		test(entry.iName.FindF(_L(".BAT"))>=0);
+		delete list;
+		fileScan.NextL(list);
+		}
+
+	test(list!=NULL);
+	TInt count=list->Count();
+	test(count==3);
+	TEntry entry=(*list)[0];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	entry=(*list)[1];
+	test(entry.iName.FindF(_L("T_FILE.CPP"))>=0);
+	entry=(*list)[2];
+	test(entry.iName.FindF(_L("T_FSRV.CPP"))>=0);
+	TThreadId threadId=fileScan.ThreadId();
+	RThread current;
+	TThreadId currentId=current.Id();
+	test(threadId==currentId);
+	delete list;
+
+	fileScan.NextL(list);
+	test(list==NULL);
+
+	file1.Close();
+	file2.Close();
+	file3.Close();
+	dir1.Close();
+	dir2.Close();
+	dir3.Close();
+	dir4.Close();
+	}
+
+
+
+LOCAL_C void MultipleSessions(TInt aDrive, RTest& aTest)
+//
+//	Create an array of fileserver sessions
+//	Create an array of TMultipleSessionTest objects 
+//
+	
+	{
+#if defined(UNICODE)
+	const TInt maxNumberSessions=10;	
+#else
+	const TInt maxNumberSessions=20;
+#endif
+
+	RFs session[maxNumberSessions];
+	TMultipleSessionTest testObject[maxNumberSessions];
+	TInt i=0;
+	TInt r;
+
+	for (; i<maxNumberSessions; i++)
+		{
+		r=session[i].Connect();
+		test(r==KErrNone);
+		testObject[i].Initialise(session[i]);
+		testObject[i].SetSessionPath(aDrive);
+		testObject[i].RunTests(aTest);		//	Run the set of tests for each session
+		}									//	Leave each session open
+											
+
+	for (i=0; i<(maxNumberSessions-1); i++)
+		{
+	//	Alternate tests between open sessions
+		testObject[i].testSetVolume(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i].testSubst(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i].testInitialisation(aTest);
+		testObject[i].testDriveList(aTest);
+		testObject[i].MakeAndDeleteFiles(aTest);
+	//	Close session[i] and check that session[i+1] is OK	
+		session[i].Close();	
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i+1].testSetVolume(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i+1].testSubst(aTest);
+		testObject[i+1].testDriveList(aTest);
+	//	Reconnect session[i]	
+		r=session[i].Connect();
+		test(r==KErrNone);
+		testObject[i].Initialise(session[i]);
+		testObject[i].SetSessionPath(aDrive);
+		testObject[i].testSetVolume(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i].testSubst(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i].testInitialisation(aTest);
+		testObject[i].testDriveList(aTest);
+	//	Close session[i+1] and check that session[i] is OK
+		session[i+1].Close();	
+		testObject[i].testInitialisation(aTest);
+		testObject[i].testSetVolume(aTest);
+		testObject[i].testInitialisation(aTest);
+		testObject[i].testSubst(aTest);
+		testObject[i].testDriveList(aTest);
+	//	Reconnect session[i+1]	
+		r=session[i+1].Connect();
+		test(r==KErrNone);
+		testObject[i+1].Initialise(session[i+1]);
+		testObject[i+1].SetSessionPath(aDrive);
+		testObject[i].testSetVolume(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i].testSubst(aTest);
+		testObject[i+1].testInitialisation(aTest);
+	//	Close session[i] and check that session[i+1] is OK	
+		session[i].Close();	
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i+1].testSetVolume(aTest);
+		testObject[i+1].testInitialisation(aTest);
+		testObject[i+1].testSubst(aTest);
+		testObject[i+1].testDriveList(aTest);
+		
+		if (i==maxNumberSessions-1)	//	Tidy up by closing remaining open session
+			{
+			session[i+1].Close();	
+			}
+		}
+	}
+
+GLDEF_C void CallTestsDefaultL(TInt aDrive)
+//
+// Call tests that may leave
+//
+	{
+	Test0(test);
+	Test1();		
+	Test2();
+	Test3();
+	Test4();
+	Test5();
+	MultipleSessions(aDrive,test);
+	}
+
+GLDEF_C void CallTestsXL(TInt aDrive)
+//
+// Call tests for drive X
+//
+	{
+	Test0(testx);
+
+	RFile file1;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	TInt r=file1.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	testx(r==KErrNone);
+	file1.Close();
+	MultipleSessions(aDrive,testx);
+	}
+
+GLDEF_C void CallTestsYL(TInt aDrive)
+//
+// Call tests for drive Y
+//
+	{
+	Test0(testy);
+
+	RFile file1;
+	TFileName fn;
+	fn = _L("Z:\\TEST\\T_FSRV.CPP");
+	fn[0] = gExeFileName[0];
+	TInt r=file1.Open(TheFs,fn,EFileRead|EFileShareReadersOnly);
+	testy(r==KErrNone);
+	file1.Close();
+	MultipleSessions(aDrive,testy);
+	}
+
+GLDEF_C void CallTestsQL(TInt aDrive)
+//
+// Call tests for remote drive
+//
+	{
+
+	Test0(testq);
+	
+	testq.Printf(_L("This may take some time.  Please be patient...\n"));
+	
+	testq.Next(_L("Test remote drive with multiple sessions"));
+	MultipleSessions(aDrive,testq);
+
+	const TInt numberOfTests=10;
+	
+	TPtrC record[numberOfTests];
+	
+	TInt i=0;
+	for (;i<numberOfTests;i++)
+		{
+		if (i%2)
+			record[i].Set(_L("Hubble_Bubble"));
+		else
+			record[i].Set(_L("Toil_and_Trouble"));
+		}
+	
+	testq.Next(_L("Create a file 'TEXTFILE.TXT' on the remote drive"));
+	RFile f;
+	TInt r=f.Replace(TheFs,_L("TEXTFILE.TXT"),0);
+	testq(r==KErrNone);
+	TFileText textFile;
+	textFile.Set(f);
+	
+	testq.Next(_L("Write to 'TEXTFILE.TXT'"));
+	
+	for (i=0;i<numberOfTests;i++)
+		{
+		r=textFile.Write(record[i]);
+		testq(r==KErrNone);
+		testq.Printf(_L("Write %d completed OK\n"),i+1);
+		}
+	
+	f.Close();
+
+	RFile file1;
+	r=file1.Open(TheFs,_L("Q:\\TEST\\T_FSRV.CPP"),EFileRead|EFileShareReadersOnly);
+	testq(r==KErrNone);
+	file1.Close();	
+
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostdir.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,175 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32uid.h>
+
+#include "svphostfsy.h"
+
+//////////////////////////////////////////////////////////////////////////
+//	CSVPHostDirCB							//
+//////////////////////////////////////////////////////////////////////////	
+
+CSVPHostDirCB::CSVPHostDirCB(/*CSessionFs* aSession*/)
+//
+// Constructor
+//
+        : CDirCB(/*aSession*/),iEntry()
+	{
+	__DECLARE_NAME(_S("CSVPHostDirCB"));
+	}
+
+CSVPHostDirCB::~CSVPHostDirCB()
+//
+// Destructor
+//
+	{
+	DP(_L("** (SVPHOSTDIR) CSVPHostDirCB::~CSVPHostDirCB"));
+
+	if ((TInt)iHandle == KErrBadHandle) return;
+
+	SVP_HOST_FS_DEVICE().DirClose(Drive().DriveNumber(), iHandle);
+	}
+
+TBool CSVPHostDirCB::MatchUid()
+//
+// Match the uid ?
+//
+	{
+	if (iUidType[0]!=TUid::Null() || iUidType[1]!=TUid::Null() || iUidType[2]!=TUid::Null())
+		return(ETrue);
+	return(EFalse);
+	}
+
+void fileTimeToTime(TUint32 t,TTime& aTime, TFileTimeType aType)
+//
+//	Convert a time (in seconds from the epoc) into a TTIME
+//
+	{
+	TInt64 at =((TInt64)t) * 1000000;
+	TTime time = TTime(at);
+	if (aType == EWindows) 
+		{
+		time += TTimeIntervalYears(1970);
+		time += TTimeIntervalDays(1);
+		}
+	aTime=time;
+	}
+
+LOCAL_C TBool CompareUid(const TUidType& aUidTrg, const TUidType& aUidSuitor)
+//
+// Compare the suitor to the target pattern
+//
+	{
+	
+	if (aUidTrg[0]!=TUid::Null() && aUidTrg[0]!=aUidSuitor[0])
+		return(EFalse);
+	if (aUidTrg[1]!=TUid::Null() && aUidTrg[1]!=aUidSuitor[1])
+		return(EFalse);
+	if (aUidTrg[2]!=TUid::Null() && aUidTrg[2]!=aUidSuitor[2])
+		return(EFalse);
+	return(ETrue);
+	}
+
+
+void CSVPHostDirCB::ReadL(TEntry& anEntry)
+//
+//	Read the next entry from the directory
+//
+	{
+	DP(_L("** (SVPHOSTDIR) CSVPHostDirCB::ReadL"));
+
+	TUint driveNumber = Drive().DriveNumber() ; 
+	FOREVER
+		{
+		if (!iPending)
+			{
+			TSVPHostFsDirReadInfo info(driveNumber, iHandle);
+			User::LeaveIfError(SVP_HOST_FS_DEVICE().DirRead(info));
+
+			TPtr name((TUint16 *)&info.iName[0], info.iLength, KMaxPath);
+
+			if (name==_L(".") || name==_L(".."))
+			  continue;
+
+			iEntry.iName = name;
+			iEntry.iAtt=info.iAtt&KEntryAttMaskSupported;
+			iEntry.iSize=info.iSize;
+			fileTimeToTime(info.iModified,iEntry.iModified, info.iTimeType);
+			DP(_L("%S %d %x %x"), &name, iEntry.iAtt, iEntry.iSize, iEntry.iModified);
+			}
+		iPending=EFalse;
+		anEntry=iEntry;
+		if ((iFullName.NameAndExt()==_L("*.*") || anEntry.iName.MatchF(iFullName.NameAndExt())!=KErrNotFound) 
+		    && Mount().MatchEntryAtt(anEntry.iAtt&KEntryAttMaskSupported,iAtt))
+			{
+			if (MatchUid())
+				{
+				TParse fileName;
+				TBuf<KMaxFileName> path=iFullName.Path();
+				fileName.Set(anEntry.iName,&path,NULL);
+				(*(CSVPHostMountCB*)&Mount()).ReadUidL(fileName.FullName(),anEntry);
+				if (CompareUid(iUidType,anEntry.iType))
+					break;
+				}
+			else
+				break;
+			}
+		break;
+		}
+
+	if ((iAtt&KEntryAttAllowUid)==0 || anEntry.iAtt&KEntryAttDir || MatchUid())
+		return;
+	TParse fileName;
+	TBuf<KMaxFileName> path=iFullName.Path();
+	fileName.Set(anEntry.iName,&path,NULL);
+	(*(CSVPHostMountCB*)&Mount()).ReadUidL(fileName.FullName(),anEntry);
+
+	return;
+	}
+
+
+//////////////////////////////////////////////////////////////////////////
+// CSVPHostFormatCB							//
+//////////////////////////////////////////////////////////////////////////	
+
+CSVPHostFormatCB::CSVPHostFormatCB(/*CSessionFs* aSession*/)//???JCS
+//
+// Constructor
+//
+	: CFormatCB(/*aSession*/)
+	{
+	__DECLARE_NAME(_S("CSVPHostFormatCB"));
+	}
+
+CSVPHostFormatCB::~CSVPHostFormatCB()
+//
+// Destructor
+//
+	{}
+
+void CSVPHostFormatCB::DoFormatStepL()
+//
+// Do Formatting
+//
+	{
+	iCurrentStep=0;
+	User::Leave(KErrNotSupported);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfil.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,213 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32uid.h>
+
+#include "svphostfsy.h"
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//	CSVPHostFileCB							//
+//////////////////////////////////////////////////////////////////////////	
+
+CSVPHostFileCB::CSVPHostFileCB()
+//
+// Constructor
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::CSVPHostFileCB()"));
+
+	__DECLARE_NAME(_S("CSVPHostFileCB"));
+	}
+
+CSVPHostFileCB::~CSVPHostFileCB()
+//
+// Destructor
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::~CSVPHostFileCB()"));
+	if ((TInt)iHandle == KErrBadHandle) return;
+	
+	SVP_HOST_FS_DEVICE().FileClose(Drive().DriveNumber(), iHandle);
+	}
+
+TBool CSVPHostFileCB::IsRomDrive() const
+//
+// Returns ETrue if the drive number == EDriveZ
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::IsRomDrive()"));
+	return(EFalse);
+	}
+
+
+void CSVPHostFileCB::CheckPos(TInt /*aPos*/)
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::CheckPos()"));
+	}
+
+void CSVPHostFileCB::ReadL(TInt aPos,TInt& aLength ,const TAny* aDes , const RMessagePtr2& aMessage)
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::ReadL(%d,%d)"), aPos, aLength);
+
+	TInt n = 0;
+	TInt pos=aPos;
+	TInt len=aLength;
+	TBuf8<0x400> buf;
+
+	if (aMessage.Handle() == KLocalMessageHandle)
+		((TPtr8* )aDes)->SetLength(0);
+
+	TUint driveNumber = Drive().DriveNumber() ; 
+	while (len)
+		{
+		TInt s=Min(len,buf.MaxLength());
+		TSVPHostFsFileReadInfo info(driveNumber, iHandle,s,pos+n,(char*)buf.Ptr());
+
+		DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::ReadL pos %d s %d p 0x%08x"), pos+n, s, buf.Ptr());
+
+		User::LeaveIfError(SVP_HOST_FS_DEVICE().FileRead(info));
+
+		DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::ReadL read %d bytes"), info.iLength);
+
+		buf.SetLength(info.iLength);
+
+		DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::ReadL set buf length"));
+
+		if (aMessage.Handle() == KLocalMessageHandle)
+		        ((TPtr8* )aDes)->Append(buf);
+		else
+		        aMessage.WriteL(0,buf,n);
+		
+		n+=info.iLength;
+
+		if (((TInt)info.iLength)<s)
+		        break;
+		len-=info.iLength;
+		}
+	aLength=n;
+	iCurrentPos=n+aPos;
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::ReadL aLength %d iCurrentPos %d"), aLength, iCurrentPos);
+	}
+
+
+
+void CSVPHostFileCB::WriteL(TInt aPos, TInt& aLength, const TAny* aDes, const RMessagePtr2& aMessage)
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::WriteL(%d,%d)"), aPos, aLength);
+
+	TInt n=0;
+	TInt pos=aPos;
+	TInt len=aLength;
+	TBuf8<0x400> buf;
+	TUint driveNumber = Drive().DriveNumber() ; 
+	while (len)
+		{
+		TInt s=Min(len,buf.MaxLength());
+
+		if (aMessage.Handle() == KLocalMessageHandle)
+			buf.Copy( ((TPtr8* )aDes)->MidTPtr(n, s) );
+		else
+			aMessage.ReadL(0,buf,n);
+
+		TSVPHostFsFileWriteInfo info(driveNumber, iHandle,s,pos+n,(char*)buf.Ptr());
+
+		DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::WriteL pos %d s %d p 0x%08x"), pos+n, s, buf.Ptr());
+
+		User::LeaveIfError(SVP_HOST_FS_DEVICE().FileWrite(info));
+
+		DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::WriteL wrote %d bytes"), info.iLength);
+
+		if (((TInt)info.iLength)<s) 
+		  {
+		    DP(_L("** (SVPHOSTFIL) !!! CSVPHostFileCB::WriteL failed to write s %d bytes"), s);
+			User::Leave(KErrCorrupt);
+		  }
+
+		len-=info.iLength;
+		n+=info.iLength;
+		}
+	aLength=n;
+	iCurrentPos=n+aPos;
+	}
+
+TInt CSVPHostFileCB::Address(TInt& /*aPos*/) const
+//
+//	If ROM file, do a memory map and return the address
+//	Dummy implementation
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::Address()"));
+	return(KErrNone);
+	}
+
+void CSVPHostFileCB::SetSizeL(TInt aSize)
+//
+//	Set the file size
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::SetSizeL()"));
+	
+	TSVPHostFsFileSetSizeInfo info(Drive().DriveNumber(), iHandle,aSize);
+
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().FileSetSize(info));
+
+	}
+
+
+void CSVPHostFileCB::SetEntryL(const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask)
+// TODO: Not tested
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::SetEntryL()"));
+	//User::Leave(KErrNotSupported);
+	}
+
+void CSVPHostFileCB::FlushAllL()
+//
+// Commit any buffered date to the media.
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::FlushAll()"));
+
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().FlushAll(Drive().DriveNumber()));
+	}
+
+
+void CSVPHostFileCB::FlushDataL()
+//
+//	Commit any buffered date to the media
+//	Dummy implementation of a pure virtual function
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::FlushDataL()"));
+	  
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().FlushData(Drive().DriveNumber()));
+	}
+
+void CSVPHostFileCB::RenameL(const TDesC& /*aNewName*/)
+//
+//	Rename the file while open
+//	Dummy implementation of a pure virtual function
+//
+	{
+	DP(_L("** (SVPHOSTFIL) CSVPHostFileCB::RenameL()"));
+
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsstart.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <e32std.h>
+#include <f32fsys.h>
+
+_LIT(KEStartPanicCatagory, "SVP_HOSTFS_SYSSTART");
+
+enum TEStartPanic
+    {
+    ELitNoDM = 1,                           // No Domain Manager
+    ELitDMInitFail,                         // Domain Manager init fail
+    ELitHALFail,                            // HAL init fail
+    ELitConnectFsFail1,                     // Connect fs 1 fail
+    ELitInitLocalPwStoreFail,               // Init PwStore fail
+    ELitLocaleInitialisationFail,           // Initialisation of locale properties failed
+    ELitFSInitDriveInfoFail,                // FS Init DriveInfo fail
+    ELitCreateTrapHandlerFail,              // Create trap handler fail
+    ELitLoadSysLddsFail,                    // Load sys ldds fail
+    ELitLocalDriveMappingFail,              // Local drive mapping fail
+    ELitDriveMappingFileFail,               // Drive mapping file not found
+    ELitSwapMappingFailArrayInconsistent,   // Swap mappings fail - array inconsistent
+    ELitFsSwapMappingFail,                  // Swap mappings fail - Fs request failed
+    EPropertyError,                         // RProperty return error
+    ECompMountFsFail,                       // Failed comp fs mount
+    EFsNameFail,                            // File system name on Z: failed
+    ELitNoWS,                               // No WSERV
+    EStartupModeFail,                       // Get startup mode failed
+    ESysAgentFail,                          // Fail to launch system agent
+    ESetSystemDriveFail                     // Fail to set System Drive
+    };
+
+inline void Panic(TEStartPanic aPanic, TInt aReason)
+    {
+    TBuf<10> panic(KEStartPanicCatagory);
+    panic.AppendFormat(_L("_%d"), aPanic);
+    User::Panic(panic, aReason);
+    }
+
+_LIT(KServerPathSysBin, "0:\\Sys\\Bin\\");
+_LIT(KWindowServerRootName1,"EWSRV.EXE");	
+_LIT(KHostFSMounter, "z:\\sys\\bin\\SVPHOSTFS.EXE");
+
+TBool CreateServer(const TDriveList& aDrives, const TDesC& aRootName)
+	{
+	RProcess ws;
+	TInt r=ws.Create(aRootName, KNullDesC);
+	if (r!=KErrNone)
+		{
+		TFileName name;
+		name = KServerPathSysBin();
+		name+=aRootName;
+		TInt i=EDriveZ;
+		FOREVER
+			{
+			i= (i==0) ? EDriveZ : i-1;
+			if (aDrives[i]!=KDriveAbsent) // Got a valid drive
+				{
+				name[0]=(TUint32)('A'+i); // Set the drive letter
+				r=ws.Create(name,KNullDesC);
+				if (r==KErrNone)
+					break;
+				}
+			if (i==EDriveZ)
+				return EFalse;
+			}
+		}
+	ws.Resume();
+	ws.Close();
+	return ETrue;
+	}
+
+GLDEF_C TInt E32Main()
+        {
+	RProcess ws;
+	TInt r=ws.Create(KHostFSMounter, KNullDesC);
+	if (r == KErrNone)
+	        {
+		TRequestStatus stat;
+		ws.Rendezvous(stat);
+		ws.Resume();
+		User::WaitForRequest(stat);		// wait for start or death
+		ws.Close();
+		}
+	// Start the window server 
+	RFs aFs;
+	r = aFs.Connect();
+
+	if (r != KErrNone)
+	        Panic(ELitConnectFsFail1, r);
+	TDriveList list;
+	aFs.DriveList(list);
+	aFs.Close();
+
+	if (!CreateServer(list,KWindowServerRootName1))
+	        Panic(ELitNoWS,KErrNotFound);
+
+	return(KErrNone);
+	}	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsy.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,158 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32uid.h>
+
+#include "svphostfsy.h"
+
+//////////////////////////////////////////////////////////////////////////
+// CSVPHostFileSystem	                                                //
+//////////////////////////////////////////////////////////////////////////	
+
+CSVPHostFileSystem::CSVPHostFileSystem()
+//
+// Constructor
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::CSVPHostFileSystem()"));
+	__DECLARE_NAME(_S("CSVPHostFileSystem"));
+	}
+
+CSVPHostFileSystem::~CSVPHostFileSystem()
+//
+// Destructor
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::~CSVPHostFileSystem"));
+	iDevice.Close();
+	}
+
+
+
+TInt CSVPHostFileSystem::Install()
+//
+// Install the file system.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::Install()"));
+
+	// Open the device
+	RSVPHostFsDriver device;
+	TInt err = device.Open();
+
+	if (KErrNone != err)
+		return err;
+
+	iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KF32BuildVersionNumber);
+	TPtrC name=_L("SVPHOSTFSY");
+	
+	return(SetName(&name));
+	}
+
+CMountCB* CSVPHostFileSystem::NewMountL(/*CSessionFs* aSession*/) const
+//
+// Create a new mount control block.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::NewMountL()"));
+	return(new(ELeave) CSVPHostMountCB);
+	}
+
+CFileCB* CSVPHostFileSystem::NewFileL(/*CSessionFs* aSession*/) const
+//
+// Create a new file.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::NewFileL()"));
+	return(new(ELeave) CSVPHostFileCB);
+	}
+
+CDirCB* CSVPHostFileSystem::NewDirL(/*CSessionFs* aSession*/) const
+//
+// Create a new directory lister.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::NewDirL()"));
+	return(new(ELeave) CSVPHostDirCB(/*aSession*/));
+	}
+
+CFormatCB* CSVPHostFileSystem::NewFormatL(/*CSessionFs* aSession*/) const
+//
+// Create a new media formatter.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::NewFormatL()"));
+	return(new(ELeave) CSVPHostFormatCB(/*aSession*/));
+	}
+
+TInt CSVPHostFileSystem::DefaultPath(TDes& aPath) const
+//
+// Return the initial default path.
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::DefaultPath()"));
+	aPath=_L("\\");
+	return(KErrNone);
+	}
+
+
+CFileSystem* CSVPHostFileSystem::NewL()
+//
+//	Factory for CSVPHostFileSystem
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::NewL()"));
+	CSVPHostFileSystem* svpHostFsy=new(ELeave) CSVPHostFileSystem();
+	return svpHostFsy;
+	}
+
+
+void CSVPHostFileSystem::DriveInfo(TDriveInfo& anInfo,TInt aDriveNumber) const
+//
+// Return the drive info iDriveAtt  && iBatteryState already set
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CSVPHostFileSystem::DriveInfo()"));
+
+	/* !@! TODO: are these the best values? */
+	anInfo.iMediaAtt=KMediaAttVariableSize;
+	anInfo.iType=EMediaRam;
+#if 0
+	// !@! can't execute from remote drives
+	anInfo.iDriveAtt=KDriveAttRemote;
+#endif
+	anInfo.iDriveAtt=KDriveAttLocal|KDriveAttInternal;
+	}
+
+
+extern "C" {
+
+EXPORT_C CFileSystem* CreateFileSystem()
+//
+// Create a new file system
+//
+	{
+	DP(_L("** (SVPHOSTFSY) CreateFileSystem()"));
+
+	return(CSVPHostFileSystem::NewL());
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostfsy.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,202 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Based on the test code under f32test\fsstress
+*
+*/
+
+#if !defined(__SVPHOSTFSY_H__)
+#define __SVPHOSTFSY_H__
+
+#include <f32fsys.h>
+#include <f32file.h>
+#include <e32test.h>
+#include <e32hal.h>
+#include <e32math.h>
+#include <f32dbg.h>
+
+#include <rsvphostfsdriver.h>
+
+//
+// Common constants used by both EFSRV and the filesystems
+//
+
+const TUint KEntryAttIllegal=(KEntryAttVolume|KEntryAttDir);
+const TUint KEntryAttModified=0x20000000;
+const TUint KEntryAttMustBeFile=0x80000000;
+const TInt KCurrentPosition=KMinTInt;
+
+
+GLDEF_D const TInt KMaxParses=7;
+GLDEF_D const TInt KHeapSize=0x2000;
+GLREF_C void TurnAllocFailureOff();
+GLREF_C void TurnAllocFailureOn();
+GLREF_C void ReportCheckDiskFailure(TInt aRet);
+GLREF_D RTest test;
+GLREF_D TFileName gSessionPath;
+GLREF_D TInt gAllocFailOff;
+GLREF_D TInt gAllocFailOn;
+
+#if defined(_DEBUG)
+#define SetAllocFailure(a) SetAllocFailure(a)
+#else
+#define SetAllocFailure(a) IsRomAddress(NULL)
+#define KAllocFailureOn 0
+#define KAllocFailureOff 0
+#endif
+
+// Debug virtual host file service - uncomment define below
+//#define SVPDBG
+#ifdef SVPDBG
+IMPORT_C TUint32 DebugRegister();
+#define DP(format...) { if (DebugRegister()&KFSYS) RDebug::Print(format);}
+#else
+#define DP(format...)
+#endif
+
+#define SVP_HOST_FS_DEVICE() (((CSVPHostMountCB&)Mount()).Device())
+#define SVP_HOST_FS_DEVICE_ID 0xc51d0008
+
+enum TPanic
+	{
+	EFileTimeToSystemTime,
+	EFileClose,
+	EFileCloseSetAttributes,
+	EDirClose,
+	EMapCouldNotConnect
+	};
+
+// utility to convert file system times to TTime format
+void fileTimeToTime(TUint32 t,TTime& aTime, TFileTimeType aType);
+
+// utility to produce a canonicalized pathname (i.e. with a drive letter) suitable to pass to the FS device.
+
+void CanonicalizePathname(const TDesC& aName, TInt aDrive, THostFileName& aHostName);
+
+class CSessionFs;
+
+class CSVPHostMountCB : public CMountCB
+	{
+public:
+	CSVPHostMountCB();
+	~CSVPHostMountCB();
+	void MountL(TBool aForceMount);
+	TInt ReMount();
+	void Dismounted();
+	void VolumeL(TVolumeInfo& aVolume) const;
+	void SetVolumeL(TDes& aName);
+	void MkDirL(const TDesC& aName);
+	void RmDirL(const TDesC& aName);
+	void DeleteL(const TDesC& aName);
+	void RenameL(const TDesC& anOldName,const TDesC& anNewName);
+	void ReplaceL(const TDesC& anOldName,const TDesC& anNewName);
+	void EntryL(const TDesC& aName,TEntry& anEntry) const;
+	void SetEntryL(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask);
+	void FileOpenL(const TDesC& aName,TUint aMode,TFileOpen anOpen,CFileCB* aFile);
+	void DirOpenL(const TDesC& aName,CDirCB* aDir);
+	void RawReadL(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt anOffset,const RMessagePtr2& aMessage) const;
+	void RawWriteL(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt anOffset,const RMessagePtr2& aMessage);
+	void ReadUidL(const TDesC& aName,TEntry& anEntry) const;
+	void GetShortNameL(const TDesC& aLongName,TDes& aShortName);
+	void GetLongNameL(const TDesC& aShortName,TDes& aLongName);
+	void IsFileInRom(const TDesC& aFileName,TUint8*& aFileStart);
+	void ReadSectionL(const TDesC& aName,TInt aPos,TAny* aTrg,TInt aLength,const RMessagePtr2& aMessage);
+
+	inline const CSVPHostMountCB& Mount() const { return *this; }
+	inline RSVPHostFsDriver& Device() { return iDevice; }
+	
+
+private:
+	TBool IsRomDrive() const;
+	RSVPHostFsDriver iDevice;
+	};
+
+
+class RConsole;
+class CSVPHostFileCB : public CFileCB
+	{
+public:
+	CSVPHostFileCB();
+	~CSVPHostFileCB();
+	void RenameL(const TDesC& aNewName);
+	void ReadL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
+	void WriteL(TInt aPos,TInt& aLength,const TAny* aDes,const RMessagePtr2& aMessage);
+	TInt Address(TInt& aPos) const;
+	void SetSizeL(TInt aSize);
+	void SetEntryL(const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask);
+	void FlushDataL();
+	void FlushAllL();
+	void CheckPos(TInt aPos);
+	void SetHandle(TUint aHandle) { iHandle = aHandle; }
+	TUint Handle() const { return iHandle; }
+private:
+	TBool IsRomDrive() const;
+private:
+	TInt iCurrentPos;
+	//	TUint8* iFilePtr;
+	TUint iHandle;
+	};
+
+class CSVPHostDirCB : public CDirCB
+	{
+public:
+	CSVPHostDirCB(/*CSessionFs* aSession*/);
+	~CSVPHostDirCB();
+	void ReadL(TEntry& anEntry);
+	inline void SetFullName(const TDesC& aName) {iFullName.Set(aName,NULL,NULL);}
+	inline void SetHandle(TUint32 aHandle) { iHandle = aHandle; }
+
+private:
+	TBool MatchUid();
+public:
+	TEntry iEntry;
+private:
+	TUint32 iHandle;
+	TParse iFullName;
+	};
+
+class CSVPHostFormatCB : public CFormatCB
+	{
+public:
+	CSVPHostFormatCB(/*CSessionFs* aSession*/);
+	~CSVPHostFormatCB();
+public:
+	virtual void DoFormatStepL();
+	};
+
+class CSVPHostFileSystem : public CFileSystem
+	{
+public:
+	CSVPHostFileSystem();
+	~CSVPHostFileSystem();
+	TInt Install();
+	TInt DefaultPath(TDes& aPath) const;
+	void DriveInfo(TDriveInfo& anInfo,TInt aDriveNumber) const;
+private:
+	CMountCB* NewMountL() const;
+	CFileCB* NewFileL() const;
+	CDirCB* NewDirL() const;
+	CFormatCB* NewFormatL() const;
+public:
+	static CFileSystem* NewL();
+
+public:
+	inline RSVPHostFsDriver& Device() { return iDevice; };
+private:
+	RSVPHostFsDriver iDevice;
+	TUint32 iDriveMap[DRIVE_MAP_SIZE];
+	};
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostmain.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <e32test.h>
+#include <e32hal.h>
+#include <f32dbg.h>
+
+#include "svphostfsy.h"
+
+#ifdef DP
+#undef DP
+#define DP(f...)
+#endif
+
+_LIT(KSVPHOSTFSY, "SVPHOSTFSY");
+
+#if 1
+GLDEF_C TInt E32Main()
+    {
+	CTrapCleanup* cleanup;
+	cleanup=CTrapCleanup::New();
+
+	RSVPHostFsDriver driver;
+
+	TInt r = driver.Open();
+
+	if (r != KErrNone)
+	  {
+	    delete cleanup;
+	    return(r);
+	  }
+
+	TUint32 driveMap[DRIVE_MAP_SIZE];
+
+	r = driver.GetDriveMap(driveMap);
+
+	driver.Close();
+	 
+	if (r != KErrNone)
+	  {
+	    delete cleanup;
+	    return(r);
+	  }
+
+	RFs aFs;
+	r=aFs.Connect();
+
+	if (r != KErrNone) goto fail;
+
+	r=aFs.AddFileSystem(KSVPHOSTFSY);
+
+	if (r != KErrNone) goto close;
+
+	for (TInt i = 0; i < DRIVE_MAP_SIZE ; i++ )
+	        {
+	        if (driveMap[i]) 
+		        {
+			char driveLetter = LOWEST_DRIVE + i;
+			TInt driveNumber = driveLetter - 'A';
+			DP(_L(" Drive %c to be mounted\n"), driveLetter);
+			r = aFs.MountFileSystem(KSVPHOSTFSY,driveNumber);
+			DP(_L("aFs.MountFileSystem(KSVPHOSTFSY, %c) -> %d"), driveNumber, r);
+			if (r != KErrNone) goto close;
+			}
+		}
+
+close:
+	aFs.Close();
+
+fail:
+	delete cleanup;
+	return(r);
+    }
+
+#else
+
+GLDEF_C TInt E32Main()
+    {
+	CTrapCleanup* cleanup;
+	cleanup=CTrapCleanup::New();
+
+	RSVPHostFsDriver driver;
+
+	TInt r = driver.Open();
+
+	if (r != KErrNone){
+	  delete cleanup;
+	  return(r);
+	}
+
+	RFs aFs;
+	r=aFs.Connect();
+
+	r=aFs.AddFileSystem(KSVPHOSTFSY);
+	DP(_L("r=aFs.AddFileSystem(KSVPHOSTFSY) -> %d\n"), r);
+
+	// !@!
+	// Until we have 'platform' device driver that we can use hardcode single virtual host drive as 'S'
+	// !@!
+	char driveLetter = 'S';
+	TInt driveNumber = driveLetter - 'A';
+	DP(_L(" Drive %c to be mounted\n"), driveLetter);
+	r = aFs.MountFileSystem(KSVPHOSTFSY,driveNumber);
+	DP(_L("aFs.MountFileSystem(KSVPHOSTFSY, %d) -> %d"), driveNumber, r);
+
+	aFs.Close();
+
+	delete cleanup;
+	return(KErrNone);
+    }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/fs/svphostmnt.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,335 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <f32file.h>
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <e32uid.h>
+
+#include "svphostfsy.h"
+
+#define HOST_SVP_DRIVE_SIZE 1024*1024*1024
+#define HOST_SVP_DRIVE_FREE_SIZE 10*1024*1024
+
+LOCAL_C TInt GetMediaSize(TInt /*aDriveNumber*/,TInt64& aSize,TInt64& aFree)
+//
+// Return the size and free space on a drive.
+//
+	{
+        DP(_L("** (SVPHOSTMNT) GetMediaSize"));
+
+	aSize = HOST_SVP_DRIVE_SIZE;
+	aFree = HOST_SVP_DRIVE_FREE_SIZE;
+	return(KErrNone);
+	}
+
+LOCAL_C TInt GetVolume(TInt /*aDriveNumber*/,TDes& aName,TUint& aUniqueID)
+//
+// Return the volume name and uniqueID.
+//
+	{
+        DP(_L("** (SVPHOSTMNT) GetVolume"));
+
+	aUniqueID=1234;
+	aName=(_L("SVPHOSTDRV"));
+	return(KErrNone);	
+	}
+
+void CanonicalizePathname(const TDesC& aName, TInt aDrive, TDes& n, THostFileName& aHostName)
+        {
+	DP(_L("** (SVPHOSTMNT) CanonicalizePathname (%S)"), &aName);
+	n += TDriveUnit(aDrive).Name();
+	n += aName;
+	TParse parse;
+	parse.Set(n,NULL,NULL);
+	n=parse.FullName();
+	aHostName.Copy(n);
+	DP(_L("-> (%S)"), &aHostName);
+	}
+
+void CanonicalizePathname(const TDesC& aName, TInt aDrive, THostFileName& aHostName)
+        {
+	TUint16 buf[KMaxPath];
+	TPtr n(buf, KMaxPath);
+	CanonicalizePathname(aName, aDrive, n, aHostName);
+	}
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//	CSVPHostMountCB							//
+//////////////////////////////////////////////////////////////////////////	
+
+
+CSVPHostMountCB::CSVPHostMountCB()
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::CSVPHostMountCB()"));
+
+	__DECLARE_NAME(_S("CSVPHostMountCB"));
+	}
+
+CSVPHostMountCB::~CSVPHostMountCB()
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::~CSVPHostMountCB()"));
+	iDevice.Close();
+	}
+
+void CSVPHostMountCB::MountL(TBool /*aForceMount*/)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::MountL()"));
+
+	TInt err = iDevice.Open();
+	User::LeaveIfError(err);
+
+	TFileName driveName;
+	TInt d=Drive().DriveNumber();
+	iSize=HOST_SVP_DRIVE_SIZE;
+	User::LeaveIfError(GetVolume(d,driveName,iUniqueID));
+	HBufC* pN=driveName.AllocL();
+	DP(_L("** (SVPHOSTMNT) ->SetVolumeName()"));
+	SetVolumeName(pN);
+	DP(_L("** (SVPHOSTMNT) <-SetVolumeName()"));
+
+	}
+
+TInt CSVPHostMountCB::ReMount()
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::ReMount()"));
+
+	TFileName n;
+	TInt d=Drive().DriveNumber();
+	TUint uniqueID;
+	TInt r=GetVolume(d,n,uniqueID);
+	if (r!=KErrNone)
+		return(r);
+	if (n==VolumeName() && uniqueID==iUniqueID)
+		return(KErrNone);
+	return(KErrGeneral);
+	}
+
+void CSVPHostMountCB::Dismounted()
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::Dismounted()"));
+	}
+
+void CSVPHostMountCB::VolumeL(TVolumeInfo& aVolume) const
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::VolumeL()"));
+	TInt64 s,f(0);
+	TFileName n;
+	TInt d=Drive().DriveNumber();
+	User::LeaveIfError(GetMediaSize(d,s,f));
+	aVolume.iFree=f;
+	}
+
+void CSVPHostMountCB::SetVolumeL(TDes& /*aName*/)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::SetVolumeL()"));
+	User::Leave(KErrNotSupported);
+	}
+
+void CSVPHostMountCB::IsFileInRom(const TDesC& /*aName*/,TUint8*& /*aFileStart*/)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::IsFileInRom()"));
+	}
+
+void CSVPHostMountCB::MkDirL(const TDesC& aName)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::MkDirL()"));
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsMkDirInfo info(driveNumber, name, 0777);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().MkDir(info));
+	}
+
+void CSVPHostMountCB::RmDirL(const TDesC& aName)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::RmDirL()"));
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsRmDirInfo info(driveNumber, name);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().RmDir(info));
+	}
+
+void CSVPHostMountCB::DeleteL(const TDesC& aName)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::DeleteL()"));
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsDeleteInfo info(driveNumber, name);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().Delete(info));
+	}
+
+void CSVPHostMountCB::RenameL(const TDesC& anOldName,const TDesC& aNewName)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::RenameL()"));
+	// TODO: do we allow renaming across drives?
+	TBuf<KMaxPath> oldName, newName;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(anOldName, driveNumber, oldName);
+	CanonicalizePathname(aNewName, driveNumber, newName);
+	TSVPHostFsRenameInfo info(driveNumber, oldName, newName);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().Rename(info));
+	}
+
+void CSVPHostMountCB::ReplaceL(const TDesC& anOldName,const TDesC& aNewName)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::ReplaceL()"));
+
+	if(FileNamesIdentical(anOldName,aNewName))
+		{
+		return;
+		}
+	TBuf<KMaxPath> oldName, newName;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(anOldName, driveNumber, oldName);
+	CanonicalizePathname(aNewName, driveNumber, newName);
+	TSVPHostFsReplaceInfo info(driveNumber, oldName, newName);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().Replace(info));
+	}
+
+void CSVPHostMountCB::ReadUidL(const TDesC& aName,TEntry& anEntry) const
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::ReadUidL()"));
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsFileOpenInfo fileOpenInfo(driveNumber, name,EFileRead,EFileOpen);
+	TInt err = SVP_HOST_FS_DEVICE().FileOpen(fileOpenInfo);
+
+	User::LeaveIfError(err);
+
+	TBuf8<sizeof(TCheckedUid)> uidBuf;
+	uidBuf.SetLength(sizeof(TCheckedUid));
+
+	TSVPHostFsFileReadInfo fileReadInfo(driveNumber, fileOpenInfo.iHandle,sizeof(TCheckedUid),0,(char*)uidBuf.Ptr());
+
+	if (KErrNone != SVP_HOST_FS_DEVICE().FileRead(fileReadInfo))
+		User::LeaveIfError(SVP_HOST_FS_DEVICE().FileClose(driveNumber, fileOpenInfo.iHandle));
+
+	DP(_L("** (SVPHOSTMNT) CSVPHostFileCB::ReadUidL sizeof(TCheckedUid) %d fileOpenInfo.iLength %d "), sizeof(TCheckedUid), fileReadInfo.iLength);
+
+	if (fileReadInfo.iLength!=sizeof(TCheckedUid))
+	        User::LeaveIfError(SVP_HOST_FS_DEVICE().FileClose(driveNumber, fileOpenInfo.iHandle));
+
+	TCheckedUid uid(uidBuf);
+	anEntry.iType=uid.UidType();
+
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().FileClose(driveNumber, fileOpenInfo.iHandle));
+	}
+
+void CSVPHostMountCB::EntryL(const TDesC& aName,TEntry& anEntry) const
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::EntryL(%S)"), &aName);
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsEntryInfo info(driveNumber, name);
+	User::LeaveIfError(SVP_HOST_FS_DEVICE().Entry(info));
+	anEntry.iAtt=info.iAtt&KEntryAttMaskSupported;
+	anEntry.iSize=info.iSize;
+	fileTimeToTime(info.iModified,anEntry.iModified, info.iTimeType);
+
+	}
+
+void timeToFileTime(TUint32& t,const TTime& aTime, TFileTimeType aType);
+
+void CSVPHostMountCB::SetEntryL(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask)
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::SetEntryL()"));
+
+	//User::Leave(KErrNotSupported);
+	}
+
+void CSVPHostMountCB::FileOpenL(const TDesC& aName,TUint aMode,TFileOpen anOpen,CFileCB* aFile)
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::FileOpenL(%S)"), &aName);
+	CSVPHostFileCB& file=(*((CSVPHostFileCB*)aFile));
+
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsFileOpenInfo info(driveNumber, name,aMode,anOpen);
+	TInt err = SVP_HOST_FS_DEVICE().FileOpen(info);
+
+	User::LeaveIfError(err);
+
+	file.SetHandle(info.iHandle);
+	file.SetSize(info.iSize);
+	file.SetAtt(info.iAtt&KEntryAttMaskSupported);
+	TTime tempTime=file.Modified();
+	fileTimeToTime(info.iModified, tempTime, info.iTimeType);
+	file.SetModified(tempTime);
+	}
+
+void CSVPHostMountCB::DirOpenL(const TDesC& aName ,CDirCB* aDir)
+	{
+	DP(_L("CFatMountCB::DirOpenL, drv:%d, %S"), DriveNumber(), &aName);
+	CSVPHostDirCB& dir=(*((CSVPHostDirCB*)aDir));
+
+	TBuf<KMaxPath> name;
+	TUint driveNumber = Drive().DriveNumber();
+	CanonicalizePathname(aName, driveNumber, name);
+	TSVPHostFsDirOpenInfo info(driveNumber, name);
+	TInt err = SVP_HOST_FS_DEVICE().DirOpen(info);
+
+	User::LeaveIfError(err);
+
+	dir.SetHandle(info.iHandle);
+	TFileName n(TDriveUnit(Drive().DriveNumber()).Name());
+	n.Append(aName);
+	dir.SetFullName(n);
+	}
+
+void CSVPHostMountCB::RawReadL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aTrg*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/) const
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::RawReadL()"));
+	User::Leave(KErrNotSupported);
+	}
+
+void CSVPHostMountCB::RawWriteL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aSrc*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::RawWriteL()"));
+	User::Leave(KErrNotSupported);
+	}
+
+void CSVPHostMountCB::GetShortNameL(const TDesC& aLongName,TDes& aShortName)
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::GetShortNameL(%S)"), &aLongName);
+	aShortName = aLongName;
+	}
+
+void CSVPHostMountCB::GetLongNameL(const TDesC& aShortName,TDes& aLongName)
+	{
+	DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::GetLongNameL(%S)"), &aShortName);
+	aLongName = aShortName;
+	}
+
+void CSVPHostMountCB::ReadSectionL(const TDesC& /*aName*/,TInt /*aPos*/,TAny* /*aTrg*/,TInt /*aLength*/,const RMessagePtr2& /*aMessage*/)
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::RawSectionL()"));
+	User::Leave(KErrNotSupported);
+	}
+
+TBool CSVPHostMountCB::IsRomDrive() const
+	{
+        DP(_L("** (SVPHOSTMNT) CSVPHostMountCB::IsRomDrive()"));
+	return(EFalse);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/inc/rsvphostfsdriver.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,468 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __RSVPHOSTFSDRIVER_H__
+#define __RSVPHOSTFSDRIVER_H__
+
+#include <e32des16.h>
+
+typedef TDes16 THostFileName;
+
+typedef enum 
+	{
+	EUnknown=0,
+	EWindows,
+	EUnix,
+	EMac,
+	} TFileTimeType;
+
+class TSVPHostFsMkDirInfo
+	{
+public:
+	inline TSVPHostFsMkDirInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0),
+		iFlags(0)
+		{};
+	inline TSVPHostFsMkDirInfo(TUint aDrive, const THostFileName & aName, TUint32 aFlags) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length()),
+		iFlags(aFlags)
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	TUint32 iFlags;
+	};
+
+class TSVPHostFsRmDirInfo
+	{
+public:
+	inline TSVPHostFsRmDirInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0)
+		{};
+	inline TSVPHostFsRmDirInfo(TUint aDrive, const THostFileName & aName) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length())
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	};
+
+class TSVPHostFsDeleteInfo
+	{
+public:
+	inline TSVPHostFsDeleteInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0)
+		{};
+	inline TSVPHostFsDeleteInfo(TUint aDrive, const THostFileName & aName) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length())
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	};
+
+class TSVPHostFsRenameInfo
+	{
+public:
+	inline TSVPHostFsRenameInfo() :
+		iDrive(0),
+		iOldName(0),
+		iOldLength(0),
+		iNewName(0),
+		iNewLength(0)
+		{};
+	inline TSVPHostFsRenameInfo(TUint aDrive, const THostFileName & aOldName, const THostFileName & aNewName) :
+		iDrive(aDrive),
+		iOldName(aOldName.Ptr()),
+		iOldLength(aOldName.Length()),
+		iNewName(aNewName.Ptr()),
+		iNewLength(aNewName.Length())
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iOldName;
+	TUint32 iOldLength;
+	const TUint16 * iNewName;
+	TUint32 iNewLength;
+	};
+
+class TSVPHostFsReplaceInfo
+	{
+public:
+	inline TSVPHostFsReplaceInfo() :
+		iDrive(0),
+		iOldName(0),
+		iOldLength(0),
+		iNewName(0),
+		iNewLength(0)
+		{};
+	inline TSVPHostFsReplaceInfo(TUint aDrive, const THostFileName & aOldName, const THostFileName & aNewName) :
+		iDrive(aDrive),
+		iOldName(aOldName.Ptr()),
+		iOldLength(aOldName.Length()),
+		iNewName(aNewName.Ptr()),
+		iNewLength(aNewName.Length())
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iOldName;
+	TUint32 iOldLength;
+	const TUint16 * iNewName;
+	TUint32 iNewLength;
+	};
+
+class TSVPHostFsEntryInfo
+	{
+public:
+	inline TSVPHostFsEntryInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0),
+		iAtt(0),
+		iModified(0),
+		iSize(0),
+		iTimeType(EUnknown)
+		{};
+	inline TSVPHostFsEntryInfo(TUint aDrive, const THostFileName & aName) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length()),
+		iAtt(0),
+		iModified(0),
+		iSize(0),
+		iTimeType(EUnknown)
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	TUint iAtt;
+	TUint32 iModified; // time in seconds since the epoc
+	TInt iSize;
+	TFileTimeType iTimeType;
+	char iHostName[KMaxFileName];
+};
+
+class TSVPHostFsSetEntryInfo
+	{
+public:
+	inline TSVPHostFsSetEntryInfo() :
+		iDrive(0),
+		iName(0),
+		iModified(0),
+		iNewAtt(0),
+		iTimeType(EUnknown)
+		{};
+	inline TSVPHostFsSetEntryInfo(TUint aDrive, const THostFileName & aName, TUint32 aModified, TUint aNewAtt) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iModified(aModified),
+		iNewAtt(aNewAtt),
+		iTimeType(EUnknown)
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 *iName;
+	TUint32 iModified; // time in seconds since the epoc
+	TUint iNewAtt;
+	TFileTimeType iTimeType;
+	};
+
+class TSVPHostFsDirOpenInfo
+	{
+public:
+	inline TSVPHostFsDirOpenInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0),
+		iHandle(0)
+		{};
+inline TSVPHostFsDirOpenInfo(TUint aDrive, const THostFileName & aName) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length()),
+		iHandle(0)
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	TUint32 iHandle;
+	};
+
+#define SVP_HOST_FS_INVALID_FILE_HANDLE -1
+class TSVPHostFsFileOpenInfo
+	{
+public:
+	inline TSVPHostFsFileOpenInfo() :
+		iDrive(0),
+		iName(0),
+		iLength(0), // of file name
+		iMode(0),
+		iOpen(0),
+		iAtt(0),
+		iModified(0), // time in seconds since the epoc
+		iSize(0),     // of file
+		iTimeType(EUnknown),
+		iHandle(SVP_HOST_FS_INVALID_FILE_HANDLE)
+		{};
+	inline TSVPHostFsFileOpenInfo(TUint aDrive, const THostFileName & aName, TUint32 aMode, TUint32 anOpen) :
+		iDrive(aDrive),
+		iName(aName.Ptr()),
+		iLength(aName.Length()),
+		iMode(aMode),
+		iOpen(anOpen),
+		iAtt(0),
+		iModified(0), // time in seconds since the epoc
+		iSize(0),     // of file
+		iTimeType(EUnknown),
+		iHandle(SVP_HOST_FS_INVALID_FILE_HANDLE)
+		{};
+public:
+	TUint iDrive; 
+	const TUint16 * iName;
+	TUint32 iLength;
+	TUint32 iMode;
+	TUint32 iOpen;
+	TUint iAtt;
+	TUint32 iModified; // time in seconds since the epoc
+	TInt iSize;
+	TFileTimeType iTimeType;
+	TInt iHandle;
+	};
+
+class TSVPHostFsFileReadInfo
+	{
+public:
+	inline TSVPHostFsFileReadInfo() :
+		iDrive(0),
+		iHandle(0),
+		iLength(0),
+		iPos(0),
+		iBuf(0)
+		{};
+	inline TSVPHostFsFileReadInfo(TUint aDrive, TUint aHandle,TInt aLength,TInt aPos, char * aBuf):
+		iDrive(aDrive),
+		iHandle(aHandle),
+		iLength(aLength),
+		iPos(aPos),
+		iBuf(aBuf)
+		{};
+public:
+	TUint iDrive; 
+	TUint iHandle;
+	TInt iLength;
+	TInt iPos;
+	char * iBuf;
+	};	
+
+class TSVPHostFsFileWriteInfo
+	{
+public:
+	inline TSVPHostFsFileWriteInfo() :
+		iDrive(0),
+		iHandle(0),
+		iLength(0),
+		iPos(0),
+		iBuf(0)
+		{};
+	inline TSVPHostFsFileWriteInfo(TUint aDrive, TUint aHandle,TInt aLength,TInt aPos, char * aBuf):
+		iDrive(aDrive),
+		iHandle(aHandle),
+		iLength(aLength),
+		iPos(aPos),
+		iBuf(aBuf)
+		{};
+public:
+	TUint iDrive; 
+	TUint iHandle;
+	TInt iLength;
+	TInt iPos;
+	char * iBuf;
+	};
+
+class TSVPHostFsFileSetSizeInfo
+	{
+public:
+	inline TSVPHostFsFileSetSizeInfo() :
+		iDrive(0),
+		iHandle(0),
+		iLength(0)
+		{};
+	inline TSVPHostFsFileSetSizeInfo(TUint aDrive, TUint aHandle, TInt aLength) :
+		iDrive(aDrive),
+		iHandle(aHandle),
+		iLength(aLength)
+		{};
+public:
+	TUint iDrive; 
+	TUint iHandle;
+	TInt iLength;
+	};
+
+class TSVPHostFsDirReadInfo
+{
+public:
+	inline TSVPHostFsDirReadInfo() :
+		iDrive(0),
+		iHandle(0),
+		iLength(0),
+		iAtt(0),
+		iModified(0),
+		iSize(0),
+		iTimeType(EUnknown)
+		{};
+	inline TSVPHostFsDirReadInfo(TUint aDrive, TUint32 aHandle) :
+		iDrive(aDrive),
+		iHandle(aHandle),
+		iLength(-1),
+		iAtt(0),
+		iModified(666),
+		iSize(-1),
+		iTimeType(EUnknown)
+		{};
+public:
+	TUint iDrive; 
+	TUint32 iHandle;
+	TInt iLength;
+	TUint16 iName[KMaxPath];
+	TUint iAtt;
+	TUint32 iModified; // time in seconds since the epoc
+	TInt iSize;
+	TFileTimeType iTimeType;
+	};
+
+class TCapsSVPHostFsDriver
+	{
+public:
+	TVersion	iVersion;
+	};
+
+_LIT(KSVPHostFsDriverName,"SVP Host Filesystem Driver");
+_LIT(KSVPHostFsDriverLDD, "svphostfsdriver.ldd");
+
+// Version information
+const TInt KMajorVersionNumber=0;
+const TInt KMinorVersionNumber=0;
+const TInt KBuildVersionNumber=1;
+
+// keep in sync with the definitions in QEMU/hw/svphostfs.c 
+#define LOWEST_DRIVE 'A'
+#define HIGHEST_DRIVE 'Z'
+#define DRIVE_MAP_SIZE (HIGHEST_DRIVE - LOWEST_DRIVE + 1)
+
+class RSVPHostFsDriver : public RBusLogicalChannel
+	{
+public:
+
+	enum TControl
+		{
+		EDummu = 0,
+
+		// Codes for CMountCB operations
+		EMkDir,
+		ERmDir,
+		EDelete,
+		ERename,
+		EReplace,
+		EReadUid,
+		EEntry,
+		ESetEntry,
+		EFileOpen,
+		EDirOpen,
+		
+		// Code for CFileCB operations
+		EFileClose, 
+		EFileRead,
+		EFileWrite,
+		EFileSetSize,
+		EFileFlushAll,
+
+		// Code for CDirCB operations
+		EDirClose, 
+		EDirRead,
+
+		// Device ops
+		EGetDeviceID,
+		EGetDriveMap,
+
+		};
+	
+		
+public:
+#ifndef __KERNEL_MODE__  // don't need to see these in the driver
+	TInt Open();
+	TInt MkDir(TSVPHostFsMkDirInfo& aInfo);
+	TInt RmDir(TSVPHostFsRmDirInfo& aInfo);
+	TInt Delete(TSVPHostFsDeleteInfo& aInfo);
+	TInt Rename(TSVPHostFsRenameInfo& aInfo);
+	TInt Replace(TSVPHostFsReplaceInfo& aInfo);
+	TInt ReadUid(const TDesC& aName,TEntry& anEntry);
+	TInt Entry(TSVPHostFsEntryInfo& aInfo);
+	TInt SetEntry(TSVPHostFsSetEntryInfo &aInfo);
+	TInt FileOpen(TSVPHostFsFileOpenInfo &aInfo);
+	TInt DirOpen(TSVPHostFsDirOpenInfo& aInfo);
+	TInt FileClose(TUint32 aDrive, TUint32 aHandle);
+	TInt FileRead(TSVPHostFsFileReadInfo& aInfo);		
+	TInt FileWrite(TSVPHostFsFileWriteInfo& aInfo);
+	TInt FileSetSize(TSVPHostFsFileSetSizeInfo &aInfo);
+	TInt FileSetEntry(TSVPHostFsSetEntryInfo &aInfo);
+	TInt FlushData(TUint32 aDrive);
+	TInt FlushAll(TUint32 aDrive);
+
+	TInt DirClose(TUint32 aDrive, TUint32 aHandle);
+	TInt DirRead(TSVPHostFsDirReadInfo& aInfo);
+
+	TUint32 GetDeviceID(TUint32 aDrive);
+
+	TInt GetDriveMap(TUint32 * aMap);
+
+private:
+	inline TInt DoSVPRequest(TInt aReqNo, TAny * a1) 
+		{
+		TRequestStatus status;
+		DoRequest(aReqNo, status, a1);
+		User::WaitForRequest(status);
+		return status.Int();
+		}
+
+	inline TInt DoSVPRequest(TInt aReqNo, TAny * a1, TAny * a2) 
+		{
+		TRequestStatus status;
+		DoRequest(aReqNo, status, a1, a2);
+		User::WaitForRequest(status);
+		return status.Int();
+		}
+#endif
+	};
+
+#endif // __rsvphostfsdriver_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/svphostfs.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+TARGET         svphostfs.exe        
+TARGETTYPE     EXE
+SOURCEPATH	   fs
+SOURCE         svphostmain.cpp rsvphostfsdriver.cpp
+LIBRARY        euser.lib efsrv.lib efile.lib hal.lib
+SYSTEMINCLUDE  inc	
+SYSTEMINCLUDE  /epoc32/include 
+
+CAPABILITY		DISKADMIN ALLFILES
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsdriver.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+//macro	__KERNEL_MODE__
+
+#include <variant.mmh>
+#include   <kernel\kern_ext.mmh>
+
+systeminclude		AsspNKernIncludePath
+systeminclude		inc
+systeminclude		..\svpplatform\libfdt
+systeminclude 		\epoc32\include\stdapis
+
+target			VariantTarget(svphostfsdriver,ldd)
+linkas			svphostfsdriver.ldd
+targettype		ldd
+
+
+sourcepath		driver
+source			svphostfsdriver.cpp stringops.c
+
+option armcc --gnu
+
+staticlibrary		libfdt.lib 
+noexportlibrary
+
+vendorid 		0x70000001
+capability		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsstart.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+TARGET         svphostfsstart.exe        
+TARGETTYPE     EXE
+SOURCEPATH	   fs
+SOURCE         svphostfsstart.cpp
+LIBRARY        euser.lib efsrv.lib efile.lib hal.lib
+SYSTEMINCLUDE  inc	
+SYSTEMINCLUDE  /epoc32/include 
+
+CAPABILITY		DISKADMIN ALLFILES
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svphostfs/svphostfsy.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+TARGET			svphostfsy.fsy
+TARGETTYPE		fsy
+
+SOURCEPATH		fs
+SOURCE			svphostfsy.cpp svphostmnt.cpp svphostfil.cpp svphostdir.cpp rsvphostfsdriver.cpp
+NOSTRICTDEF
+
+SYSTEMINCLUDE	inc	
+SYSTEMINCLUDE	/epoc32/include 
+
+LIBRARY			efsrv.lib euser.lib hal.lib
+LIBRARY			efile.lib
+
+UID		0x100039df 0x10000CEE
+VENDORID 0x70000001
+
+unpaged
+
+TARGETPATH 	/sys/bin
+
+//CAPABILITY TCB ProtServ DiskAdmin AllFiles PowerMgmt CommDD
+#include "../../f32/group/f32caps.mmh"  // Capabilities of File Server process
+#include "../../f32/group/f32.mmh"      // Generic definitions for the whole f32 component
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/fdt.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+target			libfdt.lib
+targettype		klib
+
+systeminclude 		libfdt
+systeminclude 		\epoc32\include\stdapis
+
+sourcepath		libfdt
+
+source			fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
+
+option armcc --gnu
+option_replace armcc --diag_suppress 161,611,654,997,1152,1300,1464,1488,6318,6331,1254,1293,68
+capability		all
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/Makefile.libfdt	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,14 @@
+# Makefile.libfdt
+#
+# This is not a complete Makefile of itself.  Instead, it is designed to
+# be easily embeddable into other systems of Makefiles.
+#
+LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
+LIBFDT_INCLUDES = fdt.h libfdt.h
+LIBFDT_EXTRA = libfdt_internal.h
+LIBFDT_LIB = libfdt/libfdt.a
+
+LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
+
+$(LIBFDT_objdir)/$(LIBFDT_LIB): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/TODO	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,3 @@
+- Tree traversal functions
+- Graft function
+- Complete libfdt.h documenting comments
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/bswap.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,217 @@
+#ifndef BSWAP_H
+#define BSWAP_H
+
+#include "config-host.h"
+
+#include <inttypes.h>
+
+#ifdef HAVE_MACHINE_BSWAP_H
+#include <sys/endian.h>
+#include <sys/types.h>
+#include <machine/bswap.h>
+#else
+
+#ifdef HAVE_BYTESWAP_H
+#include <byteswap.h>
+#else
+
+#define bswap_16(x) \
+({ \
+	uint16_t __x = (x); \
+	((uint16_t)( \
+		(((uint16_t)(__x) & (uint16_t)0x00ffU) << 8) | \
+		(((uint16_t)(__x) & (uint16_t)0xff00U) >> 8) )); \
+})
+
+#define bswap_32(x) \
+({ \
+	uint32_t __x = (x); \
+	((uint32_t)( \
+		(((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
+		(((uint32_t)(__x) & (uint32_t)0x0000ff00UL) <<  8) | \
+		(((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >>  8) | \
+		(((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
+})
+
+#define bswap_64(x) \
+({ \
+	uint64_t __x = (x); \
+	((uint64_t)( \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) <<  8) | \
+	        (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >>  8) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \
+		(uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \
+})
+
+#endif /* !HAVE_BYTESWAP_H */
+
+static inline uint16_t bswap16(uint16_t x)
+{
+    return bswap_16(x);
+}
+
+static inline uint32_t bswap32(uint32_t x)
+{
+    return bswap_32(x);
+}
+
+static inline uint64_t bswap64(uint64_t x)
+{
+    return bswap_64(x);
+}
+
+#endif /* ! HAVE_MACHINE_BSWAP_H */
+
+static inline void bswap16s(uint16_t *s)
+{
+    *s = bswap16(*s);
+}
+
+static inline void bswap32s(uint32_t *s)
+{
+    *s = bswap32(*s);
+}
+
+static inline void bswap64s(uint64_t *s)
+{
+    *s = bswap64(*s);
+}
+
+#if defined(WORDS_BIGENDIAN)
+#define be_bswap(v, size) (v)
+#define le_bswap(v, size) bswap ## size(v)
+#define be_bswaps(v, size)
+#define le_bswaps(p, size) *p = bswap ## size(*p);
+#else
+#define le_bswap(v, size) (v)
+#define be_bswap(v, size) bswap ## size(v)
+#define le_bswaps(v, size)
+#define be_bswaps(p, size) *p = bswap ## size(*p);
+#endif
+
+#define CPU_CONVERT(endian, size, type)\
+static inline type endian ## size ## _to_cpu(type v)\
+{\
+    return endian ## _bswap(v, size);\
+}\
+\
+static inline type cpu_to_ ## endian ## size(type v)\
+{\
+    return endian ## _bswap(v, size);\
+}\
+\
+static inline void endian ## size ## _to_cpus(type *p)\
+{\
+    endian ## _bswaps(p, size)\
+}\
+\
+static inline void cpu_to_ ## endian ## size ## s(type *p)\
+{\
+    endian ## _bswaps(p, size)\
+}\
+\
+static inline type endian ## size ## _to_cpup(const type *p)\
+{\
+    return endian ## size ## _to_cpu(*p);\
+}\
+\
+static inline void cpu_to_ ## endian ## size ## w(type *p, type v)\
+{\
+     *p = cpu_to_ ## endian ## size(v);\
+}
+
+CPU_CONVERT(be, 16, uint16_t)
+CPU_CONVERT(be, 32, uint32_t)
+CPU_CONVERT(be, 64, uint64_t)
+
+CPU_CONVERT(le, 16, uint16_t)
+CPU_CONVERT(le, 32, uint32_t)
+CPU_CONVERT(le, 64, uint64_t)
+
+/* unaligned versions (optimized for frequent unaligned accesses)*/
+
+#if defined(__i386__) || defined(__powerpc__)
+
+#define cpu_to_le16wu(p, v) cpu_to_le16w(p, v)
+#define cpu_to_le32wu(p, v) cpu_to_le32w(p, v)
+#define le16_to_cpupu(p) le16_to_cpup(p)
+#define le32_to_cpupu(p) le32_to_cpup(p)
+#define be32_to_cpupu(p) be32_to_cpup(p)
+
+#define cpu_to_be16wu(p, v) cpu_to_be16w(p, v)
+#define cpu_to_be32wu(p, v) cpu_to_be32w(p, v)
+
+#else
+
+static inline void cpu_to_le16wu(uint16_t *p, uint16_t v)
+{
+    uint8_t *p1 = (uint8_t *)p;
+
+    p1[0] = v;
+    p1[1] = v >> 8;
+}
+
+static inline void cpu_to_le32wu(uint32_t *p, uint32_t v)
+{
+    uint8_t *p1 = (uint8_t *)p;
+
+    p1[0] = v;
+    p1[1] = v >> 8;
+    p1[2] = v >> 16;
+    p1[3] = v >> 24;
+}
+
+static inline uint16_t le16_to_cpupu(const uint16_t *p)
+{
+    const uint8_t *p1 = (const uint8_t *)p;
+    return p1[0] | (p1[1] << 8);
+}
+
+static inline uint32_t le32_to_cpupu(const uint32_t *p)
+{
+    const uint8_t *p1 = (const uint8_t *)p;
+    return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24);
+}
+
+static inline uint32_t be32_to_cpupu(const uint32_t *p)
+{
+    const uint8_t *p1 = (const uint8_t *)p;
+    return p1[3] | (p1[2] << 8) | (p1[1] << 16) | (p1[0] << 24);
+}
+
+static inline void cpu_to_be16wu(uint16_t *p, uint16_t v)
+{
+    uint8_t *p1 = (uint8_t *)p;
+
+    p1[0] = v >> 8;
+    p1[1] = v;
+}
+
+static inline void cpu_to_be32wu(uint32_t *p, uint32_t v)
+{
+    uint8_t *p1 = (uint8_t *)p;
+
+    p1[0] = v >> 24;
+    p1[1] = v >> 16;
+    p1[2] = v >> 8;
+    p1[3] = v;
+}
+
+#endif
+
+#ifdef WORDS_BIGENDIAN
+#define cpu_to_32wu cpu_to_be32wu
+#else
+#define cpu_to_32wu cpu_to_le32wu
+#endif
+
+#undef le_bswap
+#undef be_bswap
+#undef le_bswaps
+#undef be_bswaps
+
+#endif /* BSWAP_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/config-host.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,10 @@
+#ifndef CONFIG_HOST_H
+#define CONFIG_HOST_H
+
+// dont have machine level bswap
+//#define HAVE_MACHINE_BSWAP_H
+
+// dont have byteswap
+//#define HAVE_BYTESWAP_H
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,156 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+int fdt_check_header(const void *fdt)
+{
+	if (fdt_magic(fdt) == FDT_MAGIC) {
+		/* Complete tree */
+		if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
+			return -FDT_ERR_BADVERSION;
+		if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
+			return -FDT_ERR_BADVERSION;
+	} else if (fdt_magic(fdt) == SW_MAGIC) {
+		/* Unfinished sequential-write blob */
+		if (fdt_size_dt_struct(fdt) == 0)
+			return -FDT_ERR_BADSTATE;
+	} else {
+		return -FDT_ERR_BADMAGIC;
+	}
+
+	return 0;
+}
+
+const void *fdt_offset_ptr(const void *fdt, int offset, int len)
+{
+	const void *p;
+
+	if (fdt_version(fdt) >= 0x11)
+		if (((offset + len) < offset)
+		    || ((offset + len) > fdt_size_dt_struct(fdt)))
+			return NULL;
+
+	p = _fdt_offset_ptr(fdt, offset);
+
+	if (p + len < p)
+		return NULL;
+	return p;
+}
+
+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
+{
+	const uint32_t *tagp, *lenp;
+	uint32_t tag;
+	const char *p;
+
+	if (offset % FDT_TAGSIZE)
+		return -1;
+
+	tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
+	if (! tagp)
+		return FDT_END; /* premature end */
+	tag = fdt32_to_cpu(*tagp);
+	offset += FDT_TAGSIZE;
+
+	switch (tag) {
+	case FDT_BEGIN_NODE:
+		/* skip name */
+		do {
+			p = fdt_offset_ptr(fdt, offset++, 1);
+		} while (p && (*p != '\0'));
+		if (! p)
+			return FDT_END;
+		break;
+	case FDT_PROP:
+		lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
+		if (! lenp)
+			return FDT_END;
+		/* skip name offset, length and value */
+		offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
+		break;
+	}
+
+	if (nextoffset)
+		*nextoffset = ALIGN(offset, FDT_TAGSIZE);
+
+	return tag;
+}
+
+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
+{
+	int len = strlen(s) + 1;
+	const char *last = strtab + tabsize - len;
+	const char *p;
+
+	for (p = strtab; p <= last; p++)
+		if (memeq(p, s, len))
+			return p;
+	return NULL;
+}
+
+int fdt_move(const void *fdt, void *buf, int bufsize)
+{
+	int err = fdt_check_header(fdt);
+
+	if (err)
+		return err;
+
+	if (fdt_totalsize(fdt) > bufsize)
+		return -FDT_ERR_NOSPACE;
+
+	memmove(buf, fdt, fdt_totalsize(fdt));
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,6 @@
+
+extern "C" {
+
+#include "fdt.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,60 @@
+#ifndef _FDT_H
+#define _FDT_H
+
+#ifndef __ASSEMBLY__
+
+struct fdt_header {
+	uint32_t magic;			 /* magic word FDT_MAGIC */
+	uint32_t totalsize;		 /* total size of DT block */
+	uint32_t off_dt_struct;		 /* offset to structure */
+	uint32_t off_dt_strings;	 /* offset to strings */
+	uint32_t off_mem_rsvmap;	 /* offset to memory reserve map */
+	uint32_t version;		 /* format version */
+	uint32_t last_comp_version;	 /* last compatible version */
+
+	/* version 2 fields below */
+	uint32_t boot_cpuid_phys;	 /* Which physical CPU id we're
+					    booting on */
+	/* version 3 fields below */
+	uint32_t size_dt_strings;	 /* size of the strings block */
+
+	/* version 17 fields below */
+	uint32_t size_dt_struct;	 /* size of the structure block */
+};
+
+struct fdt_reserve_entry {
+	uint64_t address;
+	uint64_t size;
+};
+
+struct fdt_node_header {
+	uint32_t tag;
+	char name[0];
+};
+
+struct fdt_property {
+	uint32_t tag;
+	uint32_t len;
+	uint32_t nameoff;
+	char data[0];
+};
+
+#endif /* !__ASSEMBLY */
+
+#define FDT_MAGIC	0xd00dfeed	/* 4: version, 4: total size */
+#define FDT_TAGSIZE	sizeof(uint32_t)
+
+#define FDT_BEGIN_NODE	0x1		/* Start node: full name */
+#define FDT_END_NODE	0x2		/* End node */
+#define FDT_PROP	0x3		/* Property: name off,
+					   size, content */
+#define FDT_NOP		0x4		/* nop */
+#define FDT_END		0x9
+
+#define FDT_V1_SIZE	(7*sizeof(uint32_t))
+#define FDT_V2_SIZE	(FDT_V1_SIZE + sizeof(uint32_t))
+#define FDT_V3_SIZE	(FDT_V2_SIZE + sizeof(uint32_t))
+#define FDT_V16_SIZE	FDT_V3_SIZE
+#define FDT_V17_SIZE	(FDT_V16_SIZE + sizeof(uint32_t))
+
+#endif /* _FDT_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_ro.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,583 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+#define CHECK_HEADER(fdt) \
+	{ \
+		int err; \
+		if ((err = fdt_check_header(fdt)) != 0) \
+			return err; \
+	}
+
+static int nodename_eq(const void *fdt, int offset,
+		       const char *s, int len)
+{
+	const char *p = fdt_offset_ptr(fdt, offset, len+1);
+
+	if (! p)
+		/* short match */
+		return 0;
+
+	if (memcmp(p, s, len) != 0)
+		return 0;
+
+	if (p[len] == '\0')
+		return 1;
+	else if (!memchr(s, '@', len) && (p[len] == '@'))
+		return 1;
+	else
+		return 0;
+}
+
+const char *fdt_string(const void *fdt, int stroffset)
+{
+	return (char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
+}
+
+int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
+{
+	CHECK_HEADER(fdt);
+	*address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address);
+	*size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size);
+	return 0;
+}
+
+int fdt_num_mem_rsv(const void *fdt)
+{
+	int i = 0;
+
+	while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
+		i++;
+	return i;
+}
+
+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
+			       const char *name, int namelen)
+{
+	int level = 0;
+	uint32_t tag;
+	int offset, nextoffset;
+
+	CHECK_HEADER(fdt);
+
+	tag = fdt_next_tag(fdt, parentoffset, &nextoffset);
+	if (tag != FDT_BEGIN_NODE)
+		return -FDT_ERR_BADOFFSET;
+
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+		switch (tag) {
+		case FDT_END:
+			return -FDT_ERR_TRUNCATED;
+
+		case FDT_BEGIN_NODE:
+			level++;
+			if (level != 1)
+				continue;
+			if (nodename_eq(fdt, offset+FDT_TAGSIZE, name, namelen))
+				/* Found it! */
+				return offset;
+			break;
+
+		case FDT_END_NODE:
+			level--;
+			break;
+
+		case FDT_PROP:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	} while (level >= 0);
+
+	return -FDT_ERR_NOTFOUND;
+}
+
+int fdt_subnode_offset(const void *fdt, int parentoffset,
+		       const char *name)
+{
+	return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
+}
+
+int fdt_path_offset(const void *fdt, const char *path)
+{
+	const char *end = path + strlen(path);
+	const char *p = path;
+	int offset = 0;
+
+	CHECK_HEADER(fdt);
+
+	if (*path != '/')
+		return -FDT_ERR_BADPATH;
+
+	while (*p) {
+		const char *q;
+
+		while (*p == '/')
+			p++;
+		if (! *p)
+			return offset;
+		q = strchr(p, '/');
+		if (! q)
+			q = end;
+
+		offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
+		if (offset < 0)
+			return offset;
+
+		p = q;
+	}
+
+	return offset;
+}
+
+const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
+{
+	const struct fdt_node_header *nh;
+	int err;
+
+	if ((err = fdt_check_header(fdt)) != 0)
+		goto fail;
+
+	err = -FDT_ERR_BADOFFSET;
+	nh = fdt_offset_ptr(fdt, nodeoffset, sizeof(*nh));
+	if (!nh || (fdt32_to_cpu(nh->tag) != FDT_BEGIN_NODE))
+		goto fail;
+
+	if (len)
+		*len = strlen(nh->name);
+
+	return nh->name;
+
+ fail:
+	if (len)
+		*len = err;
+	return NULL;
+}
+
+const struct fdt_property *fdt_get_property(const void *fdt,
+					    int nodeoffset,
+					    const char *name, int *lenp)
+{
+	uint32_t tag;
+	const struct fdt_property *prop;
+	int namestroff;
+	int offset, nextoffset;
+	int err;
+
+	if ((err = fdt_check_header(fdt)) != 0)
+		goto fail;
+
+	err = -FDT_ERR_BADOFFSET;
+	if (nodeoffset % FDT_TAGSIZE)
+		goto fail;
+
+	tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
+	if (tag != FDT_BEGIN_NODE)
+		goto fail;
+
+	do {
+		offset = nextoffset;
+
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+		switch (tag) {
+		case FDT_END:
+			err = -FDT_ERR_TRUNCATED;
+			goto fail;
+
+		case FDT_BEGIN_NODE:
+		case FDT_END_NODE:
+		case FDT_NOP:
+			break;
+
+		case FDT_PROP:
+			err = -FDT_ERR_BADSTRUCTURE;
+			prop = fdt_offset_ptr(fdt, offset, sizeof(*prop));
+			if (! prop)
+				goto fail;
+			namestroff = fdt32_to_cpu(prop->nameoff);
+			if (streq(fdt_string(fdt, namestroff), name)) {
+				/* Found it! */
+				int len = fdt32_to_cpu(prop->len);
+				prop = fdt_offset_ptr(fdt, offset,
+						      sizeof(*prop)+len);
+				if (! prop)
+					goto fail;
+
+				if (lenp)
+					*lenp = len;
+
+				return prop;
+			}
+			break;
+
+		default:
+			err = -FDT_ERR_BADSTRUCTURE;
+			goto fail;
+		}
+	} while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE));
+
+	err = -FDT_ERR_NOTFOUND;
+ fail:
+	if (lenp)
+		*lenp = err;
+	return NULL;
+}
+
+const void *fdt_getprop(const void *fdt, int nodeoffset,
+		  const char *name, int *lenp)
+{
+	const struct fdt_property *prop;
+
+	prop = fdt_get_property(fdt, nodeoffset, name, lenp);
+	if (! prop)
+		return NULL;
+
+	return prop->data;
+}
+
+uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
+{
+	const uint32_t *php;
+	int len;
+
+	php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
+	if (!php || (len != sizeof(*php)))
+		return 0;
+
+	return fdt32_to_cpu(*php);
+}
+
+int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
+{
+	uint32_t tag;
+	int p = 0, overflow = 0;
+	int offset, nextoffset, namelen;
+	const char *name;
+
+	CHECK_HEADER(fdt);
+
+	tag = fdt_next_tag(fdt, 0, &nextoffset);
+	if (tag != FDT_BEGIN_NODE)
+		return -FDT_ERR_BADSTRUCTURE;
+
+	if (buflen < 2)
+		return -FDT_ERR_NOSPACE;
+	buf[0] = '/';
+	p = 1;
+
+	while (nextoffset <= nodeoffset) {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+		switch (tag) {
+		case FDT_END:
+			return -FDT_ERR_BADOFFSET;
+
+		case FDT_BEGIN_NODE:
+			name = fdt_get_name(fdt, offset, &namelen);
+			if (!name)
+				return namelen;
+			if (overflow || ((p + namelen + 1) > buflen)) {
+				overflow++;
+				break;
+			}
+			memcpy(buf + p, name, namelen);
+			p += namelen;
+			buf[p++] = '/';
+			break;
+
+		case FDT_END_NODE:
+			if (overflow) {
+				overflow--;
+				break;
+			}
+			do {
+				p--;
+			} while  (buf[p-1] != '/');
+			break;
+
+		case FDT_PROP:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	}
+
+	if (overflow)
+		return -FDT_ERR_NOSPACE;
+
+	if (p > 1) /* special case so that root path is "/", not "" */
+		p--;
+	buf[p] = '\0';
+	return p;
+}
+
+int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
+				 int supernodedepth, int *nodedepth)
+{
+	int level = -1;
+	uint32_t tag;
+	int offset, nextoffset = 0;
+	int supernodeoffset = -FDT_ERR_INTERNAL;
+
+	CHECK_HEADER(fdt);
+
+	if (supernodedepth < 0)
+		return -FDT_ERR_NOTFOUND;
+
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+		switch (tag) {
+		case FDT_END:
+			return -FDT_ERR_BADOFFSET;
+
+		case FDT_BEGIN_NODE:
+			level++;
+			if (level == supernodedepth)
+				supernodeoffset = offset;
+			break;
+
+		case FDT_END_NODE:
+			level--;
+			break;
+
+		case FDT_PROP:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	} while (offset < nodeoffset);
+
+	if (nodedepth)
+		*nodedepth = level;
+
+	if (supernodedepth > level)
+		return -FDT_ERR_NOTFOUND;
+	return supernodeoffset;
+}
+
+int fdt_node_depth(const void *fdt, int nodeoffset)
+{
+	int nodedepth;
+	int err;
+
+	err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth);
+	if (err)
+		return (err < 0) ? err : -FDT_ERR_INTERNAL;
+	return nodedepth;
+}
+
+int fdt_parent_offset(const void *fdt, int nodeoffset)
+{
+	int nodedepth = fdt_node_depth(fdt, nodeoffset);
+
+	if (nodedepth < 0)
+		return nodedepth;
+	return fdt_supernode_atdepth_offset(fdt, nodeoffset,
+					    nodedepth - 1, NULL);
+}
+
+int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
+				  const char *propname,
+				  const void *propval, int proplen)
+{
+	uint32_t tag;
+	int offset, nextoffset;
+	const void *val;
+	int len;
+
+	CHECK_HEADER(fdt);
+
+	if (startoffset >= 0) {
+		tag = fdt_next_tag(fdt, startoffset, &nextoffset);
+		if (tag != FDT_BEGIN_NODE)
+			return -FDT_ERR_BADOFFSET;
+	} else {
+		nextoffset = 0;
+	}
+
+	/* FIXME: The algorithm here is pretty horrible: we scan each
+	 * property of a node in fdt_getprop(), then if that didn't
+	 * find what we want, we scan over them again making our way
+	 * to the next node.  Still it's the easiest to implement
+	 * approach; performance can come later. */
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+		switch (tag) {
+		case FDT_BEGIN_NODE:
+			val = fdt_getprop(fdt, offset, propname, &len);
+			if (val
+			    && (len == proplen)
+			    && (memcmp(val, propval, len) == 0))
+				return offset;
+			break;
+
+		case FDT_PROP:
+		case FDT_END:
+		case FDT_END_NODE:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	} while (tag != FDT_END);
+
+	return -FDT_ERR_NOTFOUND;
+}
+
+int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
+{
+	if ((phandle == 0) || (phandle == -1))
+		return -FDT_ERR_BADPHANDLE;
+	phandle = cpu_to_fdt32(phandle);
+	return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
+					     &phandle, sizeof(phandle));
+}
+
+int _stringlist_contains(const void *strlist, int listlen, const char *str)
+{
+	int len = strlen(str);
+	const void *p;
+
+	while (listlen >= len) {
+		if (memcmp(str, strlist, len+1) == 0)
+			return 1;
+		p = memchr(strlist, '\0', listlen);
+		if (!p)
+			return 0; /* malformed strlist.. */
+		listlen -= (p-strlist) + 1;
+		strlist = p + 1;
+	}
+	return 0;
+}
+
+int fdt_node_check_compatible(const void *fdt, int nodeoffset,
+			      const char *compatible)
+{
+	const void *prop;
+	int len;
+
+	prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
+	if (!prop)
+		return len;
+	if (_stringlist_contains(prop, len, compatible))
+		return 0;
+	else
+		return 1;
+}
+
+int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
+				  const char *compatible)
+{
+	uint32_t tag;
+	int offset, nextoffset;
+	int err;
+
+	CHECK_HEADER(fdt);
+
+	if (startoffset >= 0) {
+		tag = fdt_next_tag(fdt, startoffset, &nextoffset);
+		if (tag != FDT_BEGIN_NODE)
+			return -FDT_ERR_BADOFFSET;
+	} else {
+		nextoffset = 0;
+	}
+
+	/* FIXME: The algorithm here is pretty horrible: we scan each
+	 * property of a node in fdt_node_check_compatible(), then if
+	 * that didn't find what we want, we scan over them again
+	 * making our way to the next node.  Still it's the easiest to
+	 * implement approach; performance can come later. */
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+		switch (tag) {
+		case FDT_BEGIN_NODE:
+			err = fdt_node_check_compatible(fdt, offset,
+							compatible);
+			if ((err < 0)
+			    && (err != -FDT_ERR_NOTFOUND))
+				return err;
+			else if (err == 0)
+				return offset;
+			break;
+
+		case FDT_PROP:
+		case FDT_END:
+		case FDT_END_NODE:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	} while (tag != FDT_END);
+
+	return -FDT_ERR_NOTFOUND;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_ro.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+extern "C" {
+
+#include "fdt_ro.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_rw.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,471 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+static int _blocks_misordered(const void *fdt,
+			      int mem_rsv_size, int struct_size)
+{
+	return (fdt_off_mem_rsvmap(fdt) < ALIGN(sizeof(struct fdt_header), 8))
+		|| (fdt_off_dt_struct(fdt) <
+		    (fdt_off_mem_rsvmap(fdt) + mem_rsv_size))
+		|| (fdt_off_dt_strings(fdt) <
+		    (fdt_off_dt_struct(fdt) + struct_size))
+		|| (fdt_totalsize(fdt) <
+		    (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
+}
+
+static int rw_check_header(void *fdt)
+{
+	int err;
+
+	if ((err = fdt_check_header(fdt)))
+		return err;
+	if (fdt_version(fdt) < 17)
+		return -FDT_ERR_BADVERSION;
+	if (_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
+			       fdt_size_dt_struct(fdt)))
+		return -FDT_ERR_BADLAYOUT;
+	if (fdt_version(fdt) > 17)
+		fdt_set_version(fdt, 17);
+
+	return 0;
+}
+
+#define RW_CHECK_HEADER(fdt) \
+	{ \
+		int err; \
+		if ((err = rw_check_header(fdt)) != 0) \
+			return err; \
+	}
+
+static inline int _blob_data_size(void *fdt)
+{
+	return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+}
+
+static int _blob_splice(void *fdt, void *p, int oldlen, int newlen)
+{
+	void *end = fdt + _blob_data_size(fdt);
+
+	if (((p + oldlen) < p) || ((p + oldlen) > end))
+		return -FDT_ERR_BADOFFSET;
+	if ((end - oldlen + newlen) > (fdt + fdt_totalsize(fdt)))
+		return -FDT_ERR_NOSPACE;
+	memmove(p + newlen, p + oldlen, end - p - oldlen);
+	return 0;
+}
+
+static int _blob_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
+				int oldn, int newn)
+{
+	int delta = (newn - oldn) * sizeof(*p);
+	int err;
+	err = _blob_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
+	if (err)
+		return err;
+	fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
+	fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
+	return 0;
+}
+
+static int _blob_splice_struct(void *fdt, void *p,
+			       int oldlen, int newlen)
+{
+	int delta = newlen - oldlen;
+	int err;
+
+	if ((err = _blob_splice(fdt, p, oldlen, newlen)))
+		return err;
+
+	fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
+	fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
+	return 0;
+}
+
+static int _blob_splice_string(void *fdt, int newlen)
+{
+	void *p = fdt + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+	int err;
+
+	if ((err = _blob_splice(fdt, p, 0, newlen)))
+		return err;
+
+	fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
+	return 0;
+}
+
+static int _find_add_string(void *fdt, const char *s)
+{
+	char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
+	const char *p;
+	char *new;
+	int len = strlen(s) + 1;
+	int err;
+
+	p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
+	if (p)
+		/* found it */
+		return (p - strtab);
+
+	new = strtab + fdt_size_dt_strings(fdt);
+	err = _blob_splice_string(fdt, len);
+	if (err)
+		return err;
+
+	memcpy(new, s, len);
+	return (new - strtab);
+}
+
+int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
+{
+	struct fdt_reserve_entry *re;
+	int err;
+
+	if ((err = rw_check_header(fdt)))
+		return err;
+
+	re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
+	err = _blob_splice_mem_rsv(fdt, re, 0, 1);
+	if (err)
+		return err;
+
+	re->address = cpu_to_fdt64(address);
+	re->size = cpu_to_fdt64(size);
+	return 0;
+}
+
+int fdt_del_mem_rsv(void *fdt, int n)
+{
+	struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
+	int err;
+
+	if ((err = rw_check_header(fdt)))
+		return err;
+	if (n >= fdt_num_mem_rsv(fdt))
+		return -FDT_ERR_NOTFOUND;
+
+	err = _blob_splice_mem_rsv(fdt, re, 1, 0);
+	if (err)
+		return err;
+	return 0;
+}
+
+static int _resize_property(void *fdt, int nodeoffset, const char *name, int len,
+			    struct fdt_property **prop)
+{
+	int oldlen;
+	int err;
+
+	*prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
+	if (! (*prop))
+		return oldlen;
+
+	if ((err = _blob_splice_struct(fdt, (*prop)->data,
+				       ALIGN(oldlen, FDT_TAGSIZE),
+				       ALIGN(len, FDT_TAGSIZE))))
+		return err;
+
+	(*prop)->len = cpu_to_fdt32(len);
+	return 0;
+}
+
+static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
+			 struct fdt_property **prop)
+{
+	uint32_t tag;
+	int proplen;
+	int nextoffset;
+	int namestroff;
+	int err;
+
+	tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
+	if (tag != FDT_BEGIN_NODE)
+		return -FDT_ERR_BADOFFSET;
+
+	namestroff = _find_add_string(fdt, name);
+	if (namestroff < 0)
+		return namestroff;
+
+	*prop = _fdt_offset_ptr_w(fdt, nextoffset);
+	proplen = sizeof(**prop) + ALIGN(len, FDT_TAGSIZE);
+
+	err = _blob_splice_struct(fdt, *prop, 0, proplen);
+	if (err)
+		return err;
+
+	(*prop)->tag = cpu_to_fdt32(FDT_PROP);
+	(*prop)->nameoff = cpu_to_fdt32(namestroff);
+	(*prop)->len = cpu_to_fdt32(len);
+	return 0;
+}
+
+int fdt_set_name(void *fdt, int nodeoffset, const char *name)
+{
+	char *namep;
+	int oldlen, newlen;
+	int err;
+
+	if ((err = rw_check_header(fdt)))
+		return err;
+
+	namep = (char *)fdt_get_name(fdt, nodeoffset, &oldlen);
+	if (!namep)
+		return oldlen;
+
+	newlen = strlen(name);
+
+	err = _blob_splice_struct(fdt, namep, ALIGN(oldlen+1, FDT_TAGSIZE),
+				  ALIGN(newlen+1, FDT_TAGSIZE));
+	if (err)
+		return err;
+
+	memcpy(namep, name, newlen+1);
+	return 0;
+}
+
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+		const void *val, int len)
+{
+	struct fdt_property *prop;
+	int err;
+
+	if ((err = rw_check_header(fdt)))
+		return err;
+
+	err = _resize_property(fdt, nodeoffset, name, len, &prop);
+	if (err == -FDT_ERR_NOTFOUND)
+		err = _add_property(fdt, nodeoffset, name, len, &prop);
+	if (err)
+		return err;
+
+	memcpy(prop->data, val, len);
+	return 0;
+}
+
+int fdt_delprop(void *fdt, int nodeoffset, const char *name)
+{
+	struct fdt_property *prop;
+	int len, proplen;
+
+	RW_CHECK_HEADER(fdt);
+
+	prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
+	if (! prop)
+		return len;
+
+	proplen = sizeof(*prop) + ALIGN(len, FDT_TAGSIZE);
+	return _blob_splice_struct(fdt, prop, proplen, 0);
+}
+
+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+			    const char *name, int namelen)
+{
+	struct fdt_node_header *nh;
+	int offset, nextoffset;
+	int nodelen;
+	int err;
+	uint32_t tag;
+	uint32_t *endtag;
+
+	RW_CHECK_HEADER(fdt);
+
+	offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
+	if (offset >= 0)
+		return -FDT_ERR_EXISTS;
+	else if (offset != -FDT_ERR_NOTFOUND)
+		return offset;
+
+	/* Try to place the new node after the parent's properties */
+	fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+	} while (tag == FDT_PROP);
+
+	nh = _fdt_offset_ptr_w(fdt, offset);
+	nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
+
+	err = _blob_splice_struct(fdt, nh, 0, nodelen);
+	if (err)
+		return err;
+
+	nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+	memset(nh->name, 0, ALIGN(namelen+1, FDT_TAGSIZE));
+	memcpy(nh->name, name, namelen);
+	endtag = (uint32_t *)((void *)nh + nodelen - FDT_TAGSIZE);
+	*endtag = cpu_to_fdt32(FDT_END_NODE);
+
+	return offset;
+}
+
+int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
+{
+	return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
+}
+
+int fdt_del_node(void *fdt, int nodeoffset)
+{
+	int endoffset;
+
+	RW_CHECK_HEADER(fdt);
+
+	endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+	if (endoffset < 0)
+		return endoffset;
+
+	return _blob_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
+				   endoffset - nodeoffset, 0);
+}
+
+static void _packblocks(const void *fdt, void *buf,
+		       int mem_rsv_size, int struct_size)
+{
+	int mem_rsv_off, struct_off, strings_off;
+
+	mem_rsv_off = ALIGN(sizeof(struct fdt_header), 8);
+	struct_off = mem_rsv_off + mem_rsv_size;
+	strings_off = struct_off + struct_size;
+
+	memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size);
+	fdt_set_off_mem_rsvmap(buf, mem_rsv_off);
+
+	memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
+	fdt_set_off_dt_struct(buf, struct_off);
+	fdt_set_size_dt_struct(buf, struct_size);
+
+	memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
+		fdt_size_dt_strings(fdt));
+	fdt_set_off_dt_strings(buf, strings_off);
+	fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt));
+}
+
+int fdt_open_into(const void *fdt, void *buf, int bufsize)
+{
+	int err;
+	int mem_rsv_size, struct_size;
+	int newsize;
+	void *tmp;
+
+	err = fdt_check_header(fdt);
+	if (err)
+		return err;
+
+	mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
+		* sizeof(struct fdt_reserve_entry);
+
+	if (fdt_version(fdt) >= 17) {
+		struct_size = fdt_size_dt_struct(fdt);
+	} else {
+		struct_size = 0;
+		while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
+			;
+	}
+
+	if (!_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
+		/* no further work necessary */
+		err = fdt_move(fdt, buf, bufsize);
+		if (err)
+			return err;
+		fdt_set_version(buf, 17);
+		fdt_set_size_dt_struct(buf, struct_size);
+		fdt_set_totalsize(buf, bufsize);
+		return 0;
+	}
+
+	/* Need to reorder */
+	newsize = ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
+		+ struct_size + fdt_size_dt_strings(fdt);
+
+	if (bufsize < newsize)
+		return -FDT_ERR_NOSPACE;
+
+	if (((buf + newsize) <= fdt)
+	    || (buf >= (fdt + fdt_totalsize(fdt)))) {
+		tmp = buf;
+	} else {
+		tmp = (void *)fdt + fdt_totalsize(fdt);
+		if ((tmp + newsize) > (buf + bufsize))
+			return -FDT_ERR_NOSPACE;
+	}
+
+	_packblocks(fdt, tmp, mem_rsv_size, struct_size);
+	memmove(buf, tmp, newsize);
+
+	fdt_set_magic(buf, FDT_MAGIC);
+	fdt_set_totalsize(buf, bufsize);
+	fdt_set_version(buf, 17);
+	fdt_set_last_comp_version(buf, 16);
+	fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
+
+	return 0;
+}
+
+int fdt_pack(void *fdt)
+{
+	int mem_rsv_size;
+	int err;
+
+	err = rw_check_header(fdt);
+	if (err)
+		return err;
+
+	mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
+		* sizeof(struct fdt_reserve_entry);
+	_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
+	fdt_set_totalsize(fdt, _blob_data_size(fdt));
+
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_rw.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+extern "C" {
+
+#include "fdt_rw.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_strerror.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,96 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+struct errtabent {
+	const char *str;
+};
+
+#define ERRTABENT(val) \
+	[(val)] = { .str = #val, }
+
+static struct errtabent errtable[] = {
+	ERRTABENT(FDT_ERR_NOTFOUND),
+	ERRTABENT(FDT_ERR_EXISTS),
+	ERRTABENT(FDT_ERR_NOSPACE),
+
+	ERRTABENT(FDT_ERR_BADOFFSET),
+	ERRTABENT(FDT_ERR_BADPATH),
+	ERRTABENT(FDT_ERR_BADSTATE),
+
+	ERRTABENT(FDT_ERR_TRUNCATED),
+	ERRTABENT(FDT_ERR_BADMAGIC),
+	ERRTABENT(FDT_ERR_BADVERSION),
+	ERRTABENT(FDT_ERR_BADSTRUCTURE),
+	ERRTABENT(FDT_ERR_BADLAYOUT),
+};
+#define ERRTABSIZE	(sizeof(errtable) / sizeof(errtable[0]))
+
+const char *fdt_strerror(int errval)
+{
+	if (errval > 0)
+		return "<valid offset/length>";
+	else if (errval == 0)
+		return "<no error>";
+	else if (errval > -ERRTABSIZE) {
+		const char *s = errtable[-errval].str;
+
+		if (s)
+			return s;
+	}
+
+	return "<unknown error>";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_strerror.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+extern "C" {
+
+#include "fdt_strerror.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_sw.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,258 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+static int check_header_sw(void *fdt)
+{
+	if (fdt_magic(fdt) != SW_MAGIC)
+		return -FDT_ERR_BADMAGIC;
+	return 0;
+}
+
+static void *grab_space(void *fdt, int len)
+{
+	int offset = fdt_size_dt_struct(fdt);
+	int spaceleft;
+
+	spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
+		- fdt_size_dt_strings(fdt);
+
+	if ((offset + len < offset) || (offset + len > spaceleft))
+		return NULL;
+
+	fdt_set_size_dt_struct(fdt, offset + len);
+	return fdt_offset_ptr_w(fdt, offset, len);
+}
+
+int fdt_create(void *buf, int bufsize)
+{
+	void *fdt = buf;
+
+	if (bufsize < sizeof(struct fdt_header))
+		return -FDT_ERR_NOSPACE;
+
+	memset(buf, 0, bufsize);
+
+	fdt_set_magic(fdt, SW_MAGIC);
+	fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
+	fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
+	fdt_set_totalsize(fdt,  bufsize);
+
+	fdt_set_off_mem_rsvmap(fdt, ALIGN(sizeof(struct fdt_header),
+					  sizeof(struct fdt_reserve_entry)));
+	fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
+	fdt_set_off_dt_strings(fdt, bufsize);
+
+	return 0;
+}
+
+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
+{
+	struct fdt_reserve_entry *re;
+	int err = check_header_sw(fdt);
+	int offset;
+
+	if (err)
+		return err;
+	if (fdt_size_dt_struct(fdt))
+		return -FDT_ERR_BADSTATE;
+
+	offset = fdt_off_dt_struct(fdt);
+	if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
+		return -FDT_ERR_NOSPACE;
+
+	re = (struct fdt_reserve_entry *)(fdt + offset);
+	re->address = cpu_to_fdt64(addr);
+	re->size = cpu_to_fdt64(size);
+
+	fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
+
+	return 0;
+}
+
+int fdt_finish_reservemap(void *fdt)
+{
+	return fdt_add_reservemap_entry(fdt, 0, 0);
+}
+
+int fdt_begin_node(void *fdt, const char *name)
+{
+	struct fdt_node_header *nh;
+	int err = check_header_sw(fdt);
+	int namelen = strlen(name) + 1;
+
+	if (err)
+		return err;
+
+	nh = grab_space(fdt, sizeof(*nh) + ALIGN(namelen, FDT_TAGSIZE));
+	if (! nh)
+		return -FDT_ERR_NOSPACE;
+
+	nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+	memcpy(nh->name, name, namelen);
+	return 0;
+}
+
+int fdt_end_node(void *fdt)
+{
+	uint32_t *en;
+	int err = check_header_sw(fdt);
+
+	if (err)
+		return err;
+
+	en = grab_space(fdt, FDT_TAGSIZE);
+	if (! en)
+		return -FDT_ERR_NOSPACE;
+
+	*en = cpu_to_fdt32(FDT_END_NODE);
+	return 0;
+}
+
+static int find_add_string(void *fdt, const char *s)
+{
+	char *strtab = (char *)fdt + fdt_totalsize(fdt);
+	const char *p;
+	int strtabsize = fdt_size_dt_strings(fdt);
+	int len = strlen(s) + 1;
+	int struct_top, offset;
+
+	p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
+	if (p)
+		return p - strtab;
+
+	/* Add it */
+	offset = -strtabsize - len;
+	struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+	if (fdt_totalsize(fdt) + offset < struct_top)
+		return 0; /* no more room :( */
+
+	memcpy(strtab + offset, s, len);
+	fdt_set_size_dt_strings(fdt, strtabsize + len);
+	return offset;
+}
+
+int fdt_property(void *fdt, const char *name, const void *val, int len)
+{
+	struct fdt_property *prop;
+	int err = check_header_sw(fdt);
+	int nameoff;
+
+	if (err)
+		return err;
+
+	nameoff = find_add_string(fdt, name);
+	if (nameoff == 0)
+		return -FDT_ERR_NOSPACE;
+
+	prop = grab_space(fdt, sizeof(*prop) + ALIGN(len, FDT_TAGSIZE));
+	if (! prop)
+		return -FDT_ERR_NOSPACE;
+
+	prop->tag = cpu_to_fdt32(FDT_PROP);
+	prop->nameoff = cpu_to_fdt32(nameoff);
+	prop->len = cpu_to_fdt32(len);
+	memcpy(prop->data, val, len);
+	return 0;
+}
+
+int fdt_finish(void *fdt)
+{
+	int err = check_header_sw(fdt);
+	char *p = (char *)fdt;
+	uint32_t *end;
+	int oldstroffset, newstroffset;
+	uint32_t tag;
+	int offset, nextoffset;
+
+	if (err)
+		return err;
+
+	/* Add terminator */
+	end = grab_space(fdt, sizeof(*end));
+	if (! end)
+		return -FDT_ERR_NOSPACE;
+	*end = cpu_to_fdt32(FDT_END);
+
+	/* Relocate the string table */
+	oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
+	newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+	memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
+	fdt_set_off_dt_strings(fdt, newstroffset);
+
+	/* Walk the structure, correcting string offsets */
+	offset = 0;
+	while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
+		if (tag == FDT_PROP) {
+			struct fdt_property *prop =
+				fdt_offset_ptr_w(fdt, offset, sizeof(*prop));
+			int nameoff;
+
+			if (! prop)
+				return -FDT_ERR_BADSTRUCTURE;
+
+			nameoff = fdt32_to_cpu(prop->nameoff);
+			nameoff += fdt_size_dt_strings(fdt);
+			prop->nameoff = cpu_to_fdt32(nameoff);
+		}
+		offset = nextoffset;
+	}
+
+	/* Finally, adjust the header */
+	fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
+	fdt_set_magic(fdt, FDT_MAGIC);
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_sw.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+extern "C" {
+
+#include "fdt_sw.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_wip.c	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,144 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+			const void *val, int len)
+{
+	void *propval;
+	int proplen;
+
+	propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
+	if (! propval)
+		return proplen;
+
+	if (proplen != len)
+		return -FDT_ERR_NOSPACE;
+
+	memcpy(propval, val, len);
+	return 0;
+}
+
+static void nop_region(void *start, int len)
+{
+	uint32_t *p;
+
+	for (p = start; (void *)p < (start + len); p++)
+		*p = cpu_to_fdt32(FDT_NOP);
+}
+
+int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
+{
+	struct fdt_property *prop;
+	int len;
+
+	prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
+	if (! prop)
+		return len;
+
+	nop_region(prop, len + sizeof(*prop));
+
+	return 0;
+}
+
+int _fdt_node_end_offset(void *fdt, int nodeoffset)
+{
+	int level = 0;
+	uint32_t tag;
+	int offset, nextoffset;
+
+	tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
+	if (tag != FDT_BEGIN_NODE)
+		return -FDT_ERR_BADOFFSET;
+	do {
+		offset = nextoffset;
+		tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+		switch (tag) {
+		case FDT_END:
+			return offset;
+
+		case FDT_BEGIN_NODE:
+			level++;
+			break;
+
+		case FDT_END_NODE:
+			level--;
+			break;
+
+		case FDT_PROP:
+		case FDT_NOP:
+			break;
+
+		default:
+			return -FDT_ERR_BADSTRUCTURE;
+		}
+	} while (level >= 0);
+
+	return nextoffset;
+}
+
+int fdt_nop_node(void *fdt, int nodeoffset)
+{
+	int endoffset;
+
+	endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+	if (endoffset < 0)
+		return endoffset;
+
+	nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), endoffset - nodeoffset);
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/fdt_wip.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+extern "C" {
+
+#include "fdt_wip.c"
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,1080 @@
+#ifndef _LIBFDT_H
+#define _LIBFDT_H
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "libfdt_env.h"
+#include "fdt.h"
+
+#define FDT_FIRST_SUPPORTED_VERSION	0x10
+#define FDT_LAST_SUPPORTED_VERSION	0x11
+
+/* Error codes: informative error codes */
+#define FDT_ERR_NOTFOUND	1
+	/* FDT_ERR_NOTFOUND: The requested node or property does not exist */
+#define FDT_ERR_EXISTS		2
+	/* FDT_ERR_EXISTS: Attemped to create a node or property which
+	 * already exists */
+#define FDT_ERR_NOSPACE		3
+	/* FDT_ERR_NOSPACE: Operation needed to expand the device
+	 * tree, but its buffer did not have sufficient space to
+	 * contain the expanded tree. Use fdt_open_into() to move the
+	 * device tree to a buffer with more space. */
+
+/* Error codes: codes for bad parameters */
+#define FDT_ERR_BADOFFSET	4
+	/* FDT_ERR_BADOFFSET: Function was passed a structure block
+	 * offset which is out-of-bounds, or which points to an
+	 * unsuitable part of the structure for the operation. */
+#define FDT_ERR_BADPATH		5
+	/* FDT_ERR_BADPATH: Function was passed a badly formatted path
+	 * (e.g. missing a leading / for a function which requires an
+	 * absolute path) */
+#define FDT_ERR_BADPHANDLE	6
+	/* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
+	 * value.  phandle values of 0 and -1 are not permitted. */
+#define FDT_ERR_BADSTATE	7
+	/* FDT_ERR_BADSTATE: Function was passed an incomplete device
+	 * tree created by the sequential-write functions, which is
+	 * not sufficiently complete for the requested operation. */
+
+/* Error codes: codes for bad device tree blobs */
+#define FDT_ERR_TRUNCATED	8
+	/* FDT_ERR_TRUNCATED: Structure block of the given device tree
+	 * ends without an FDT_END tag. */
+#define FDT_ERR_BADMAGIC	9
+	/* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
+	 * device tree at all - it is missing the flattened device
+	 * tree magic number. */
+#define FDT_ERR_BADVERSION	10
+	/* FDT_ERR_BADVERSION: Given device tree has a version which
+	 * can't be handled by the requested operation.  For
+	 * read-write functions, this may mean that fdt_open_into() is
+	 * required to convert the tree to the expected version. */
+#define FDT_ERR_BADSTRUCTURE	11
+	/* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
+	 * structure block or other serious error (e.g. misnested
+	 * nodes, or subnodes preceding properties). */
+#define FDT_ERR_BADLAYOUT	12
+	/* FDT_ERR_BADLAYOUT: For read-write functions, the given
+	 * device tree has it's sub-blocks in an order that the
+	 * function can't handle (memory reserve map, then structure,
+	 * then strings).  Use fdt_open_into() to reorganize the tree
+	 * into a form suitable for the read-write operations. */
+
+/* "Can't happen" error indicating a bug in libfdt */
+#define FDT_ERR_INTERNAL	13
+	/* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
+	 * Should never be returned, if it is, it indicates a bug in
+	 * libfdt itself. */
+
+#define FDT_ERR_MAX		13
+
+/**********************************************************************/
+/* Low-level functions (you probably don't need these)                */
+/**********************************************************************/
+
+const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
+static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
+{
+	return (void *)fdt_offset_ptr(fdt, offset, checklen);
+}
+
+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
+
+/**********************************************************************/
+/* General functions                                                  */
+/**********************************************************************/
+
+#define fdt_get_header(fdt, field) \
+	(fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
+#define fdt_magic(fdt) 			(fdt_get_header(fdt, magic))
+#define fdt_totalsize(fdt)		(fdt_get_header(fdt, totalsize))
+#define fdt_off_dt_struct(fdt)		(fdt_get_header(fdt, off_dt_struct))
+#define fdt_off_dt_strings(fdt)		(fdt_get_header(fdt, off_dt_strings))
+#define fdt_off_mem_rsvmap(fdt)		(fdt_get_header(fdt, off_mem_rsvmap))
+#define fdt_version(fdt)		(fdt_get_header(fdt, version))
+#define fdt_last_comp_version(fdt) 	(fdt_get_header(fdt, last_comp_version))
+#define fdt_boot_cpuid_phys(fdt) 	(fdt_get_header(fdt, boot_cpuid_phys))
+#define fdt_size_dt_strings(fdt) 	(fdt_get_header(fdt, size_dt_strings))
+#define fdt_size_dt_struct(fdt)		(fdt_get_header(fdt, size_dt_struct))
+
+#define __fdt_set_hdr(name) \
+	static inline void fdt_set_##name(void *fdt, uint32_t val) \
+	{ \
+	  struct fdt_header *fdth = (struct fdt_header *)fdt;	\
+	  fdth->name = cpu_to_fdt32(val); \
+	}
+
+__fdt_set_hdr(magic);
+__fdt_set_hdr(totalsize);
+__fdt_set_hdr(off_dt_struct);
+__fdt_set_hdr(off_dt_strings);
+__fdt_set_hdr(off_mem_rsvmap);
+__fdt_set_hdr(version);
+__fdt_set_hdr(last_comp_version);
+__fdt_set_hdr(boot_cpuid_phys);
+__fdt_set_hdr(size_dt_strings);
+__fdt_set_hdr(size_dt_struct);
+#undef __fdt_set_hdr
+
+/**
+ * fdt_check_header - sanity check a device tree or possible device tree
+ * @fdt: pointer to data which might be a flattened device tree
+ *
+ * fdt_check_header() checks that the given buffer contains what
+ * appears to be a flattened device tree with sane information in its
+ * header.
+ *
+ * returns:
+ *     0, if the buffer appears to contain a valid device tree
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE, standard meanings, as above
+ */
+int fdt_check_header(const void *fdt);
+
+/**
+ * fdt_move - move a device tree around in memory
+ * @fdt: pointer to the device tree to move
+ * @buf: pointer to memory where the device is to be moved
+ * @bufsize: size of the memory space at buf
+ *
+ * fdt_move() relocates, if possible, the device tree blob located at
+ * fdt to the buffer at buf of size bufsize.  The buffer may overlap
+ * with the existing device tree blob at fdt.  Therefore,
+ *     fdt_move(fdt, fdt, fdt_totalsize(fdt))
+ * should always succeed.
+ *
+ * returns:
+ *     0, on success
+ *     -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE, standard meanings
+ */
+int fdt_move(const void *fdt, void *buf, int bufsize);
+
+/**********************************************************************/
+/* Read-only functions                                                */
+/**********************************************************************/
+
+/**
+ * fdt_string - retreive a string from the strings block of a device tree
+ * @fdt: pointer to the device tree blob
+ * @stroffset: offset of the string within the strings block (native endian)
+ *
+ * fdt_string() retrieves a pointer to a single string from the
+ * strings block of the device tree blob at fdt.
+ *
+ * returns:
+ *     a pointer to the string, on success
+ *     NULL, if stroffset is out of bounds
+ */
+const char *fdt_string(const void *fdt, int stroffset);
+
+/**
+ * fdt_num_mem_rsv - retreive the number of memory reserve map entries
+ * @fdt: pointer to the device tree blob
+ *
+ * Returns the number of entries in the device tree blob's memory
+ * reservation map.  This does not include the terminating 0,0 entry
+ * or any other (0,0) entries reserved for expansion.
+ *
+ * returns:
+ *     the number of entries
+ */
+int fdt_num_mem_rsv(const void *fdt);
+
+/**
+ * fdt_get_mem_rsv - retreive one memory reserve map entry
+ * @fdt: pointer to the device tree blob
+ * @address, @size: pointers to 64-bit variables
+ *
+ * On success, *address and *size will contain the address and size of
+ * the n-th reserve map entry from the device tree blob, in
+ * native-endian format.
+ *
+ * returns:
+ *     0, on success
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE, standard meanings
+ */
+int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
+
+/**
+ * fdt_subnode_offset_namelen - find a subnode based on substring
+ * @fdt: pointer to the device tree blob
+ * @parentoffset: structure block offset of a node
+ * @name: name of the subnode to locate
+ * @namelen: number of characters of name to consider
+ *
+ * Identical to fdt_subnode_offset(), but only examine the first
+ * namelen characters of name for matching the subnode name.  This is
+ * useful for finding subnodes based on a portion of a larger string,
+ * such as a full path.
+ */
+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
+			       const char *name, int namelen);
+/**
+ * fdt_subnode_offset - find a subnode of a given node
+ * @fdt: pointer to the device tree blob
+ * @parentoffset: structure block offset of a node
+ * @name: name of the subnode to locate
+ *
+ * fdt_subnode_offset() finds a subnode of the node at structure block
+ * offset parentoffset with the given name.  name may include a unit
+ * address, in which case fdt_subnode_offset() will find the subnode
+ * with that unit address, or the unit address may be omitted, in
+ * which case fdt_subnode_offset() will find an arbitrary subnode
+ * whose name excluding unit address matches the given name.
+ *
+ * returns:
+ *	structure block offset of the requested subnode (>=0), on success
+ *	-FDT_ERR_NOTFOUND, if the requested subnode does not exist
+ *	-FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
+ *      -FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings.
+ */
+int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
+
+/**
+ * fdt_path_offset - find a tree node by its full path
+ * @fdt: pointer to the device tree blob
+ * @path: full path of the node to locate
+ *
+ * fdt_path_offset() finds a node of a given path in the device tree.
+ * Each path component may omit the unit address portion, but the
+ * results of this are undefined if any such path component is
+ * ambiguous (that is if there are multiple nodes at the relevant
+ * level matching the given component, differentiated only by unit
+ * address).
+ *
+ * returns:
+ *	structure block offset of the node with the requested path (>=0), on success
+ *	-FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
+ *	-FDT_ERR_NOTFOUND, if the requested node does not exist
+ *      -FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings.
+ */
+int fdt_path_offset(const void *fdt, const char *path);
+
+/**
+ * fdt_get_name - retreive the name of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: structure block offset of the starting node
+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
+ *
+ * fdt_get_name() retrieves the name (including unit address) of the
+ * device tree node at structure block offset nodeoffset.  If lenp is
+ * non-NULL, the length of this name is also returned, in the integer
+ * pointed to by lenp.
+ *
+ * returns:
+ *	pointer to the node's name, on success
+ *		If lenp is non-NULL, *lenp contains the length of that name (>=0)
+ *	NULL, on error
+ *		if lenp is non-NULL *lenp contains an error code (<0):
+ *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *		-FDT_ERR_BADMAGIC,
+ *		-FDT_ERR_BADVERSION,
+ *		-FDT_ERR_BADSTATE, standard meanings
+ */
+const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
+
+/**
+ * fdt_get_property - find a given property in a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to find
+ * @name: name of the property to find
+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
+ *
+ * fdt_get_property() retrieves a pointer to the fdt_property
+ * structure within the device tree blob corresponding to the property
+ * named 'name' of the node at offset nodeoffset.  If lenp is
+ * non-NULL, the length of the property value also returned, in the
+ * integer pointed to by lenp.
+ *
+ * returns:
+ *	pointer to the structure representing the property
+ *		if lenp is non-NULL, *lenp contains the length of the property
+ *		value (>=0)
+ *	NULL, on error
+ *		if lenp is non-NULL, *lenp contains an error code (<0):
+ *		-FDT_ERR_NOTFOUND, node does not have named property
+ *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *		-FDT_ERR_BADMAGIC,
+ *		-FDT_ERR_BADVERSION,
+ *		-FDT_ERR_BADSTATE,
+ *		-FDT_ERR_BADSTRUCTURE,
+ *		-FDT_ERR_TRUNCATED, standard meanings
+ */
+const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
+					    const char *name, int *lenp);
+static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
+						      const char *name,
+						      int *lenp)
+{
+	return (struct fdt_property *)fdt_get_property(fdt, nodeoffset,
+						       name, lenp);
+}
+
+/**
+ * fdt_getprop - retrieve the value of a given property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to find
+ * @name: name of the property to find
+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
+ *
+ * fdt_getprop() retrieves a pointer to the value of the property
+ * named 'name' of the node at offset nodeoffset (this will be a
+ * pointer to within the device blob itself, not a copy of the value).
+ * If lenp is non-NULL, the length of the property value also
+ * returned, in the integer pointed to by lenp.
+ *
+ * returns:
+ *	pointer to the property's value
+ *		if lenp is non-NULL, *lenp contains the length of the property
+ *		value (>=0)
+ *	NULL, on error
+ *		if lenp is non-NULL, *lenp contains an error code (<0):
+ *		-FDT_ERR_NOTFOUND, node does not have named property
+ *		-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *		-FDT_ERR_BADMAGIC,
+ *		-FDT_ERR_BADVERSION,
+ *		-FDT_ERR_BADSTATE,
+ *		-FDT_ERR_BADSTRUCTURE,
+ *		-FDT_ERR_TRUNCATED, standard meanings
+ */
+const void *fdt_getprop(const void *fdt, int nodeoffset,
+			const char *name, int *lenp);
+static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
+				  const char *name, int *lenp)
+{
+	return (void *)fdt_getprop(fdt, nodeoffset, name, lenp);
+}
+
+/**
+ * fdt_get_phandle - retreive the phandle of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: structure block offset of the node
+ *
+ * fdt_get_phandle() retrieves the phandle of the device tree node at
+ * structure block offset nodeoffset.
+ *
+ * returns:
+ *	the phandle of the node at nodeoffset, on succes (!= 0, != -1)
+ *	0, if the node has no phandle, or another error occurs
+ */
+uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
+
+/**
+ * fdt_get_path - determine the full path of a node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose path to find
+ * @buf: character buffer to contain the returned path (will be overwritten)
+ * @buflen: size of the character buffer at buf
+ *
+ * fdt_get_path() computes the full path of the node at offset
+ * nodeoffset, and records that path in the buffer at buf.
+ *
+ * NOTE: This function is expensive, as it must scan the device tree
+ * structure from the start to nodeoffset.
+ *
+ * returns:
+ *	0, on success
+ *		buf contains the absolute path of the node at
+ *		nodeoffset, as a NUL-terminated string.
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
+ *		characters and will not fit in the given buffer.
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
+
+/**
+ * fdt_supernode_atdepth_offset - find a specific ancestor of a node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose parent to find
+ * @supernodedepth: depth of the ancestor to find
+ * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
+ *
+ * fdt_supernode_atdepth_offset() finds an ancestor of the given node
+ * at a specific depth from the root (where the root itself has depth
+ * 0, its immediate subnodes depth 1 and so forth).  So
+ *	fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
+ * will always return 0, the offset of the root node.  If the node at
+ * nodeoffset has depth D, then:
+ *	fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
+ * will return nodeoffset itself.
+ *
+ * NOTE: This function is expensive, as it must scan the device tree
+ * structure from the start to nodeoffset.
+ *
+ * returns:
+
+ *	structure block offset of the node at node offset's ancestor
+ *		of depth supernodedepth (>=0), on success
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+*	-FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
+				 int supernodedepth, int *nodedepth);
+
+/**
+ * fdt_node_depth - find the depth of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose parent to find
+ *
+ * fdt_node_depth() finds the depth of a given node.  The root node
+ * has depth 0, its immediate subnodes depth 1 and so forth.
+ *
+ * NOTE: This function is expensive, as it must scan the device tree
+ * structure from the start to nodeoffset.
+ *
+ * returns:
+ *	depth of the node at nodeoffset (>=0), on success
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_node_depth(const void *fdt, int nodeoffset);
+
+/**
+ * fdt_parent_offset - find the parent of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose parent to find
+ *
+ * fdt_parent_offset() locates the parent node of a given node (that
+ * is, it finds the offset of the node which contains the node at
+ * nodeoffset as a subnode).
+ *
+ * NOTE: This function is expensive, as it must scan the device tree
+ * structure from the start to nodeoffset, *twice*.
+ *
+ * returns:
+ *	stucture block offset of the parent of the node at nodeoffset
+ *		(>=0), on success
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_parent_offset(const void *fdt, int nodeoffset);
+
+/**
+ * fdt_node_offset_by_prop_value - find nodes with a given property value
+ * @fdt: pointer to the device tree blob
+ * @startoffset: only find nodes after this offset
+ * @propname: property name to check
+ * @propval: property value to search for
+ * @proplen: length of the value in propval
+ *
+ * fdt_node_offset_by_prop_value() returns the offset of the first
+ * node after startoffset, which has a property named propname whose
+ * value is of length proplen and has value equal to propval; or if
+ * startoffset is -1, the very first such node in the tree.
+ *
+ * To iterate through all nodes matching the criterion, the following
+ * idiom can be used:
+ *	offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
+ *					       propval, proplen);
+ *	while (offset != -FDT_ERR_NOTFOUND) {
+ *		// other code here
+ *		offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
+ *						       propval, proplen);
+ *	}
+ *
+ * Note the -1 in the first call to the function, if 0 is used here
+ * instead, the function will never locate the root node, even if it
+ * matches the criterion.
+ *
+ * returns:
+ *	structure block offset of the located node (>= 0, >startoffset),
+ *		 on success
+ *	-FDT_ERR_NOTFOUND, no node matching the criterion exists in the
+ *		tree after startoffset
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
+				  const char *propname,
+				  const void *propval, int proplen);
+
+/**
+ * fdt_node_offset_by_phandle - find the node with a given phandle
+ * @fdt: pointer to the device tree blob
+ * @phandle: phandle value
+ *
+ * fdt_node_offset_by_prop_value() returns the offset of the node
+ * which has the given phandle value.  If there is more than one node
+ * in the tree with the given phandle (an invalid tree), results are
+ * undefined.
+ *
+ * returns:
+ *	structure block offset of the located node (>= 0), on success
+ *	-FDT_ERR_NOTFOUND, no node with that phandle exists
+ *	-FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
+
+/**
+ * fdt_node_check_compatible: check a node's compatible property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of a tree node
+ * @compatible: string to match against
+ *
+ *
+ * fdt_node_check_compatible() returns 0 if the given node contains a
+ * 'compatible' property with the given string as one of its elements,
+ * it returns non-zero otherwise, or on error.
+ *
+ * returns:
+ *	0, if the node has a 'compatible' property listing the given string
+ *	1, if the node has a 'compatible' property, but it does not list
+ *		the given string
+ *	-FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
+ * 	-FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_node_check_compatible(const void *fdt, int nodeoffset,
+			      const char *compatible);
+
+/**
+ * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
+ * @fdt: pointer to the device tree blob
+ * @startoffset: only find nodes after this offset
+ * @compatible: 'compatible' string to match against
+ *
+ * fdt_node_offset_by_compatible() returns the offset of the first
+ * node after startoffset, which has a 'compatible' property which
+ * lists the given compatible string; or if startoffset is -1, the
+ * very first such node in the tree.
+ *
+ * To iterate through all nodes matching the criterion, the following
+ * idiom can be used:
+ *	offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
+ *	while (offset != -FDT_ERR_NOTFOUND) {
+ *		// other code here
+ *		offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
+ *	}
+ *
+ * Note the -1 in the first call to the function, if 0 is used here
+ * instead, the function will never locate the root node, even if it
+ * matches the criterion.
+ *
+ * returns:
+ *	structure block offset of the located node (>= 0, >startoffset),
+ *		 on success
+ *	-FDT_ERR_NOTFOUND, no node matching the criterion exists in the
+ *		tree after startoffset
+ * 	-FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE, standard meanings
+ */
+int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
+				  const char *compatible);
+
+/**********************************************************************/
+/* Write-in-place functions                                           */
+/**********************************************************************/
+
+/**
+ * fdt_setprop_inplace - change a property's value, but not its size
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @val: pointer to data to replace the property value with
+ * @len: length of the property value
+ *
+ * fdt_setprop_inplace() replaces the value of a given property with
+ * the data in val, of length len.  This function cannot change the
+ * size of a property, and so will only work if len is equal to the
+ * current length of the property.
+ *
+ * This function will alter only the bytes in the blob which contain
+ * the given property value, and will not alter or move any other part
+ * of the tree.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, if len is not equal to the property's current length
+ *	-FDT_ERR_NOTFOUND, node does not have the named property
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+			const void *val, int len);
+
+/**
+ * fdt_setprop_inplace_cell - change the value of a single-cell property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @val: cell (32-bit integer) value to replace the property with
+ *
+ * fdt_setprop_inplace_cell() replaces the value of a given property
+ * with the 32-bit integer cell value in val, converting val to
+ * big-endian if necessary.  This function cannot change the size of a
+ * property, and so will only work if the property already exists and
+ * has length 4.
+ *
+ * This function will alter only the bytes in the blob which contain
+ * the given property value, and will not alter or move any other part
+ * of the tree.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, if the property's length is not equal to 4
+  *	-FDT_ERR_NOTFOUND, node does not have the named property
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
+					   const char *name, uint32_t val)
+{
+	val = cpu_to_fdt32(val);
+	return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
+}
+
+/**
+ * fdt_nop_property - replace a property with nop tags
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to nop
+ * @name: name of the property to nop
+ *
+ * fdt_nop_property() will replace a given property's representation
+ * in the blob with FDT_NOP tags, effectively removing it from the
+ * tree.
+ *
+ * This function will alter only the bytes in the blob which contain
+ * the property, and will not alter or move any other part of the
+ * tree.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOTFOUND, node does not have the named property
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
+
+/**
+ * fdt_nop_node - replace a node (subtree) with nop tags
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node to nop
+ *
+ * fdt_nop_node() will replace a given node's representation in the
+ * blob, including all its subnodes, if any, with FDT_NOP tags,
+ * effectively removing it from the tree.
+ *
+ * This function will alter only the bytes in the blob which contain
+ * the node and its properties and subnodes, and will not alter or
+ * move any other part of the tree.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_nop_node(void *fdt, int nodeoffset);
+
+/**********************************************************************/
+/* Sequential write functions                                         */
+/**********************************************************************/
+
+int fdt_create(void *buf, int bufsize);
+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
+int fdt_finish_reservemap(void *fdt);
+int fdt_begin_node(void *fdt, const char *name);
+int fdt_property(void *fdt, const char *name, const void *val, int len);
+static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
+{
+	val = cpu_to_fdt32(val);
+	return fdt_property(fdt, name, &val, sizeof(val));
+}
+#define fdt_property_string(fdt, name, str) \
+	fdt_property(fdt, name, str, strlen(str)+1)
+int fdt_end_node(void *fdt);
+int fdt_finish(void *fdt);
+
+/**********************************************************************/
+/* Read-write functions                                               */
+/**********************************************************************/
+
+int fdt_open_into(const void *fdt, void *buf, int bufsize);
+int fdt_pack(void *fdt);
+
+/**
+ * fdt_add_mem_rsv - add one memory reserve map entry
+ * @fdt: pointer to the device tree blob
+ * @addres, @size: 64-bit values (native endian)
+ *
+ * Adds a reserve map entry to the given blob reserving a region at
+ * address address of length size.
+ *
+ * This function will insert data into the reserve map and will
+ * therfore change the indexes of some entries in the table.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+ *		contain the new reservation entry
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
+
+/**
+ * fdt_del_mem_rsv - remove a memory reserve map entry
+ * @fdt: pointer to the device tree blob
+ * @n: entry to remove
+ *
+ * fdt_del_mem_rsv() removes the n-th memory reserve map entry from
+ * the blob.
+ *
+ * This function will delete data from the reservation table and will
+ * therfore change the indexes of some entries in the table.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there
+ *		are less than n+1 reserve map entries)
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_del_mem_rsv(void *fdt, int n);
+
+/**
+ * fdt_set_name - change the name of a given node
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: structure block offset of a node
+ * @name: name to give the node
+ *
+ * fdt_set_name() replaces the name (including unit address, if any)
+ * of the given node with the given string.  NOTE: this function can't
+ * efficiently check if the new name is unique amongst the given
+ * node's siblings; results are undefined if this function is invoked
+ * with a name equal to one of the given node's siblings.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob
+ *		to contain the new name
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE, standard meanings
+ */
+int fdt_set_name(void *fdt, int nodeoffset, const char *name);
+
+/**
+ * fdt_setprop - create or change a property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @val: pointer to data to set the property value to
+ * @len: length of the property value
+ *
+ * fdt_setprop() sets the value of the named property in the given
+ * node to the given value and length, creeating the property if it
+ * does not already exist.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+ *		contain the new property value
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+		const void *val, int len);
+
+/**
+ * fdt_setprop_cell - set a property to a single cell value
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @val: 32-bit integer value for the property (native endian)
+ *
+ * fdt_setprop_cell() sets the value of the named property in the
+ * given node to the given cell value (converting to big-endian if
+ * necessary), or creates a new property with that value if it does
+ * not already exist.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+ *		contain the new property value
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
+				   uint32_t val)
+{
+	val = cpu_to_fdt32(val);
+	return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
+}
+
+/**
+ * fdt_setprop_string - set a property to a string value
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @str: string value for the property
+ *
+ * fdt_setprop_string() sets the value of the named property in the
+ * given node to the given string value (using the length of the
+ * string to determine the new length of the property), or creates a
+ * new property with that value if it does not already exist.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+ *		contain the new property value
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+#define fdt_setprop_string(fdt, nodeoffset, name, str) \
+	fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
+
+/**
+ * fdt_delprop - delete a property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to nop
+ * @name: name of the property to nop
+ *
+ * fdt_del_property() will delete the given property.
+ *
+ * This function will delete data from the blob, and will therefore
+ * change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_NOTFOUND, node does not have the named property
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_delprop(void *fdt, int nodeoffset, const char *name);
+
+/**
+ * fdt_add_subnode_namelen - creates a new node based on substring
+ * @fdt: pointer to the device tree blob
+ * @parentoffset: structure block offset of a node
+ * @name: name of the subnode to locate
+ * @namelen: number of characters of name to consider
+ *
+ * Identical to fdt_add_subnode(), but use only the first namelen
+ * characters of name as the name of the new node.  This is useful for
+ * creating subnodes based on a portion of a larger string, such as a
+ * full path.
+ */
+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+			    const char *name, int namelen);
+
+/**
+ * fdt_add_subnode - creates a new node
+ * @fdt: pointer to the device tree blob
+ * @parentoffset: structure block offset of a node
+ * @name: name of the subnode to locate
+ *
+ * fdt_add_subnode() creates a new node as a subnode of the node at
+ * structure block offset parentoffset, with the given name (which
+ * should include the unit address, if any).
+ *
+ * This function will insert data into the blob, and will therefore
+ * change the offsets of some existing nodes.
+
+ * returns:
+ *	structure block offset of the created nodeequested subnode (>=0), on success
+ *	-FDT_ERR_NOTFOUND, if the requested subnode does not exist
+ *	-FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
+ *	-FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
+ *		the given name
+ *	-FDT_ERR_NOSPACE, if there is insufficient free space in the
+ *		blob to contain the new node
+ *	-FDT_ERR_NOSPACE
+ *	-FDT_ERR_BADLAYOUT
+ *      -FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings.
+ */
+int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
+
+/**
+ * fdt_del_node - delete a node (subtree)
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node to nop
+ *
+ * fdt_del_node() will remove the given node, including all its
+ * subnodes if any, from the blob.
+ *
+ * This function will delete data from the blob, and will therefore
+ * change the offsets of some existing nodes.
+ *
+ * returns:
+ *	0, on success
+ *	-FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *	-FDT_ERR_BADLAYOUT,
+ *	-FDT_ERR_BADMAGIC,
+ *	-FDT_ERR_BADVERSION,
+ *	-FDT_ERR_BADSTATE,
+ *	-FDT_ERR_BADSTRUCTURE,
+ *	-FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_del_node(void *fdt, int nodeoffset);
+
+/**********************************************************************/
+/* Debugging / informational functions                                */
+/**********************************************************************/
+
+const char *fdt_strerror(int errval);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LIBFDT_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt_env.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,21 @@
+#ifndef _LIBFDT_ENV_H
+#define _LIBFDT_ENV_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include "bswap.h"
+
+#ifdef WORDS_BIGENDIAN
+#define fdt32_to_cpu(x)		(x)
+#define cpu_to_fdt32(x)		(x)
+#define fdt64_to_cpu(x)		(x)
+#define cpu_to_fdt64(x)		(x)
+#else
+#define fdt32_to_cpu(x)		(bswap_32((x)))
+#define cpu_to_fdt32(x)		(bswap_32((x)))
+#define fdt64_to_cpu(x)		(bswap_64((x)))
+#define cpu_to_fdt64(x)		(bswap_64((x)))
+#endif
+
+#endif /* _LIBFDT_ENV_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/libfdt_internal.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,89 @@
+#ifndef _LIBFDT_INTERNAL_H
+#define _LIBFDT_INTERNAL_H
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU 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 General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public
+ *     License along with this library; if not, write to the Free
+ *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ *     MA 02110-1301 USA
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <fdt.h>
+
+#define ALIGN(x, a)	(((x) + (a) - 1) & ~((a) - 1))
+#define PALIGN(p, a)	((void *)ALIGN((unsigned long)(p), (a)))
+
+#define memeq(p, q, n)	(memcmp((p), (q), (n)) == 0)
+#define streq(p, q)	(strcmp((p), (q)) == 0)
+
+uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
+int _fdt_node_end_offset(void *fdt, int nodeoffset);
+
+static inline const void *_fdt_offset_ptr(const void *fdt, int offset)
+{
+	return fdt + fdt_off_dt_struct(fdt) + offset;
+}
+
+static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
+{
+	return (void *)_fdt_offset_ptr(fdt, offset);
+}
+
+static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n)
+{
+	const struct fdt_reserve_entry *rsv_table =
+		fdt + fdt_off_mem_rsvmap(fdt);
+
+	return rsv_table + n;
+}
+static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
+{
+	return (void *)_fdt_mem_rsv(fdt, n);
+}
+
+#define SW_MAGIC		(~FDT_MAGIC)
+
+#endif /* _LIBFDT_INTERNAL_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpplatform/libfdt/patch.libfdt	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,20 @@
+Minor changes are required to get libfdt to build as part of qemu.
+The patch below records modifications relative to upstream dtc-v1.2.0.
+
+Index: libfdt_env.h
+===================================================================
+--- libfdt_env.h	(revision 230023)
++++ libfdt_env.h	(working copy)
+@@ -4,10 +4,9 @@
+ #include <stddef.h>
+ #include <stdint.h>
+ #include <string.h>
+-#include <endian.h>
+-#include <byteswap.h>
++#include "bswap.h"
+ 
+-#if __BYTE_ORDER == __BIG_ENDIAN
++#ifdef WORDS_BIGENDIAN
+ #define fdt32_to_cpu(x)		(x)
+ #define cpu_to_fdt32(x)		(x)
+ #define fdt64_to_cpu(x)		(x)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/snapapp.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+TARGET         snapapp.exe
+TARGETTYPE	   EXE
+SOURCEPATH	   src
+SOURCE         snapapp.cpp rsvpsnapdriver.cpp
+LIBRARY        euser.lib efsrv.lib
+SYSTEMINCLUDE  /epoc32/include 
+
+CAPABILITY		TCB DISKADMIN ALLFILES
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/rsvpsnapdriver.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <e32std.h>    // for User::
+#include "rsvpsnapdriver.h"
+
+//#define SVPDBG
+#ifdef SVPDBG
+#include <e32debug.h>
+#define DP(format...) RDebug::Printf(format)
+#else
+#define DP(format...)
+#endif
+
+TInt RSVPSnapDriver::Open(void)
+{
+  DP("** RSVPSnapDriver::Open()");
+
+  const TVersion ver = TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
+
+  return DoCreate(KSVPSnapDriverName,
+				  ver,
+				  KNullUnit,
+				  NULL,
+				  NULL);
+}
+
+TInt RSVPSnapDriver::SaveVM(const TDesC8& aData)
+{
+  DP("** RSVPSnapDriver::SaveVM");
+  
+  //DP("** RSVPSnapDriver::SaveVM: - length of data=%d", length);
+  //DP("** RSVPSnapDriver::SaveVM: - aName= %s", name.Ptr());
+	
+  return DoSVPRequest(ESaveVM,(TAny*)&aData);
+ }
+
+TInt RSVPSnapDriver::LoadVM(const TDesC8& aData)
+{
+  DP("** RSVPSnapDriver::LoadVM");
+  return DoSVPRequest(ELoadVM,(TAny*)&aData);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/rsvpsnapdriver.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __RSVPSNAPDRIVER_H
+#define __RSVPSNAPDRIVER_H
+
+#include <e32cmn.h>    // for RBusLogicalChannel
+
+class TCapsSVPSnapDriver
+{
+public:
+	TVersion	iVersion;
+};
+
+_LIT(KSVPSnapDriverName,"SVP Snapshot Driver");
+_LIT(KSVPSnapDriverLDD, "svpsnapdriver.ldd");
+
+// Version information
+const TInt KMajorVersionNumber=0;
+const TInt KMinorVersionNumber=0;
+const TInt KBuildVersionNumber=1;
+
+class RSVPSnapDriver : public RBusLogicalChannel
+{
+ public:
+  enum TControl
+	{
+	  EDummy = 0,
+	  ESaveVM,
+	  ELoadVM
+	};
+
+ public:
+#ifndef __KERNEL_MODE__
+  TInt Open(void);
+  TInt SaveVM(const TDesC8& aData);
+  TInt LoadVM(const TDesC8& aData);
+
+private:
+  inline TInt DoSVPRequest(TInt aReqNo, TAny * a1) 
+  {
+	TRequestStatus status;
+	DoRequest(aReqNo, status, a1);
+	User::WaitForRequest(status);
+	return status.Int();
+  }
+#endif
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/snapapp.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <e32base.h>   // CTrapCleanup
+
+#include "rsvpsnapdriver.h"
+
+#define SVPDBG
+#ifdef SVPDBG
+#include <e32debug.h>
+#define DP(format...) RDebug::Printf(format)
+#else
+#define DP(format...)
+#endif
+
+_LIT8(KTestSendData,"kalle");
+
+GLDEF_C TInt E32Main()
+{
+  DP("** (SNAPAPP) E32Main()");
+
+  //  CTrapCleanup* cleanup;
+  //  cleanup=CTrapCleanup::New();
+  //  __UHEAP_MARK;
+
+#if 0
+  TInt err = User::LoadLogicalDevice(KSVPSnapDriverLDD);
+  if (err==KErrAlreadyExists)
+	DP("KErrAlreadyExists");
+#endif
+  
+  RSVPSnapDriver drv;
+  TInt err = drv.Open();
+  
+#if 1
+  if (err==KErrNone)
+	  {
+	  
+	drv.SaveVM(KTestSendData);
+	  }
+  else
+	DP("Error");
+#else
+  drv.LoadVM(KTestSendData);   // Will never return
+#endif
+  
+  //  __UHEAP_MARKEND;
+  //  delete cleanup;
+  return(KErrNone);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/svpsnapdriver.cpp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,247 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "svpsnapdriver.h"
+#include "rsvpsnapdriver.h"
+#include "system.h"
+
+static inline TUint32 ReadReg(ESVPSnapReg aReg)
+{
+  DP("** (SVPSNAPDRIVER) ReadReg(%d)",aReg);
+
+	return *(volatile TUint32 *)(KHwSVPSnapDevice + (aReg << 2));
+}
+
+static inline void WriteReg(ESVPSnapReg aReg, TUint32 aVal)
+{
+  DP("** (SVPSNAPDRIVER) WriteReg(%d,%d)",aReg,aVal);
+
+  *(volatile TUint32*)(KHwSVPSnapDevice + (aReg << 2)) = aVal;
+}
+
+//
+// DSVPSnapDriverFactory
+//
+
+DSVPSnapDriverFactory::DSVPSnapDriverFactory()
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapDriverFactory::DSVPSnapDriverFactory()");
+
+  iVersion = TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);    
+}
+
+TInt DSVPSnapDriverFactory::Create(DLogicalChannelBase*& aChannel)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapDriverFactory::Create()");
+	
+#if 0
+  if (iOpenChannels != 0)
+	return KErrInUse; // a channel is already open
+#endif
+	
+	aChannel = new DSVPSnapChannel(this);
+	
+	return aChannel ? KErrNone : KErrNoMemory;
+}
+
+TInt DSVPSnapDriverFactory::Install()
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapDriverFactory::Install()");
+
+  return(SetName(&KSVPSnapDriverName));
+}
+
+void DSVPSnapDriverFactory::GetCaps(TDes8& aDes) const
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapDriverFactory::GetCaps()");
+
+  TCapsSVPSnapDriver b;
+  b.iVersion = TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber);
+  aDes.FillZ(aDes.MaxLength());
+  aDes.Copy((TUint8 *)&b, Min(aDes.MaxLength(), sizeof(b)));
+}
+
+//
+// DSVPSnapChannel
+//
+
+DSVPSnapChannel::DSVPSnapChannel(DLogicalDevice* aLogicalDevice)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DSVPSnapChannel()");
+
+  iDevice = aLogicalDevice;
+  
+  iClientThread = &Kern::CurrentThread();
+  iClientThread->Open();
+}
+
+DSVPSnapChannel::~DSVPSnapChannel()
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::~DSVPSnapChannel() ->");
+  Kern::SafeClose((DObject*&)iClientThread, NULL);
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::~DSVPSnapChannel() <-");
+}
+
+TInt DSVPSnapChannel::DoCreate(TInt /*aUnit*/, const TDesC* anInfo, const TVersion& aVer)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoCreate()");
+
+  if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), aVer))
+	return KErrNotSupported; 
+		       
+  //Setup the driver for receiving client messages
+  SetDfcQ(Kern::DfcQue0());
+  iMsgQ.Receive();  	
+
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoCreate()- checking device");
+  TUint id = ReadReg(ESnapshot_Id);
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoCreate()- checked device- 0x%08x", id);
+  WriteReg(ESnapshot_Address, 0);
+  return KErrNone;
+}
+
+void DSVPSnapChannel::DoCancel(TInt aReqNo)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoCancel() %x(%d)", aReqNo, aReqNo);
+}
+
+TInt DSVPSnapChannel::DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoRequest() %x(%d)", aReqNo, aReqNo);
+
+  TInt err = KErrGeneral;         
+
+  switch(aReqNo)
+	{
+	case RSVPSnapDriver::ESaveVM:
+	  	  DP("RSVPSnapDriver::ESaveVM");
+	  	  err = SaveVM((const TDesC8*)a1);
+	  break;
+	case RSVPSnapDriver::ELoadVM:
+	  	 DP("RSVPSnapDriver::ELoadVM");
+	  	 err= LoadVM((const TDesC8*)a1);
+	  break;
+	default:
+	  	  DP("default");
+	  err = KErrGeneral;
+	  break;
+	}
+	
+  if (KErrNone != err)
+	DP("** (SVPSNAPDRIVER) Error %d from DoRequest", err);
+	
+  return err;
+}
+
+TInt DSVPSnapChannel::DoControl(TInt aFunction, TAny* a1, TAny* a2)
+{
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::DoControl(%d)", aFunction);
+
+  TInt err = KErrGeneral;         
+  /* There should be a good reason to use a control rather than a request. */
+
+  if (KErrNone != err) {
+	DP("** (SVPSNAPDRIVER) Error %d from control function", err);
+  }
+	
+  return err;
+}
+
+void DSVPSnapChannel::HandleMsg(TMessageBase* aMsg)
+{
+	
+  TThreadMessage& m = *(TThreadMessage*)aMsg;
+  TInt id = m.iValue;
+  
+  DP("** (SVPSNAPDRIVER) DSVPSnapChannel::HandleMsg() %x(%d)", id, id);
+
+  if (id == (TInt)ECloseMsg)
+	{
+	  m.Complete(KErrNone, EFalse); 
+	  return;
+	}
+  if (id == KMaxTInt)
+	{
+	  // DoCancel
+	  DoCancel(m.Int0());
+	  m.Complete(KErrNone, ETrue); 
+	  return;
+	}
+  if (id < 0)
+	{
+	  // DoRequest
+	  TRequestStatus* pStatus = (TRequestStatus*)m.Ptr0();
+	  TInt r = DoRequest(~id, pStatus, m.Ptr1(), m.Ptr2());
+	  //	  if (r != KErrNone)
+	  Kern::RequestComplete(iClientThread,pStatus,r);
+	  m.Complete(KErrNone, ETrue);
+	}
+  else
+	{
+	  // DoControl
+	  TInt r = DoControl(id, m.Ptr0(), m.Ptr1());
+	  m.Complete(r, ETrue);
+	}
+}
+
+TInt DSVPSnapChannel::SaveVM(const TDesC8* aData)
+{
+  DP("** DSVPSnapChannel::SaveVM()");
+   
+  TInt err = KErrNone; 
+  RET_IF_ERROR(err, Kern::ThreadDesRead(iClientThread, aData, iSendDataBuffer,0));
+  TUint32 * ptr = (TUint32*) iSendDataBuffer.Ptr();
+  
+  WriteReg(ESnapshot_Address, Epoc::LinearToPhysical((TUint32)ptr));
+  WriteReg(ESnapshot_Length, (TUint32) (iSendDataBuffer.Length()));
+  WriteReg(ESnapshot_Trigger, RSVPSnapDriver::ESaveVM);
+  
+  return err;
+}
+
+TInt DSVPSnapChannel::LoadVM(const TDesC8* aData)
+{
+  DP("** DSVPSnapChannel::LoadVM()");  
+
+  TInt err = KErrNone; 
+  RET_IF_ERROR(err, Kern::ThreadDesRead(iClientThread, aData, iSendDataBuffer,0));
+  
+  TUint32 * ptr = (TUint32*) iSendDataBuffer.Ptr();  
+  WriteReg(ESnapshot_Address, Epoc::LinearToPhysical((TUint32)ptr));
+  
+  return ReadReg(ESnapshot_Address);
+}
+
+DECLARE_EXTENSION_LDD()
+{
+  // FIXME: Not needed?
+  DP("** (SVPSNAPDRIVER) DSVPSnapDriverFactory created");
+  return new DSVPSnapDriverFactory;
+}
+
+DECLARE_STANDARD_EXTENSION()
+{
+  DP("** (SVPSNAPDRIVER) SVPSnap extension entry point");
+  TInt r;
+  DSVPSnapDriverFactory* device = new DSVPSnapDriverFactory;
+  if (device==NULL)
+	r=KErrNoMemory;
+  else
+	r=Kern::InstallLogicalDevice(device);
+  
+  return r;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/src/svpsnapdriver.h	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SVPSNAPDRIVER_H
+#define __SVPSNAPDRIVER_H
+
+#include <kernel.h>    // for DLogicalChannel
+
+#define SVPDBG
+#ifdef SVPDBG
+#define DP(format...) Kern::Printf(format)
+#else
+#define DP(format...)
+#endif
+
+#define RET_IF_ERROR(v, e) { if ((v = (e)) != KErrNone) return v; }
+
+enum ESVPSnapReg {
+	ESnapshot_Id = 0,
+	ESnapshot_Address,
+    ESnapshot_Length,
+    ESnapshot_Trigger
+  };
+
+class DSVPSnapDriverFactory : public DLogicalDevice
+{
+ public:
+
+  DSVPSnapDriverFactory();
+  virtual TInt Install();
+  virtual void GetCaps(TDes8& aDes) const;
+  virtual TInt Create(DLogicalChannelBase*& aChannel);
+};
+
+class DSVPSnapChannel : public DLogicalChannel
+{
+ public:
+
+  DSVPSnapChannel(DLogicalDevice* aLogicalDevice);
+  ~DSVPSnapChannel();
+  
+  virtual TInt DoCreate(TInt aUnit, const TDesC* anInfo, const TVersion& aVer);	
+  virtual void HandleMsg(TMessageBase* aMsg);
+	
+ protected:
+  virtual void DoCancel(TInt aReqNo);
+  virtual TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
+  virtual TInt DoControl(TInt aFunction, TAny *a1, TAny *a2);
+
+ private:
+  TInt SaveVM(const TDesC8* aData);
+  TInt LoadVM(const TDesC8* aData);
+  
+private:
+  DThread* iClientThread;
+  TDfcQue* iDFCQue;
+  
+  TBuf8<256> iSendDataBuffer;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/svpsnapdriver/svpsnapdriver.mmp	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+//macro	__KERNEL_MODE__
+
+#include <variant.mmh>
+#include   <kernel\kern_ext.mmh>
+
+systeminclude		AsspNKernIncludePath
+
+systeminclude		src
+
+target			VariantTarget(svpsnapdriver,ldd)
+linkas			svpsnapdriver.ldd
+targettype		ldd
+
+sourcepath		src
+source			svpsnapdriver.cpp
+
+noexportlibrary
+
+vendorid 		0x70000001
+capability		all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/syborg-elf.cfg	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+input = syborg_001.techview.img
+logfile = syborg_001.techview.log
+output = syborg_001.techview.elf
+physical-address =  0x00000000 
+drive = X:
Binary file baseport/src/cedar/generic/base/syborg/syborg.dtb has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/syborg.dts	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,122 @@
+/ {
+    #address-cells = <1>;
+    #size-cells  = <1>;
+
+    cpus {
+        #address-cells = <1>;
+        #size-cells = <0>;
+        cpu0: ARM,Cortex-A8@0 {
+            device_type = "cpu";
+            reg = <0>;
+        };
+    };
+    memory@0 {
+        device_type = "memory";
+        reg = <0 08000000>;
+    };
+    syborg {
+        #address-cells = <1>;
+        #size-cells = <0>;
+        intc: intc@0 {
+            compatible = "syborg,interrupt";
+            #interrupt-cells = <1>;
+            reg = <c0000000>;
+            interrupt-controller;
+            qemu,interrupts = <&cpu0 0>;
+            num-interrupts = <20>;
+        };
+        rtc@0 {
+            compatible = "syborg,rtc";
+            reg = <c0001000>;
+        };
+        timer@0 {
+            compatible = "syborg,timer";
+            reg = <c0002000>;
+            frequency = <d#1000000>;
+            interrupts = <1>;
+            interrupt-parent = <&intc>;
+        };
+        keyboard@0 {
+            compatible = "syborg,keyboard";
+            reg = <c0003000>;
+            interrupts = <2>;
+            interrupt-parent = <&intc>;
+        };
+        touchscreen@0 {
+            compatible = "syborg,pointer";
+            reg = <c0004000>;
+            interrupts = <3>;
+            interrupt-parent = <&intc>;
+        };
+        framebuffer@0 {
+            compatible = "syborg,framebuffer";
+            reg = <c0005000>;
+            interrupts = <4>;
+            interrupt-parent = <&intc>;
+        };
+        serial@0 {
+            device_type = "serial";
+            compatible = "syborg,serial";
+            chardev = "serial0";
+            reg = <c0006000>;
+            interrupts = <5>;
+            interrupt-parent = <&intc>;
+        };
+        serial@1 {
+            device_type = "serial";
+            compatible = "syborg,serial";
+            chardev = "serial1";
+            reg = <c0007000>;
+            interrupts = <6>;
+            interrupt-parent = <&intc>;
+        };
+        serial@2 {
+            device_type = "serial";
+            compatible = "syborg,serial";
+            chardev = "serial2";
+            reg = <c0008000>;
+            interrupts = <7>;
+            interrupt-parent = <&intc>;
+        };
+        serial@3 {
+            device_type = "serial";
+            compatible = "syborg,serial";
+            chardev = "serial3";
+            reg = <c0009000>;
+            interrupts = <8>;
+            interrupt-parent = <&intc>;
+        };
+        hostfs@0 {
+            compatible = "syborg,hostfs";
+            reg = <c000a000>;
+	    host-path = "\\svphostfs\\";
+	    drive-number = <d#19>;
+        };
+        ss@0 {
+            compatible = "syborg,snapshot";
+            reg = <c000b000>;
+        };
+        net@0 {
+            compatible = "syborg,virtio-net";
+            reg = <c000c000>;
+            interrupts = <9>;
+            interrupt-parent = <&intc>;
+        };
+        nand@0 {
+            compatible = "syborg,nand";
+            reg = <c000d000>;
+            size = <400>;
+        };
+        audio@0 {
+            compatible = "syborg,virtio-audio";
+            reg = <c000e000>;
+            interrupts = <a>;
+            interrupt-parent = <&intc>;
+        };
+        platform@0 {
+            compatible = "syborg,platform";
+            reg = <c000f000>;
+        };
+    };
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/syborg.oby	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __SYBORG_OBY__
+#define __SYBORG_OBY__
+
+define LANGID 01
+define BUILDNO 0
+define VERSION 0.01
+
+DEFAULT_LANGUAGE 01
+
+REM #undef  _ARM4
+REM #define _ARM4
+
+#define __SYBORG__
+#define	__ARM_HW_PLATFORM__
+#define SYMBIAN_EXCLUDE_MTP
+
+define SYBORG_L1		0x0b0a0001
+define VARIANT			syborg
+define VARID			SYBORG_L1
+define ASSP_DIR			EPOCROOT##epoc32\release\syborg
+define ROMMEGS			15		/* !! HEX !! */
+define PLATFORM_NAME		syborg
+
+#define COLOR
+
+REM defines for IrDA options
+REM Uncomment the line below to enable IrDA to use a Jeteye ESI09680 pod with serial card adapter
+REM #define _ENABLE_IRDA_POD_
+REM define which port IrDA uses
+define IRPOD_ESK irda_port1.esk
+
+REM define which serial port Bluetooth protocol uses
+define BLUETOOTH_ESK bt_port2.esk
+
+REM Define whether or not to include USB client support:
+//#define EUSBC
+
+ROMBUILD_OPTION -no-header 
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/test/ABLD.BAT	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,15 @@
+@ECHO OFF
+
+REM Bldmake-generated batch file - ABLD.BAT
+REM ** DO NOT EDIT **
+
+perl -S ABLD.PL "\src\cedar\generic\base\syborg\test\\" %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/test/autoexec.bat	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,5 @@
+z:
+cd test
+rem runtests e32test.auto.bat
+rem format c:
+rem runtests f32test.auto.bat -d c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/test/bld.inf	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+PRJ_PLATFORMS
+ARMV5
+
+PRJ_TESTEXPORTS
+autoexec.bat	                \epoc32\rom\syborg\	//
+
+PRJ_TESTMMPFILES
+
+// Drivers
+// requires baseport specific definitions for TIMER and TimeDelta in d_mstim.cpp 
+..\..\e32test\group\d_mstim		support
+// requires baseport specific definitions for TIMER and TimeDelta and LongTimeDelta in d_tick.cpp 
+..\..\e32test\group\d_tick		support
+// requires definitions for KTickPeriodMs and KTicksPerMillisecond. These are baseport specific and require changes to d_latncy
+..\..\e32test\group\d_latncy		support
+..\..\e32test\group\d_shadow		support
+..\..\e32test\group\bm_pdd		support
+//..\..\e32test\group\d_sharedio		support
+// needs dma.dll
+//..\..\e32test\group\d_dma		support  // DMA kernel-side test harness for real DMA framework
+// needs epbusm.dll
+//..\..\e32test\group\d_medch		support
+..\..\e32test\group\d_cache		support
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/test/variant_test.mmh	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,22 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#define BUILD_TESTS
+
+#include <..\variant.mmh>
+
+SYSTEMINCLUDE	AsspNKernIncludePath
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/trk_l1.ini	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,6 @@
+[SERIALCOMM]
+PDD EUART1
+LDD ECOMM
+CSY ECUART
+PORT 1
+RATE 115200
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/variant.mmh	Fri Jul 31 14:43:15 2009 +0100
@@ -0,0 +1,132 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+//macro   __CPU_ARM926J__
+//#define __CPU__ ARM926EJ-S
+
+//macro __CPU_ARM1136__
+
+//#define __CPU_ARM1176__
+
+macro __CPU_CORTEX_A8N__
+macro __VFP_V3
+#define SYBORG
+macro __SYBORG__
+
+#define MM_MULTIPLE
+//#define MM_FLEXIBLE
+
+// TO DO: decide if we need to switch these on or off!!
+//
+// Uncomment the following line if using the r1p0 release or later of the ARM1136 processor.
+// 
+//#define __CPU_ARM1136_IS_R1__
+//
+
+/* Uncomment if ARM1136 Erratum 351912
+ * "VFP11 double precision multiply can corrupt data"
+ * is fixed on this hardware.
+ */
+//macro __CPU_ARM1136_ERRATUM_351912_FIXED
+
+/* Uncomment if ARM1136 Erratum 353494
+ * "Rare conditions can cause corruption of the Instruction Cache"
+ * is fixed on this hardware.
+ */
+//macro __CPU_ARM1136_ERRATUM_353494_FIXED
+
+/* Uncomment if ARM1136 Erratum 371025
+ * "Invalidate Instruction Cache operation can fail"
+ * is fixed on this hardware.
+ */
+//macro __CPU_ARM1136_ERRATUM_371025_FIXED
+
+/* Uncomment if using ARM1136 processor and ARM1136 Erratum 399234
+ * "Write back data cache entry evicted by write through entry causes data corruption"
+ * is fixed on this hardware.
+ * Workaround
+ * The erratum may be avoided by marking all cacheable memory as one of write through or write back.
+ * This requires the memory attributes described in the translation tables to be modified by software
+ * appropriately, or the use of the remapping capability to remap write through regions to non cacheable.
+ * If this macro is enabled, it should be acompanied by:
+ *					GBLL	CFG_CPU_ARM1136_ERRATUM_399234_FIXED in config.inc
+ */
+//macro __CPU_ARM1136_ERRATUM_399234_FIXED
+
+/* Uncomment if ARM1136 Erratum 408022 "Cancelled write to CONTEXTID register might update ASID" 
+ * is fixed on this hardware.
+ */
+//macro __CPU_ARM1136_ERRATUM_408022_FIXED
+
+// TO DO:
+//
+// Uncomment the next line if using the ARM1136 processor and ARM1136 Erratum 406973
+// "CLREX instruction might be ignored during data cache line fill"
+// is fixed on this hardware.
+// 
+//#define __CPU_ARM1136_ERRATUM_406973_FIXED
+
+
+// Uncomment if:
+//	1)	using ARM1136 processor and ARM1136 Erratum 411920: "Invalidate Entire Instruction Cache
+//	  	operation might fail to invalidate some lines if coincident with linefill"
+//  	  	is fixed on this hardware, or
+//	2)	using ARM1176 processor and ARM1176 Erratum 415045: "Invalidate Entire Instruction Cache
+// 	  	operation might fail to invalidate some lines if coincident with linefill
+//	  	is fixed on this hardware.
+// Workaround:
+//	1)	Disables the use of of prefetch range cache operations by setting RV bit in Auxiliary Ctrl Reg.
+//	2)	Replaces Invalidate ICache operation with the sequence defined in the errata document.
+// If this macro is enabled, it should be accompanied by:
+// 	"GBLL CFG_CPU_ARM1136_ERRATUM_411920_FIXED" in variant.mmh
+//
+//macro __CPU_ARM1136_ERRATUM_411920_FIXED
+
+
+
+macro __CPU_HAS_VFP
+#define USE_VFP_MATH
+// !@! not moving when 1136
+//#define MM_MOVING
+macro __DEBUGGER_SUPPORT__
+macro FASTTRACE_KERNEL_ALL
+macro __EMI_SUPPORT__
+
+#define VariantTarget(name,ext)     _syborg_##name##.##ext
+#define AsspNKernIncludePath        \..\..\src\cedar\generic\base\syborg\specific
+#define VariantMediaDefIncludePath  AsspNKernIncludePath        
+#define PlatformLib		   		    kasyborg.lib
+
+systeminclude	\epoc32\include\memmodel\epoc\mmubase
+//systeminclude	\epoc32\include\memmodel\epoc\moving
+//systeminclude	\epoc32\include\memmodel\epoc\moving\arm
+//systeminclude	\epoc32\include\memmodel\epoc\flexible
+//systeminclude	\epoc32\include\memmodel\epoc\flexible\arm
+systeminclude	\epoc32\include\memmodel\epoc\multiple
+systeminclude	\epoc32\include\memmodel\epoc\multiple\arm
+
+systeminclude	..\soc\interface
+
+// Uncomment for T_USERCOMDEB test
+//#define BUILD_TESTS
+
+#ifdef BUILD_TESTS
+macro BTRACE_KERNEL_ALL
+#endif
+
+//OPTION_REPLACE	ARMCC  --cpu __CPU__
+//OPTION_REPLACE	ARMASM --cpu __CPU__
Binary file docs/svp-docs.pdf has changed
Binary file docs/wiki/Alternative Stop-mode Debugging.doc has changed
Binary file docs/wiki/Armv7.doc has changed
Binary file docs/wiki/Building ROMS with syborg.doc has changed
Binary file docs/wiki/Building the SVP.doc has changed
Binary file docs/wiki/ELF4ROM.doc has changed
Binary file docs/wiki/Ethernet Virtio.doc has changed
Binary file docs/wiki/Flexible Memory Model.doc has changed
Binary file docs/wiki/How to create Symbian peripherals with Qemu.doc has changed
Binary file docs/wiki/Run-mode Debugging.doc has changed
Binary file docs/wiki/SVP Host Filesystem.doc has changed
Binary file docs/wiki/Snapshots.doc has changed
Binary file docs/wiki/Stop-mode Debugging.doc has changed
Binary file docs/wiki/Using the SVP.doc has changed