<!-- Copyright (C) 2002 Red Hat, Inc. -->
|
<!-- Copyright (C) 2002 Red Hat, Inc. -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- permission is obtained from the copyright holder. -->
|
<!-- permission is obtained from the copyright holder. -->
|
<HTML
|
<HTML
|
><HEAD
|
><HEAD
|
><TITLE
|
><TITLE
|
>Porting</TITLE
|
>Porting</TITLE
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
<META
|
<META
|
NAME="GENERATOR"
|
NAME="GENERATOR"
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
"><LINK
|
"><LINK
|
REL="HOME"
|
REL="HOME"
|
TITLE="eCos Synthetic Target"
|
TITLE="eCos Synthetic Target"
|
HREF="hal-synth-arch.html"><LINK
|
HREF="hal-synth-arch.html"><LINK
|
REL="PREVIOUS"
|
REL="PREVIOUS"
|
TITLE="Writing New Devices - host"
|
TITLE="Writing New Devices - host"
|
HREF="synth-new-host.html"></HEAD
|
HREF="synth-new-host.html"></HEAD
|
><BODY
|
><BODY
|
CLASS="REFENTRY"
|
CLASS="REFENTRY"
|
BGCOLOR="#FFFFFF"
|
BGCOLOR="#FFFFFF"
|
TEXT="#000000"
|
TEXT="#000000"
|
LINK="#0000FF"
|
LINK="#0000FF"
|
VLINK="#840084"
|
VLINK="#840084"
|
ALINK="#0000FF"
|
ALINK="#0000FF"
|
><DIV
|
><DIV
|
CLASS="NAVHEADER"
|
CLASS="NAVHEADER"
|
><TABLE
|
><TABLE
|
SUMMARY="Header navigation table"
|
SUMMARY="Header navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TH
|
><TH
|
COLSPAN="3"
|
COLSPAN="3"
|
ALIGN="center"
|
ALIGN="center"
|
>eCos Synthetic Target</TH
|
>eCos Synthetic Target</TH
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
><A
|
><A
|
HREF="synth-new-host.html"
|
HREF="synth-new-host.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="80%"
|
WIDTH="80%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
> </TD
|
> </TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"></DIV
|
WIDTH="100%"></DIV
|
><H1
|
><H1
|
><A
|
><A
|
NAME="SYNTH-PORTING">Porting</H1
|
NAME="SYNTH-PORTING">Porting</H1
|
><DIV
|
><DIV
|
CLASS="REFNAMEDIV"
|
CLASS="REFNAMEDIV"
|
><A
|
><A
|
NAME="AEN1049"
|
NAME="AEN1049"
|
></A
|
></A
|
><H2
|
><H2
|
>Name</H2
|
>Name</H2
|
>Porting -- Adding support for other hosts</DIV
|
>Porting -- Adding support for other hosts</DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="SYNTH-PORTING-DESCRIPTION"
|
NAME="SYNTH-PORTING-DESCRIPTION"
|
></A
|
></A
|
><H2
|
><H2
|
>Description</H2
|
>Description</H2
|
><P
|
><P
|
>The initial development effort of the eCos synthetic target happened
|
>The initial development effort of the eCos synthetic target happened
|
on x86 Linux machines. Porting to other platforms involves addressing
|
on x86 Linux machines. Porting to other platforms involves addressing
|
a number of different issues. Some ports should be fairly
|
a number of different issues. Some ports should be fairly
|
straightforward, for example a port to Linux on a processor other than
|
straightforward, for example a port to Linux on a processor other than
|
an x86. Porting to Unix or Unix-like operating systems other than
|
an x86. Porting to Unix or Unix-like operating systems other than
|
Linux may be possible, but would involve more effort. Porting to a
|
Linux may be possible, but would involve more effort. Porting to a
|
completely different operating system such as Windows would be very
|
completely different operating system such as Windows would be very
|
difficult. The text below complements the eCos Porting Guide.
|
difficult. The text below complements the eCos Porting Guide.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="SYNTH-PORTING-LINUX"
|
NAME="SYNTH-PORTING-LINUX"
|
></A
|
></A
|
><H2
|
><H2
|
>Other Linux Platforms</H2
|
>Other Linux Platforms</H2
|
><P
|
><P
|
>Porting the synthetic target to a Linux platform that uses a processor
|
>Porting the synthetic target to a Linux platform that uses a processor
|
other than x86 should be straightforward. The simplest approach is to
|
other than x86 should be straightforward. The simplest approach is to
|
copy the existing <TT
|
copy the existing <TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>i386linux</TT
|
>i386linux</TT
|
>
|
>
|
directory tree in the <TT
|
directory tree in the <TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>hal/synth</TT
|
>hal/synth</TT
|
>
|
>
|
hierarchy, then rename and edit the ten or so files in this package.
|
hierarchy, then rename and edit the ten or so files in this package.
|
Most of the changes should be pretty obvious, for example on a 64-bit
|
Most of the changes should be pretty obvious, for example on a 64-bit
|
processor some new data types will be needed in the
|
processor some new data types will be needed in the
|
<TT
|
<TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>basetype.h</TT
|
>basetype.h</TT
|
> header file. It will also be necessary
|
> header file. It will also be necessary
|
to update the toplevel <TT
|
to update the toplevel <TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>ecos.db</TT
|
>ecos.db</TT
|
> database with an
|
> database with an
|
entry for the new HAL package, and a new target entry will be needed.
|
entry for the new HAL package, and a new target entry will be needed.
|
</P
|
</P
|
><P
|
><P
|
>Obviously a different processor will have different register sets and
|
>Obviously a different processor will have different register sets and
|
calling conventions, so the code for saving and restoring thread
|
calling conventions, so the code for saving and restoring thread
|
contexts and for implementing <TT
|
contexts and for implementing <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>setjmp</TT
|
>setjmp</TT
|
> and
|
> and
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>longjmp</TT
|
>longjmp</TT
|
> will need to be updated. The exact way of
|
> will need to be updated. The exact way of
|
performing Linux system calls will vary: on x86 linux this usually
|
performing Linux system calls will vary: on x86 linux this usually
|
involves pushing some registers on the stack and then executing an
|
involves pushing some registers on the stack and then executing an
|
<TT
|
<TT
|
CLASS="LITERAL"
|
CLASS="LITERAL"
|
>int 0x080</TT
|
>int 0x080</TT
|
> trap instruction, but on a different
|
> trap instruction, but on a different
|
processor the arguments might be passed in registers instead and
|
processor the arguments might be passed in registers instead and
|
certainly a different trap instruction will be used. The startup code
|
certainly a different trap instruction will be used. The startup code
|
is written in assembler, but needs to do little more than extract the
|
is written in assembler, but needs to do little more than extract the
|
process' argument and environment variables and then jump to the main
|
process' argument and environment variables and then jump to the main
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>linux_entry</TT
|
>linux_entry</TT
|
> function provided by the
|
> function provided by the
|
architectural synthetic target HAL package.
|
architectural synthetic target HAL package.
|
</P
|
</P
|
><P
|
><P
|
>The header file <TT
|
>The header file <TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>hal_io.h</TT
|
>hal_io.h</TT
|
> provided by the
|
> provided by the
|
architectural HAL package provides various structure definitions,
|
architectural HAL package provides various structure definitions,
|
function prototypes, and macros related to system calls. These are
|
function prototypes, and macros related to system calls. These are
|
correct for x86 linux, but there may be problems on other processors.
|
correct for x86 linux, but there may be problems on other processors.
|
For example a structure field that is currently defined as a 32-bit
|
For example a structure field that is currently defined as a 32-bit
|
number may in fact may be a 64-bit number instead.
|
number may in fact may be a 64-bit number instead.
|
</P
|
</P
|
><P
|
><P
|
>The synthetic target's memory map is defined in two files in the
|
>The synthetic target's memory map is defined in two files in the
|
<TT
|
<TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>include/pkgconf</TT
|
>include/pkgconf</TT
|
> subdirectory.
|
> subdirectory.
|
For x86 the default memory map involves eight megabytes of read-only
|
For x86 the default memory map involves eight megabytes of read-only
|
memory for the code at location 0x1000000 and another eight megabytes
|
memory for the code at location 0x1000000 and another eight megabytes
|
for data at 0x2000000. These address ranges may be reserved for other
|
for data at 0x2000000. These address ranges may be reserved for other
|
purposes on the new architecture, so may need changing. There may be
|
purposes on the new architecture, so may need changing. There may be
|
some additional areas of memory allocated by the system for other
|
some additional areas of memory allocated by the system for other
|
purposes, for example the startup stack and any environment variables,
|
purposes, for example the startup stack and any environment variables,
|
but usually eCos applications can and should ignore those.
|
but usually eCos applications can and should ignore those.
|
</P
|
</P
|
><P
|
><P
|
>Other HAL functionality such as interrupt handling, diagnostics, and
|
>Other HAL functionality such as interrupt handling, diagnostics, and
|
the system clock are provided by the architectural HAL package and
|
the system clock are provided by the architectural HAL package and
|
should work on different processors with few if any changes. There may
|
should work on different processors with few if any changes. There may
|
be some problems in the code that interacts with the I/O auxiliary
|
be some problems in the code that interacts with the I/O auxiliary
|
because of lurking assumptions about endianness or the sizes of
|
because of lurking assumptions about endianness or the sizes of
|
various data types.
|
various data types.
|
</P
|
</P
|
><P
|
><P
|
>When porting to other processors, a number of sources of information
|
>When porting to other processors, a number of sources of information
|
are likely to prove useful. Obviously the Linux kernel sources and
|
are likely to prove useful. Obviously the Linux kernel sources and
|
header files constitute the ultimate authority on how things work at
|
header files constitute the ultimate authority on how things work at
|
the system call level. The GNU C library sources may also prove very
|
the system call level. The GNU C library sources may also prove very
|
useful: for a normal Linux application it is the C library that
|
useful: for a normal Linux application it is the C library that
|
provides the startup code and the system call interface.
|
provides the startup code and the system call interface.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="SYNTH-PORTING-UNIX"
|
NAME="SYNTH-PORTING-UNIX"
|
></A
|
></A
|
><H2
|
><H2
|
>Other Unix Platforms</H2
|
>Other Unix Platforms</H2
|
><P
|
><P
|
>Porting to a Unix or Unix-like operating system other than Linux would
|
>Porting to a Unix or Unix-like operating system other than Linux would
|
be somewhat more involved. The first requirement is toolchains: the
|
be somewhat more involved. The first requirement is toolchains: the
|
GNU compilers, gcc and g++, must definitely be used; use of other GNU
|
GNU compilers, gcc and g++, must definitely be used; use of other GNU
|
tools such as the linker may be needed as well, because eCos depends
|
tools such as the linker may be needed as well, because eCos depends
|
on functionality such as prioritizing C++ static constructors, and
|
on functionality such as prioritizing C++ static constructors, and
|
other linkers may not implement this or may implement it in a
|
other linkers may not implement this or may implement it in a
|
different and incompatible way. A closely related requirement is the
|
different and incompatible way. A closely related requirement is the
|
use of ELF format for binary executables: if the operating system
|
use of ELF format for binary executables: if the operating system
|
still uses an older format such as COFF then there are likely to be
|
still uses an older format such as COFF then there are likely to be
|
problems because they do not provide the flexibility required by eCos.
|
problems because they do not provide the flexibility required by eCos.
|
</P
|
</P
|
><P
|
><P
|
>In the architectural HAL there should be very little code that is
|
>In the architectural HAL there should be very little code that is
|
specific to Linux. Instead the code should work on any operating
|
specific to Linux. Instead the code should work on any operating
|
system that provides a reasonable implementation of the POSIX
|
system that provides a reasonable implementation of the POSIX
|
standard. There may be some problems with program startup, but those
|
standard. There may be some problems with program startup, but those
|
could be handled at the architectural level. Some changes may also be
|
could be handled at the architectural level. Some changes may also be
|
required to the exception handling code. However one file which will
|
required to the exception handling code. However one file which will
|
present a problem is <TT
|
present a problem is <TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
>hal_io.h</TT
|
>hal_io.h</TT
|
>, which contains
|
>, which contains
|
various structure definitions and macros used with the system call
|
various structure definitions and macros used with the system call
|
interface. It is likely that many of these definitions will need
|
interface. It is likely that many of these definitions will need
|
changing, and it may well be appropriate to implement variant HAL
|
changing, and it may well be appropriate to implement variant HAL
|
packages for the different operating systems where this information
|
packages for the different operating systems where this information
|
can be separated out. Another possible problem is that the generic
|
can be separated out. Another possible problem is that the generic
|
code assumes that system calls such as
|
code assumes that system calls such as
|
<TT
|
<TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>cyg_hal_sys_write</TT
|
>cyg_hal_sys_write</TT
|
> are available. On an operating
|
> are available. On an operating
|
system other than Linux it is possible that some of these are not
|
system other than Linux it is possible that some of these are not
|
simple system calls, and instead wrapper functions will need to be
|
simple system calls, and instead wrapper functions will need to be
|
implemented at the variant HAL level.
|
implemented at the variant HAL level.
|
</P
|
</P
|
><P
|
><P
|
>The generic I/O auxiliary code should be fairly portable to other Unix
|
>The generic I/O auxiliary code should be fairly portable to other Unix
|
platforms. However some of the device drivers may contain code that is
|
platforms. However some of the device drivers may contain code that is
|
specific to Linux, for example the <TT
|
specific to Linux, for example the <TT
|
CLASS="LITERAL"
|
CLASS="LITERAL"
|
>PF_PACKET</TT
|
>PF_PACKET</TT
|
> socket
|
> socket
|
address family and the ethertap virtual tunnelling interface. These
|
address family and the ethertap virtual tunnelling interface. These
|
may prove quite difficult to port.
|
may prove quite difficult to port.
|
</P
|
</P
|
><P
|
><P
|
>The remaining porting task is to implement one or more platform HAL
|
>The remaining porting task is to implement one or more platform HAL
|
packages, one per processor type that is supported. This should
|
packages, one per processor type that is supported. This should
|
involve much the same work as a port to <A
|
involve much the same work as a port to <A
|
HREF="synth-porting.html#SYNTH-PORTING-LINUX"
|
HREF="synth-porting.html#SYNTH-PORTING-LINUX"
|
>another processor running Linux</A
|
>another processor running Linux</A
|
>.
|
>.
|
</P
|
</P
|
><P
|
><P
|
>When using other Unix operating systems the kernel source code may not
|
>When using other Unix operating systems the kernel source code may not
|
be available, which would make any porting effort more challenging.
|
be available, which would make any porting effort more challenging.
|
However there is still a good chance that the GNU C library will have
|
However there is still a good chance that the GNU C library will have
|
been ported already, so its source code may contain much useful
|
been ported already, so its source code may contain much useful
|
information.
|
information.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="REFSECT1"
|
CLASS="REFSECT1"
|
><A
|
><A
|
NAME="SYNTH-PORTING-OTHER"
|
NAME="SYNTH-PORTING-OTHER"
|
></A
|
></A
|
><H2
|
><H2
|
>Windows Platforms</H2
|
>Windows Platforms</H2
|
><P
|
><P
|
>Porting the current synthetic target code to some version of Windows
|
>Porting the current synthetic target code to some version of Windows
|
or to another non-Unix platform is likely to prove very difficult. The
|
or to another non-Unix platform is likely to prove very difficult. The
|
first hurdle that needs to be crossed is the file format for binary
|
first hurdle that needs to be crossed is the file format for binary
|
executables: current Windows implementations do not use ELF, instead
|
executables: current Windows implementations do not use ELF, instead
|
they use their own format PE which is a variant of the rather old and
|
they use their own format PE which is a variant of the rather old and
|
limited COFF format. It may well prove easier to first write an ELF
|
limited COFF format. It may well prove easier to first write an ELF
|
loader for Windows executables, rather than try to get eCos to work
|
loader for Windows executables, rather than try to get eCos to work
|
within the constraints of PE. Of course that introduces new problems,
|
within the constraints of PE. Of course that introduces new problems,
|
for example existing source-level debuggers will still expect
|
for example existing source-level debuggers will still expect
|
executables to be in PE format.
|
executables to be in PE format.
|
</P
|
</P
|
><P
|
><P
|
>Under Linux a synthetic target application is not linked with the
|
>Under Linux a synthetic target application is not linked with the
|
system's C library or any other standard system library. That would
|
system's C library or any other standard system library. That would
|
cause confusion, for example both eCos and the system's C library
|
cause confusion, for example both eCos and the system's C library
|
might try to define the <TT
|
might try to define the <TT
|
CLASS="FUNCTION"
|
CLASS="FUNCTION"
|
>printf</TT
|
>printf</TT
|
> function, and
|
> function, and
|
introduce complications such as working with shared libraries. For
|
introduce complications such as working with shared libraries. For
|
much the same reasons, a synthetic target application under Windows
|
much the same reasons, a synthetic target application under Windows
|
should not be linked with any Windows DLL's. If an ELF loader has been
|
should not be linked with any Windows DLL's. If an ELF loader has been
|
specially written then this may not be much of a problem.
|
specially written then this may not be much of a problem.
|
</P
|
</P
|
><P
|
><P
|
>The next big problem is the system call interface. Under Windows
|
>The next big problem is the system call interface. Under Windows
|
system calls are generally made via DLL's, and it is not clear that
|
system calls are generally made via DLL's, and it is not clear that
|
the underlying trap mechanism is well-documented or consistent between
|
the underlying trap mechanism is well-documented or consistent between
|
different releases of Windows.
|
different releases of Windows.
|
</P
|
</P
|
><P
|
><P
|
>The current code depends on the operating system providing an
|
>The current code depends on the operating system providing an
|
implementation of POSIX signal handling. This is used for I/O
|
implementation of POSIX signal handling. This is used for I/O
|
purposes, for example <TT
|
purposes, for example <TT
|
CLASS="LITERAL"
|
CLASS="LITERAL"
|
>SIGALRM</TT
|
>SIGALRM</TT
|
> is used for the
|
> is used for the
|
system clock, and for exceptions. It is not known what equivalent
|
system clock, and for exceptions. It is not known what equivalent
|
functionality is available under Windows.
|
functionality is available under Windows.
|
</P
|
</P
|
><P
|
><P
|
>Given the above problems a port of the synthetic target to Windows may
|
>Given the above problems a port of the synthetic target to Windows may
|
or may not be technically feasible, but it would certainly require a
|
or may not be technically feasible, but it would certainly require a
|
very large amount of effort.
|
very large amount of effort.
|
</P
|
</P
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="NAVFOOTER"
|
CLASS="NAVFOOTER"
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"><TABLE
|
WIDTH="100%"><TABLE
|
SUMMARY="Footer navigation table"
|
SUMMARY="Footer navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="synth-new-host.html"
|
HREF="synth-new-host.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="hal-synth-arch.html"
|
HREF="hal-synth-arch.html"
|
ACCESSKEY="H"
|
ACCESSKEY="H"
|
>Home</A
|
>Home</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
> </TD
|
> </TD
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
>Writing New Devices - host</TD
|
>Writing New Devices - host</TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
> </TD
|
> </TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
> </TD
|
> </TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
></DIV
|
></DIV
|
></BODY
|
></BODY
|
></HTML
|
></HTML
|
|
|