examples/fdpicxip: Demonstrate FDPIC modules executed in place.

The FDPIC counterpart of examples/nxflatxip, kept separate from it: that
example is about NXFLAT, and mixing the two module formats into one program
would leave neither demonstrating anything clearly.

Four subcommands, each showing one property of the loader.  'qsort' is the
simplest case it has -- one self-contained module, two concurrent instances,
one shared copy of the text in flash and a private copy of the data each,
with the pin count showing the extent held in place while they run and
released after.  'solib' adds a shared library, so two objects are mapped
and each instance still gets its own copy of both objects' data.  'cxx' is
the same in C++, which additionally requires global constructors to have run
in dependency order before main.  'jmprel' is a module whose imports are all
in DT_JMPREL rather than DT_REL.

The modules are embedded as headers rather than built as part of the app:
linking one needs arm-uclinuxfdpiceabi binutils, which the tree does not
require, so the headers are committed and both this example and
testing/fs/xipfs build with a plain toolchain.

Their sources are in modules/, with a makefile that rebuilds every header
from them on an explicit 'make regen NUTTX_DIR=...' and is never invoked by
the application build.  It drives nuttx/tools/fdpic and writes the headers
this example needs alongside the ones testing/fs/xipfs needs, so one source
tree serves both and the two cannot drift apart.  CPU is cortex-m3 there
deliberately: a v7-M module runs on the v8-M targets too, so one set of blobs
serves both the RP2350 and mps2-an500, while a cortex-m33 build produces
blobs the Cortex-M7 cannot execute at all.

This demonstrates; it does not assert.  The assertions are in the fdpic and
reject sections of apps/testing/fs/xipfs.

Verified on a Pimoroni Pico Plus 2: all four subcommands, and nxflatxip
unaffected alongside them.  Also verified on mps2-an500 under QEMU, which is
a Cortex-M7 -- a different core generation from the RP2350's Cortex-M33.

Assisted-by: Claude Code:claude-opus-5
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
This commit is contained in:
Marco Casaroli 2026-07-30 13:40:04 +02:00 committed by Alan C. Assis
parent 5f286fc924
commit 859c014d4d
22 changed files with 3967 additions and 0 deletions

View file

@ -0,0 +1,25 @@
# ##############################################################################
# apps/examples/fdpicxip/CMakeLists.txt
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with this work for
# additional information regarding copyright ownership. The ASF licenses this
# file to you under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
#
# ##############################################################################
if(CONFIG_EXAMPLES_FDPICXIP)
nuttx_add_application(NAME fdpicxip SRCS fdpicxip_main.c)
endif()

39
examples/fdpicxip/Kconfig Normal file
View file

@ -0,0 +1,39 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
config EXAMPLES_FDPICXIP
tristate "FDPIC modules executed in place from xipfs demo"
depends on FS_XIPFS && FDPIC && LIBC_EXECFUNCS
default n
---help---
Write FDPIC modules into xipfs at run time, the way a download
would, then run them. Their text is executed directly out of
flash and shared between concurrent instances, while each
instance gets its own data.
Subcommands:
qsort one self-contained module, two instances
solib a shared library across two instances
cxx the same in C++, checking global constructors ran
jmprel a module whose imports are all in DT_JMPREL
With no subcommand, qsort runs.
The modules are embedded in the image as C headers. Their
sources are in modules/, which rebuilds the headers on an
explicit 'make regen': linking one needs arm-uclinuxfdpiceabi
binutils, which this build does not.
This demonstrates; it does not assert. For the assertions see
the fdpic and reject sections of CONFIG_TESTING_FS_XIPFS.
if EXAMPLES_FDPICXIP
config EXAMPLES_FDPICXIP_MOUNTPT
string "xipfs mountpoint"
default "/mnt/xipfs"
endif # EXAMPLES_FDPICXIP

View file

@ -0,0 +1,25 @@
############################################################################
# apps/examples/fdpicxip/Make.defs
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
ifneq ($(CONFIG_EXAMPLES_FDPICXIP),)
CONFIGURED_APPS += $(APPDIR)/examples/fdpicxip
endif

View file

@ -0,0 +1,37 @@
############################################################################
# apps/examples/fdpicxip/Makefile
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
include $(APPDIR)/Make.defs
# FDPIC modules executed in place from xipfs. The modules are embedded as
# headers, built from the sources in modules/ by an explicit 'make regen'
# there: linking one needs arm-uclinuxfdpiceabi binutils, which this build
# does not.
MAINSRC = fdpicxip_main.c
PROGNAME = fdpicxip
PRIORITY = SCHED_PRIORITY_DEFAULT
STACKSIZE = $(CONFIG_DEFAULT_TASK_STACKSIZE)
MODULE = $(CONFIG_EXAMPLES_FDPICXIP)
include $(APPDIR)/Application.mk

View file

@ -0,0 +1,400 @@
/****************************************************************************
* apps/examples/fdpicxip/cxxuser_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from cxxuser.fdpic -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_cxxuser[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0x81, 0x04, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x12, 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00,
0xf0, 0x06, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, 0xf0, 0x16, 0x00, 0x00,
0xf0, 0x16, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xf4, 0x06, 0x00, 0x00, 0xf4, 0x16, 0x00, 0x00, 0xf4, 0x16, 0x00, 0x00,
0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x94, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0c, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00,
0xf0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0x01, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00,
0x12, 0x00, 0x06, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x2a, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x61, 0x74,
0x6f, 0x69, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x72,
0x6b, 0x65, 0x72, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x6f,
0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x64, 0x00, 0x73, 0x79,
0x73, 0x6c, 0x6f, 0x67, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x61,
0x64, 0x64, 0x00, 0x75, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x00, 0x73, 0x68,
0x61, 0x70, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00, 0x73, 0x6e,
0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x00, 0x6f, 0x70, 0x65, 0x6e, 0x00,
0x66, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x00, 0x77, 0x72,
0x69, 0x74, 0x65, 0x00, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, 0x6c, 0x69,
0x62, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x73, 0x6f, 0x00, 0x5f, 0x5f,
0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54,
0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50,
0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x00, 0xf0, 0x16, 0x00, 0x00,
0x17, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
0xa0, 0x17, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xa8, 0x17, 0x00, 0x00,
0xa4, 0x08, 0x00, 0x00, 0xb0, 0x17, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00,
0xb8, 0x17, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00,
0xa4, 0x0b, 0x00, 0x00, 0xc8, 0x17, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00,
0xd0, 0x17, 0x00, 0x00, 0xa4, 0x0d, 0x00, 0x00, 0xd8, 0x17, 0x00, 0x00,
0xa4, 0x11, 0x00, 0x00, 0xe0, 0x17, 0x00, 0x00, 0xa4, 0x12, 0x00, 0x00,
0xe8, 0x17, 0x00, 0x00, 0xa4, 0x13, 0x00, 0x00, 0xf0, 0x17, 0x00, 0x00,
0xa4, 0x14, 0x00, 0x00, 0xf8, 0x17, 0x00, 0x00, 0xa4, 0x15, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x14, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x1c, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x24, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x2c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x34, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x44, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x4c, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x54, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x5c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x64, 0x00, 0x00, 0x00,
0x2d, 0xe9, 0xf0, 0x45, 0x01, 0x28, 0x4c, 0x46, 0x80, 0x46, 0x0f, 0x46,
0x89, 0xb0, 0x40, 0xf3, 0x8e, 0x80, 0x48, 0x68, 0xff, 0xf7, 0xcc, 0xff,
0xb8, 0xf1, 0x02, 0x0f, 0xa1, 0x46, 0x06, 0x46, 0x03, 0xd0, 0xb8, 0x68,
0xff, 0xf7, 0xd8, 0xff, 0xa1, 0x46, 0x52, 0x4b, 0x4f, 0x4d, 0x59, 0xf8,
0x03, 0x30, 0x1b, 0x68, 0xab, 0x42, 0x7c, 0xd1, 0xdf, 0xf8, 0x3c, 0xa1,
0xfa, 0x44, 0xff, 0xf7, 0x8f, 0xff, 0xa1, 0x46, 0x00, 0x28, 0x78, 0xd0,
0x4c, 0x4b, 0x7b, 0x44, 0x49, 0x4a, 0x59, 0xf8, 0x02, 0x20, 0x12, 0x79,
0x00, 0x2a, 0x73, 0xd0, 0x49, 0x4a, 0x7a, 0x44, 0x49, 0x49, 0xcd, 0xe9,
0x00, 0x32, 0x06, 0x20, 0x53, 0x46, 0x32, 0x46, 0x79, 0x44, 0xff, 0xf7,
0x97, 0xff, 0xa1, 0x46, 0x40, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x1b, 0x68,
0x5d, 0x1b, 0x18, 0xbf, 0x01, 0x25, 0xff, 0xf7, 0x6f, 0xff, 0xa1, 0x46,
0x08, 0xb9, 0x45, 0xf0, 0x02, 0x05, 0x3a, 0x4b, 0x59, 0xf8, 0x03, 0x30,
0x1b, 0x79, 0x0b, 0xb9, 0x45, 0xf0, 0x04, 0x05, 0x4f, 0xf0, 0x03, 0x0a,
0x34, 0x4b, 0x03, 0x93, 0x30, 0x46, 0xff, 0xf7, 0x35, 0xff, 0x03, 0x98,
0xa1, 0x46, 0xff, 0xf7, 0x45, 0xff, 0xba, 0xf1, 0x01, 0x0a, 0xa1, 0x46,
0xf4, 0xd1, 0xff, 0xf7, 0x49, 0xff, 0x06, 0xeb, 0x46, 0x0a, 0xa1, 0x46,
0x50, 0x45, 0x18, 0xbf, 0x45, 0xf0, 0x08, 0x05, 0xff, 0xf7, 0x40, 0xff,
0xa1, 0x46, 0x03, 0x46, 0x00, 0x2d, 0x38, 0xd1, 0x2c, 0x4a, 0x7a, 0x44,
0x2c, 0x49, 0xcd, 0xe9, 0x00, 0xa2, 0x06, 0x20, 0x32, 0x46, 0x79, 0x44,
0xff, 0xf7, 0x5a, 0xff, 0xb8, 0xf1, 0x03, 0x0f, 0xa1, 0x46, 0x1a, 0xdd,
0xff, 0x68, 0xc7, 0xb1, 0x26, 0x4a, 0x2b, 0x46, 0x10, 0x21, 0x7a, 0x44,
0x04, 0xa8, 0xff, 0xf7, 0x11, 0xff, 0x4f, 0xf4, 0xd2, 0x72, 0xa1, 0x46,
0x82, 0x46, 0x40, 0xf2, 0x41, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x58, 0xff,
0x06, 0x1e, 0xa1, 0x46, 0x18, 0xda, 0x1e, 0x49, 0x3a, 0x46, 0x06, 0x20,
0x79, 0x44, 0xff, 0xf7, 0x3b, 0xff, 0x28, 0x46, 0x09, 0xb0, 0xbd, 0xe8,
0xf0, 0x85, 0x01, 0x26, 0x7b, 0xe7, 0xdf, 0xf8, 0x64, 0xa0, 0xfa, 0x44,
0x81, 0xe7, 0x18, 0x4b, 0x7b, 0x44, 0x85, 0xe7, 0x17, 0x4a, 0x7a, 0x44,
0x8a, 0xe7, 0x17, 0x4a, 0x7a, 0x44, 0xc5, 0xe7, 0x51, 0x46, 0xff, 0xf7,
0x11, 0xff, 0x00, 0x28, 0xa1, 0x46, 0x05, 0xdb, 0x52, 0x46, 0x30, 0x46,
0x04, 0xa9, 0xff, 0xf7, 0x13, 0xff, 0xa1, 0x46, 0x30, 0x46, 0xff, 0xf7,
0x41, 0xff, 0xdc, 0xe7, 0x55, 0x1a, 0x0c, 0x00, 0xa0, 0x86, 0x01, 0x00,
0x6c, 0x00, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00,
0x66, 0x01, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00,
0x34, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00,
0x8e, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00,
0x84, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x40,
0x02, 0x4b, 0x23, 0x60, 0xff, 0xf7, 0xd4, 0xfe, 0x20, 0x71, 0x38, 0xbd,
0x55, 0x1a, 0x0c, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x79, 0x65, 0x73, 0x00,
0x4e, 0x4f, 0x00, 0x50, 0x41, 0x53, 0x53, 0x00, 0x46, 0x41, 0x49, 0x4c,
0x00, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x20, 0x25, 0x64, 0x5d, 0x20, 0x6f,
0x77, 0x6e, 0x20, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x6e, 0x3a,
0x20, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
0x20, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x6e, 0x3a, 0x20, 0x25,
0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x20, 0x66,
0x69, 0x72, 0x73, 0x74, 0x3a, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x5b, 0x75,
0x73, 0x65, 0x72, 0x20, 0x25, 0x64, 0x5d, 0x20, 0x6c, 0x69, 0x62, 0x72,
0x61, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20,
0x25, 0x64, 0x20, 0x28, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64,
0x20, 0x25, 0x64, 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x25, 0x73, 0x0a, 0x00,
0x25, 0x64, 0x00, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x5d, 0x20, 0x63, 0x61,
0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20,
0x74, 0x6f, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x94, 0x17, 0x00, 0x00,
0x29, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
0x19, 0x00, 0x00, 0x00, 0xf0, 0x16, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x20, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x94, 0x17, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfb, 0xff, 0xff, 0x6f, 0x01, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x6f,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x16, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00,
0x47, 0x43, 0x43, 0x3a, 0x20, 0x28, 0x41, 0x72, 0x6d, 0x20, 0x47, 0x4e,
0x55, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20,
0x31, 0x35, 0x2e, 0x32, 0x2e, 0x52, 0x65, 0x6c, 0x31, 0x20, 0x28, 0x42,
0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x6d, 0x2d, 0x31, 0x35, 0x2e,
0x38, 0x36, 0x29, 0x29, 0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x31, 0x20,
0x32, 0x30, 0x32, 0x35, 0x31, 0x32, 0x30, 0x33, 0x00, 0x41, 0x2c, 0x00,
0x00, 0x00, 0x61, 0x65, 0x61, 0x62, 0x69, 0x00, 0x01, 0x22, 0x00, 0x00,
0x00, 0x05, 0x37, 0x2d, 0x4d, 0x00, 0x06, 0x0a, 0x07, 0x4d, 0x09, 0x02,
0x12, 0x04, 0x14, 0x01, 0x15, 0x01, 0x17, 0x03, 0x18, 0x01, 0x19, 0x01,
0x1a, 0x01, 0x1e, 0x04, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf4, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x17, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff,
0x01, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0xec, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
0x28, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x07, 0x00, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
0xf0, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x00, 0x22, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x00, 0x00,
0x04, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0xf1, 0xff, 0x37, 0x00, 0x00, 0x00, 0xf4, 0x16, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf1, 0xff, 0x40, 0x00, 0x00, 0x00,
0x94, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00,
0x04, 0x00, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0xb8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0xdc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0xf4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0x54, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0x6c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00,
0xf0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0xae, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00,
0x12, 0x00, 0x06, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0xc4, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x74, 0x00, 0x24, 0x64, 0x00, 0x5f,
0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x5f, 0x73, 0x75, 0x62, 0x5f,
0x49, 0x5f, 0x63, 0x78, 0x78, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x70,
0x70, 0x00, 0x2e, 0x4c, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x30, 0x00,
0x5f, 0x5a, 0x4c, 0x36, 0x67, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x00, 0x5f,
0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x00, 0x5f, 0x47, 0x4c, 0x4f,
0x42, 0x41, 0x4c, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x54,
0x41, 0x42, 0x4c, 0x45, 0x5f, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f,
0x61, 0x64, 0x64, 0x00, 0x73, 0x6e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66,
0x00, 0x75, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x00, 0x73, 0x68, 0x61, 0x70,
0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00, 0x73, 0x68, 0x61, 0x70,
0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65,
0x64, 0x00, 0x66, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x00,
0x77, 0x72, 0x69, 0x74, 0x65, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49,
0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x6d, 0x61,
0x69, 0x6e, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50,
0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00, 0x73, 0x79, 0x73, 0x6c,
0x6f, 0x67, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00, 0x6f, 0x70, 0x65, 0x6e,
0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65,
0x72, 0x00, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x2e, 0x73, 0x79,
0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62,
0x00, 0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e,
0x68, 0x61, 0x73, 0x68, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x79, 0x6d,
0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x74, 0x72, 0x00, 0x2e, 0x72, 0x65,
0x6c, 0x2e, 0x64, 0x79, 0x6e, 0x00, 0x2e, 0x70, 0x6c, 0x74, 0x00, 0x2e,
0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61,
0x00, 0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75, 0x70, 0x00, 0x2e, 0x69,
0x6e, 0x69, 0x74, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x00, 0x2e, 0x64,
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e, 0x67, 0x6f, 0x74, 0x00,
0x2e, 0x62, 0x73, 0x73, 0x00, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
0x74, 0x00, 0x2e, 0x41, 0x52, 0x4d, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69,
0x62, 0x75, 0x74, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
0x60, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
0x80, 0x02, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x20, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00,
0x80, 0x04, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
0x44, 0x06, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf0, 0x16, 0x00, 0x00,
0xf0, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x62, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0xf4, 0x16, 0x00, 0x00, 0xf4, 0x06, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x94, 0x17, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00,
0x04, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00,
0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x78, 0x08, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x35, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0d, 0x00, 0x00,
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_cxxuser_len = 4352;

View file

@ -0,0 +1,538 @@
/****************************************************************************
* apps/examples/fdpicxip/fdpicxip_main.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* End to end demonstration of the FDPIC module loader over a writable
* execute-in-place file system:
*
* 1. write a module into xipfs at run time, the way a download would,
* 2. confirm the file system can hand out a direct flash pointer for it,
* 3. run it, in some cases as two concurrent instances,
* 4. confirm the shared text was pinned in place while they ran and
* released afterwards.
*
* The point of FDPIC here is that text stays in flash and only the writable
* segment is copied, once per running instance -- so a second instance, or
* a second module sharing a library, costs data and no code.
*
* This demonstrates; it does not assert. The assertions live in the fdpic
* and reject sections of apps/testing/fs/xipfs.
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <elf.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <spawn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/fs/xipfs.h>
#include "qsorter_bin.h"
#include "libcounter_bin.h"
#include "user_bin.h"
#include "libshape_bin.h"
#include "cxxuser_bin.h"
#include "lazymod_bin.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define MOUNTPT CONFIG_EXAMPLES_FDPICXIP_MOUNTPT
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: extent_info_path
*
* Description:
* Where a file physically lies: its extent, its flash address, and how
* many live mappings are pinning it in place.
*
****************************************************************************/
static int extent_info_path(FAR const char *path,
FAR struct xipfs_extent_info_s *info)
{
int fd;
int ret;
fd = open(path, O_RDONLY | O_CLOEXEC);
if (fd < 0)
{
return -errno;
}
ret = ioctl(fd, XIPFSIOC_EXTENTINFO, (unsigned long)(uintptr_t)info);
close(fd);
return ret < 0 ? -errno : 0;
}
/****************************************************************************
* Shared library demonstration
*
* Stages a library and a module that needs it, then runs two instances.
* Both share one mapped copy of each object's code, executed in place from
* flash, while each instance gets private copies of both the module's data
* and the library's. If the library's state were shared, the two totals
* would interleave instead of each reaching seed*3.
****************************************************************************/
static int stage_blob(FAR const char *path, FAR const unsigned char *data,
unsigned int len)
{
ssize_t n;
int fd;
unlink(path);
fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0755);
if (fd < 0)
{
return -errno;
}
if (ftruncate(fd, len) < 0)
{
close(fd);
return -errno;
}
n = write(fd, data, len);
close(fd);
return (n == (ssize_t)len) ? 0 : -EIO;
}
/****************************************************************************
* Name: qsorter_main
*
* Description:
* The simplest case the loader has: one self-contained FDPIC module, no
* library behind it, run as two concurrent instances. It is the FDPIC
* counterpart of what this demo does by default with NXFLAT, and the
* only subcommand that exercises a module with no second object -- solib
* and cxx both bring a library, jmprel is about how imports are bound.
*
* The two instances overlap deliberately: each fills its array, sleeps,
* then sorts. One shared copy of the text, a private copy of the data
* per instance -- shared data would show up as corrupted output, and the
* pin count while both are alive is what stops the defragmenter
* relocating code that is executing.
*
****************************************************************************/
static int qsorter_main(void)
{
struct xipfs_extent_info_s info;
FAR char *args[3];
pid_t pid[2];
char seed[8];
int status;
int ret;
int i;
syslog(LOG_INFO,
"\n=== FDPIC module executed in place from xipfs ===\n\n");
ret = stage_blob(MOUNTPT "/qsorter", g_qsorter_nxf, g_qsorter_nxf_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the module failed: %d\n", ret);
return EXIT_FAILURE;
}
syslog(LOG_INFO, "staged qsorter (%u bytes)\n", g_qsorter_nxf_len);
if (extent_info_path(MOUNTPT "/qsorter", &info) == 0)
{
syslog(LOG_INFO, "extent: block %" PRIu32 " x%" PRIu32 ", size %"
PRIu32 ", flash addr 0x%08lx\n",
info.start_block, info.nblocks, info.size,
(unsigned long)info.xipaddr);
if (info.xipaddr == 0)
{
syslog(LOG_INFO,
"ERROR: filesystem cannot expose a flash pointer; the "
"module would have to be copied to RAM\n");
return EXIT_FAILURE;
}
}
syslog(LOG_INFO, "\nspawning two concurrent instances...\n\n");
for (i = 0; i < 2; i++)
{
snprintf(seed, sizeof(seed), "%d", i + 1);
args[0] = (FAR char *)"qsorter";
args[1] = seed;
args[2] = NULL;
ret = posix_spawn(&pid[i], MOUNTPT "/qsorter", NULL, NULL, args, NULL);
if (ret != 0)
{
syslog(LOG_INFO, "spawn %d failed: %d\n", i + 1, ret);
return EXIT_FAILURE;
}
}
usleep(150000);
if (extent_info_path(MOUNTPT "/qsorter", &info) == 0)
{
syslog(LOG_INFO, "[while running] pins on the shared text = %lu\n\n",
(unsigned long)info.pincount);
}
for (i = 0; i < 2; i++)
{
waitpid(pid[i], &status, 0);
}
usleep(100000);
if (extent_info_path(MOUNTPT "/qsorter", &info) == 0)
{
syslog(LOG_INFO, "\n[after exit] pins on the shared text = %lu\n",
(unsigned long)info.pincount);
}
syslog(LOG_INFO, "\n=== done ===\n");
return EXIT_SUCCESS;
}
static int solib_main(void)
{
struct xipfs_extent_info_s li;
struct xipfs_extent_info_s ui;
FAR char *args[3];
pid_t pid[2];
char seed[8];
int status;
int ret;
int i;
syslog(LOG_INFO, "\n=== FDPIC shared library, executed in place ===\n\n");
ret = stage_blob(MOUNTPT "/libcounter.so", g_libcounter, g_libcounter_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the library failed: %d\n", ret);
return EXIT_FAILURE;
}
ret = stage_blob(MOUNTPT "/user", g_user, g_user_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the module failed: %d\n", ret);
return EXIT_FAILURE;
}
syslog(LOG_INFO, "staged libcounter.so (%u bytes) and user (%u bytes)\n",
g_libcounter_len, g_user_len);
if (extent_info_path(MOUNTPT "/libcounter.so", &li) == 0 &&
extent_info_path(MOUNTPT "/user", &ui) == 0)
{
syslog(LOG_INFO, " libcounter.so text at 0x%08lx\n",
(unsigned long)li.xipaddr);
syslog(LOG_INFO, " user text at 0x%08lx\n",
(unsigned long)ui.xipaddr);
}
syslog(LOG_INFO, "\nspawning two instances, each bumping by its own"
" seed...\n\n");
for (i = 0; i < 2; i++)
{
snprintf(seed, sizeof(seed), "%d", i + 1);
args[0] = (FAR char *)"user";
args[1] = seed;
args[2] = NULL;
ret = posix_spawn(&pid[i], MOUNTPT "/user", NULL, NULL, args, NULL);
if (ret != 0)
{
syslog(LOG_INFO, "spawn %d failed: %d\n", i + 1, ret);
return EXIT_FAILURE;
}
}
usleep(150000);
if (extent_info_path(MOUNTPT "/libcounter.so", &li) == 0)
{
syslog(LOG_INFO, "[while running] pins on the library's shared text"
" = %lu\n\n", (unsigned long)li.pincount);
}
for (i = 0; i < 2; i++)
{
waitpid(pid[i], &status, 0);
}
usleep(100000);
if (extent_info_path(MOUNTPT "/libcounter.so", &li) == 0)
{
syslog(LOG_INFO, "\n[after exit] pins on the library's shared text"
" = %lu\n", (unsigned long)li.pincount);
}
syslog(LOG_INFO, "\n=== done ===\n");
return EXIT_SUCCESS;
}
/****************************************************************************
* Name: cxx_main
*
* Description:
* The same shape as solib_main(), in C++, and with one thing extra to
* prove: that global constructors ran.
*
* That is worth a demo of its own because of how it fails. A loader that
* ignores DT_INIT_ARRAY still loads a C++ module, still resolves every
* symbol, and still runs it -- the globals are simply left as .bss and
* every field reads zero. Nothing faults and nothing is logged; the
* module just answers wrong. So both objects here carry a magic number
* that only a constructor writes, and the module reports whether it found
* them.
*
* The ordering is checked too. The module's constructor samples whether
* the library was already constructed when it ran, which is the only
* moment the answer is still interesting -- by the time main() is entered
* both have run either way.
*
****************************************************************************/
static int cxx_main(void)
{
struct xipfs_extent_info_s li;
struct xipfs_extent_info_s ui;
FAR char *args[3];
pid_t pid[2];
char seed[8];
int status;
int ret;
int i;
syslog(LOG_INFO, "\n=== C++ module and shared library, executed in"
" place ===\n\n");
ret = stage_blob(MOUNTPT "/libshape.so", g_libshape, g_libshape_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the library failed: %d\n", ret);
return EXIT_FAILURE;
}
ret = stage_blob(MOUNTPT "/cxxuser", g_cxxuser, g_cxxuser_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the module failed: %d\n", ret);
return EXIT_FAILURE;
}
syslog(LOG_INFO, "staged libshape.so (%u bytes) and cxxuser (%u bytes)\n",
g_libshape_len, g_cxxuser_len);
if (extent_info_path(MOUNTPT "/libshape.so", &li) == 0 &&
extent_info_path(MOUNTPT "/cxxuser", &ui) == 0)
{
syslog(LOG_INFO, " libshape.so text at 0x%08lx\n",
(unsigned long)li.xipaddr);
syslog(LOG_INFO, " cxxuser text at 0x%08lx\n",
(unsigned long)ui.xipaddr);
}
syslog(LOG_INFO, "\nspawning two instances, each adding its own seed...\n"
"(each instance's constructors run at load time, before main)\n\n");
for (i = 0; i < 2; i++)
{
snprintf(seed, sizeof(seed), "%d", i + 1);
args[0] = (FAR char *)"cxxuser";
args[1] = seed;
args[2] = NULL;
ret = posix_spawn(&pid[i], MOUNTPT "/cxxuser", NULL, NULL, args, NULL);
if (ret != 0)
{
syslog(LOG_INFO, "spawn %d failed: %d\n", i + 1, ret);
return EXIT_FAILURE;
}
}
usleep(150000);
if (extent_info_path(MOUNTPT "/libshape.so", &li) == 0)
{
syslog(LOG_INFO, "[while running] pins on the library's shared text"
" = %lu\n\n", (unsigned long)li.pincount);
}
/* Only a barrier. The exit status is deliberately not read: waitpid()
* retains it for an already-exited child only under
* CONFIG_SCHED_CHILD_STATUS, and both instances run for the same time, so
* the second is always gone by the time the first wait returns. Checking
* `status` after a failed wait reads whatever the previous iteration left
* there, which looks like a pass. The suite in apps/testing/fs/xipfs
* asserts the real result via files; this demo reports through the log.
*/
ret = EXIT_SUCCESS;
for (i = 0; i < 2; i++)
{
waitpid(pid[i], &status, 0);
}
/* The destructors run on unload, which happens as each task is reaped --
* after waitpid() has returned, so give them a moment to be logged.
*/
usleep(100000);
if (extent_info_path(MOUNTPT "/libshape.so", &li) == 0)
{
syslog(LOG_INFO, "\n[after exit] pins on the library's shared text"
" = %lu\n", (unsigned long)li.pincount);
}
syslog(LOG_INFO, "\n=== %s ===\n",
ret == EXIT_SUCCESS ? "done" : "FAILED");
return ret;
}
/****************************************************************************
* Name: jmprel_main
*
* Description:
* Load a module whose imports the linker put in DT_JMPREL.
*
* Every other module here is linked with -z now, which leaves the imported
* descriptors in DT_REL. This one empties BINDNOW in modules/Makefile, so
* it has no DT_REL at all -- both of its imports are in the PLT relocation
* table.
*
* There is no lazy resolver in the loader, so a DT_JMPREL table that went
* unwalked was not deferred work: the descriptors stayed unrelocated and
* the module's first call into the firmware branched to whatever the
* unrelocated word held. It loaded cleanly and printed nothing, then
* took an INVSTATE UsageFault that escalated to a HardFault -- no
* console, no crash dump. If this demo prints its line, both tables are
* being bound.
*
****************************************************************************/
static int jmprel_main(void)
{
FAR char *args[3];
pid_t pid;
int status;
int ret;
syslog(LOG_INFO, "\n=== FDPIC module bound through DT_JMPREL ===\n\n");
ret = stage_blob(MOUNTPT "/lazymod", g_lazymod, g_lazymod_len);
if (ret < 0)
{
syslog(LOG_INFO, "staging the module failed: %d\n", ret);
return EXIT_FAILURE;
}
syslog(LOG_INFO, "staged lazymod (%u bytes), all imports in DT_JMPREL\n\n",
g_lazymod_len);
args[0] = (FAR char *)"lazymod";
args[1] = (FAR char *)"42";
args[2] = NULL;
ret = posix_spawn(&pid, MOUNTPT "/lazymod", NULL, NULL, args, NULL);
if (ret != 0)
{
syslog(LOG_INFO, "spawn failed: %d\n", ret);
return EXIT_FAILURE;
}
waitpid(pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
{
syslog(LOG_INFO, "\n=== FAILED: module did not exit cleanly ===\n");
return EXIT_FAILURE;
}
syslog(LOG_INFO, "\n=== done: the module reached the firmware and came"
" back ===\n");
return EXIT_SUCCESS;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, FAR char *argv[])
{
if (argc > 1 && strcmp(argv[1], "solib") == 0)
{
return solib_main();
}
if (argc > 1 && strcmp(argv[1], "cxx") == 0)
{
return cxx_main();
}
if (argc > 1 && strcmp(argv[1], "jmprel") == 0)
{
return jmprel_main();
}
if (argc > 1 && strcmp(argv[1], "qsort") != 0)
{
fprintf(stderr, "usage: fdpicxip [qsort|solib|cxx|jmprel]\n");
return EXIT_FAILURE;
}
return qsorter_main();
}

View file

@ -0,0 +1,220 @@
/****************************************************************************
* apps/examples/fdpicxip/lazymod_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from lazymod.fdpic -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_lazymod[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0xd5, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00,
0x3c, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00,
0x3c, 0x12, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x3c, 0x02, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x23, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00,
0x28, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x00, 0x00,
0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69,
0x6e, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00, 0x73, 0x79, 0x73, 0x6c, 0x6f,
0x67, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f,
0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46,
0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x00,
0xc0, 0x12, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0xc8, 0x12, 0x00, 0x00,
0xa4, 0x05, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x5f, 0xf8, 0x08, 0xc0, 0x4d, 0xf8, 0x04, 0xcd,
0xd9, 0xf8, 0x04, 0xc0, 0xd9, 0xf8, 0x00, 0xf0, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0xf8, 0x08, 0xc0,
0x4d, 0xf8, 0x04, 0xcd, 0xd9, 0xf8, 0x04, 0xc0, 0xd9, 0xf8, 0x00, 0xf0,
0x01, 0x28, 0x10, 0xb5, 0x4c, 0x46, 0x0b, 0xdd, 0x48, 0x68, 0xff, 0xf7,
0xe5, 0xff, 0xa1, 0x46, 0x02, 0x46, 0x04, 0x49, 0x06, 0x20, 0x79, 0x44,
0xff, 0xf7, 0xca, 0xff, 0x00, 0x20, 0x10, 0xbd, 0x01, 0x22, 0xf6, 0xe7,
0x0e, 0x00, 0x00, 0x00, 0x5b, 0x6c, 0x61, 0x7a, 0x79, 0x6d, 0x6f, 0x64,
0x5d, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72,
0x6f, 0x75, 0x67, 0x68, 0x20, 0x61, 0x20, 0x44, 0x54, 0x5f, 0x4a, 0x4d,
0x50, 0x52, 0x45, 0x4c, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
0x74, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x64, 0x20, 0x25, 0x64,
0x0a, 0x00, 0x00, 0x00, 0xb4, 0x12, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x33, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0xb4, 0x12, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
0x17, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xc4, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x47, 0x43, 0x43, 0x3a, 0x20, 0x28, 0x41, 0x72, 0x6d, 0x20, 0x47, 0x4e,
0x55, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20,
0x31, 0x35, 0x2e, 0x32, 0x2e, 0x52, 0x65, 0x6c, 0x31, 0x20, 0x28, 0x42,
0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x6d, 0x2d, 0x31, 0x35, 0x2e,
0x38, 0x36, 0x29, 0x29, 0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x31, 0x20,
0x32, 0x30, 0x32, 0x35, 0x31, 0x32, 0x30, 0x33, 0x00, 0x41, 0x2c, 0x00,
0x00, 0x00, 0x61, 0x65, 0x61, 0x62, 0x69, 0x00, 0x01, 0x22, 0x00, 0x00,
0x00, 0x05, 0x37, 0x2d, 0x4d, 0x00, 0x06, 0x0a, 0x07, 0x4d, 0x09, 0x02,
0x12, 0x04, 0x14, 0x01, 0x15, 0x01, 0x17, 0x03, 0x18, 0x01, 0x19, 0x01,
0x1a, 0x01, 0x1e, 0x04, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00,
0x00, 0x00, 0x00, 0x00, 0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0xf1, 0xff, 0x0b, 0x00, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x00,
0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0xf1, 0xff, 0x11, 0x00, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf1, 0xff, 0x1a, 0x00, 0x00, 0x00,
0xb4, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00,
0x0e, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00,
0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x0b, 0x00, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00,
0xd5, 0x01, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x45, 0x00, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x6c, 0x61, 0x7a, 0x79, 0x6d, 0x6f, 0x64, 0x2e, 0x63, 0x00, 0x24,
0x74, 0x00, 0x24, 0x64, 0x00, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49,
0x43, 0x00, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x4f, 0x46,
0x46, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x00,
0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e,
0x44, 0x5f, 0x5f, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x5f, 0x5f, 0x52,
0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f,
0x5f, 0x00, 0x73, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x00, 0x61, 0x74, 0x6f,
0x69, 0x00, 0x00, 0x2e, 0x73, 0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e,
0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74,
0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x00, 0x2e,
0x64, 0x79, 0x6e, 0x73, 0x79, 0x6d, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73,
0x74, 0x72, 0x00, 0x2e, 0x72, 0x65, 0x6c, 0x2e, 0x70, 0x6c, 0x74, 0x00,
0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74,
0x61, 0x00, 0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75, 0x70, 0x00, 0x2e,
0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e, 0x67, 0x6f, 0x74,
0x00, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x2e, 0x41,
0x52, 0x4d, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x21, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00,
0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00,
0x74, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x84, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00,
0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00,
0xfc, 0x01, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x38, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x3c, 0x12, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb4, 0x12, 0x00, 0x00,
0xb4, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00,
0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x44, 0x03, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x1a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_lazymod_len = 2192;

View file

@ -0,0 +1,208 @@
/****************************************************************************
* apps/examples/fdpicxip/libcounter_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from libcounter.so -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_libcounter[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x0f, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00,
0xf8, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00,
0xf8, 0x11, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xf8, 0x01, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00,
0xe5, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05, 0x00,
0x2d, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, 0x00, 0x00, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x00, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00,
0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49,
0x53, 0x54, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58,
0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x6c, 0x69, 0x62,
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x73, 0x6f, 0x00, 0x00,
0x8c, 0x12, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x59, 0xf8,
0x03, 0x30, 0x1a, 0x68, 0x10, 0x44, 0x18, 0x60, 0x70, 0x47, 0x00, 0xbf,
0x0c, 0x00, 0x00, 0x00, 0x02, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x18, 0x68,
0x70, 0x47, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x4b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x6f,
0x01, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x6f, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x47, 0x43, 0x43, 0x3a,
0x20, 0x28, 0x41, 0x72, 0x6d, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x54, 0x6f,
0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x31, 0x35, 0x2e, 0x32,
0x2e, 0x52, 0x65, 0x6c, 0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64,
0x20, 0x61, 0x72, 0x6d, 0x2d, 0x31, 0x35, 0x2e, 0x38, 0x36, 0x29, 0x29,
0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x32, 0x35,
0x31, 0x32, 0x30, 0x33, 0x00, 0x41, 0x2c, 0x00, 0x00, 0x00, 0x61, 0x65,
0x61, 0x62, 0x69, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x05, 0x37, 0x2d,
0x4d, 0x00, 0x06, 0x0a, 0x07, 0x4d, 0x09, 0x02, 0x12, 0x04, 0x14, 0x01,
0x15, 0x01, 0x17, 0x03, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1e, 0x04,
0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf8, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x0e, 0x00, 0x00, 0x00,
0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x11, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00,
0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x11, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x00,
0x90, 0x12, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0xf1, 0xff, 0x26, 0x00, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf1, 0xff, 0x2f, 0x00, 0x00, 0x00,
0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00,
0x45, 0x00, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x12, 0x00, 0x05, 0x00, 0x52, 0x00, 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05, 0x00, 0x60, 0x00, 0x00, 0x00,
0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, 0x00,
0x70, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x06, 0x00, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x24, 0x74, 0x00, 0x24, 0x64, 0x00,
0x2e, 0x4c, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x30, 0x00, 0x67, 0x5f,
0x63, 0x61, 0x6c, 0x6c, 0x73, 0x00, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d,
0x49, 0x43, 0x00, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x4f,
0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f,
0x00, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x6d,
0x70, 0x00, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f,
0x74, 0x61, 0x6c, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55,
0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f,
0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f,
0x00, 0x00, 0x2e, 0x73, 0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73,
0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74, 0x72,
0x74, 0x61, 0x62, 0x00, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x00, 0x2e, 0x64,
0x79, 0x6e, 0x73, 0x79, 0x6d, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x74,
0x72, 0x00, 0x2e, 0x72, 0x65, 0x6c, 0x2e, 0x64, 0x79, 0x6e, 0x00, 0x2e,
0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75,
0x70, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e,
0x67, 0x6f, 0x74, 0x00, 0x2e, 0x62, 0x73, 0x73, 0x00, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x2e, 0x41, 0x52, 0x4d, 0x2e, 0x61,
0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00,
0xec, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x29, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x7c, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00,
0xd0, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xf4, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0xf8, 0x11, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00,
0x80, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x90, 0x12, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xd5, 0x02, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00,
0x0d, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00,
0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x35, 0x05, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_libcounter_len = 2052;

View file

@ -0,0 +1,389 @@
/****************************************************************************
* apps/examples/fdpicxip/libshape_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from libshape.so -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_libshape[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x88, 0x0d, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x13, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00,
0xbc, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0xbc, 0x15, 0x00, 0x00,
0xbc, 0x15, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xc4, 0x05, 0x00, 0x00, 0xc4, 0x15, 0x00, 0x00, 0xc4, 0x15, 0x00, 0x00,
0xb0, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x74, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc4, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, 0x00, 0x4e, 0x00, 0x00, 0x00,
0x6d, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, 0x00, 0x6d, 0x00, 0x00, 0x00,
0x99, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x79, 0x00, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x12, 0x00, 0x06, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x8b, 0x00, 0x00, 0x00,
0xb8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
0x85, 0x04, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x5a, 0x4e, 0x38, 0x52, 0x65, 0x67,
0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x32, 0x45, 0x76, 0x00, 0x73, 0x79,
0x73, 0x6c, 0x6f, 0x67, 0x00, 0x73, 0x6e, 0x70, 0x72, 0x69, 0x6e, 0x74,
0x66, 0x00, 0x6f, 0x70, 0x65, 0x6e, 0x00, 0x66, 0x74, 0x72, 0x75, 0x6e,
0x63, 0x61, 0x74, 0x65, 0x00, 0x77, 0x72, 0x69, 0x74, 0x65, 0x00, 0x63,
0x6c, 0x6f, 0x73, 0x65, 0x00, 0x5f, 0x5a, 0x4e, 0x38, 0x52, 0x65, 0x67,
0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x31, 0x45, 0x76, 0x00, 0x73, 0x68,
0x61, 0x70, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x00, 0x73, 0x68, 0x61, 0x70,
0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x00, 0x73, 0x74, 0x72,
0x6c, 0x63, 0x70, 0x79, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x74,
0x6f, 0x74, 0x61, 0x6c, 0x00, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x63,
0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x64, 0x00, 0x5f,
0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53,
0x54, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55,
0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x6c, 0x69, 0x62, 0x73,
0x68, 0x61, 0x70, 0x65, 0x2e, 0x73, 0x6f, 0x00, 0xbc, 0x15, 0x00, 0x00,
0x17, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
0xc0, 0x16, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x80, 0x16, 0x00, 0x00,
0xa4, 0x07, 0x00, 0x00, 0x88, 0x16, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00,
0x90, 0x16, 0x00, 0x00, 0xa4, 0x0d, 0x00, 0x00, 0x98, 0x16, 0x00, 0x00,
0xa4, 0x0e, 0x00, 0x00, 0xa0, 0x16, 0x00, 0x00, 0xa4, 0x0f, 0x00, 0x00,
0xa8, 0x16, 0x00, 0x00, 0xa4, 0x12, 0x00, 0x00, 0xb0, 0x16, 0x00, 0x00,
0xa4, 0x13, 0x00, 0x00, 0xb8, 0x16, 0x00, 0x00, 0xa4, 0x15, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x14, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x1c, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x24, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x2c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x34, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x44, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x03, 0x4b, 0x59, 0xf8, 0x03, 0x00,
0xff, 0xf7, 0xaa, 0xff, 0x10, 0xbd, 0x00, 0xbf, 0x4c, 0x00, 0x00, 0x00,
0x00, 0x22, 0x07, 0x4b, 0x05, 0x49, 0x59, 0xf8, 0x03, 0x30, 0x06, 0x20,
0xc3, 0xe9, 0x00, 0x12, 0x04, 0x49, 0x9a, 0x60, 0x79, 0x44, 0x1a, 0x73,
0xff, 0xf7, 0xca, 0xbf, 0xe0, 0xa9, 0x5b, 0x00, 0x4c, 0x00, 0x00, 0x00,
0x3e, 0x01, 0x00, 0x00, 0x04, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x9a, 0x68,
0x01, 0x32, 0x9a, 0x60, 0x5a, 0x68, 0x10, 0x44, 0x58, 0x60, 0x70, 0x47,
0x4c, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x01, 0x46, 0x59, 0xf8, 0x03, 0x00,
0x40, 0x22, 0x0c, 0x30, 0xff, 0xf7, 0xa6, 0xbf, 0x4c, 0x00, 0x00, 0x00,
0x02, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x58, 0x68, 0x70, 0x47, 0x00, 0xbf,
0x4c, 0x00, 0x00, 0x00, 0x05, 0x4b, 0x59, 0xf8, 0x03, 0x30, 0x18, 0x68,
0x02, 0x4b, 0xc3, 0x1a, 0x58, 0x42, 0x58, 0x41, 0x70, 0x47, 0x00, 0xbf,
0xe0, 0xa9, 0x5b, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x45,
0x1d, 0x49, 0x05, 0x46, 0x82, 0x68, 0x85, 0xb0, 0x06, 0x20, 0x79, 0x44,
0x4c, 0x46, 0xff, 0xf7, 0x8d, 0xff, 0x2b, 0x7b, 0xa1, 0x46, 0x1b, 0xb3,
0x18, 0x4a, 0x10, 0x21, 0x6b, 0x68, 0x7a, 0x44, 0x68, 0x46, 0xff, 0xf7,
0x5b, 0xff, 0x05, 0xf1, 0x0c, 0x07, 0xa1, 0x46, 0x82, 0x46, 0x4f, 0xf4,
0xd2, 0x72, 0x40, 0xf2, 0x41, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x82, 0xff,
0x06, 0x1e, 0xa1, 0x46, 0x12, 0xdb, 0x51, 0x46, 0xff, 0xf7, 0x54, 0xff,
0x00, 0x28, 0xa1, 0x46, 0x05, 0xdb, 0x52, 0x46, 0x69, 0x46, 0x30, 0x46,
0xff, 0xf7, 0x56, 0xff, 0xa1, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x7a, 0xff,
0x28, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x85, 0x05, 0x49, 0x3a, 0x46,
0x06, 0x20, 0x79, 0x44, 0xff, 0xf7, 0x5c, 0xff, 0xf4, 0xe7, 0x00, 0xbf,
0x76, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
0x20, 0x20, 0x5b, 0x6c, 0x69, 0x62, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5d,
0x20, 0x7e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x28, 0x29,
0x20, 0x72, 0x61, 0x6e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x25,
0x64, 0x20, 0x61, 0x64, 0x64, 0x73, 0x0a, 0x00, 0x25, 0x64, 0x00, 0x20,
0x20, 0x5b, 0x6c, 0x69, 0x62, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5d, 0x20,
0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x25, 0x73, 0x20, 0x66, 0x61,
0x69, 0x6c, 0x65, 0x64, 0x0a, 0x00, 0x20, 0x20, 0x5b, 0x6c, 0x69, 0x62,
0x73, 0x68, 0x61, 0x70, 0x65, 0x5d, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73,
0x74, 0x72, 0x79, 0x28, 0x29, 0x20, 0x72, 0x61, 0x6e, 0x0a, 0x00, 0x00,
0x74, 0x16, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
0xbc, 0x15, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x1a, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x20, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x74, 0x16, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfb, 0xff, 0xff, 0x6f, 0x01, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x6f,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x15, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc4, 0x16, 0x00, 0x00, 0x47, 0x43, 0x43, 0x3a, 0x20, 0x28, 0x41, 0x72,
0x6d, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68,
0x61, 0x69, 0x6e, 0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x52, 0x65, 0x6c,
0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x6d,
0x2d, 0x31, 0x35, 0x2e, 0x38, 0x36, 0x29, 0x29, 0x20, 0x31, 0x35, 0x2e,
0x32, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x32, 0x35, 0x31, 0x32, 0x30, 0x33,
0x00, 0x41, 0x2c, 0x00, 0x00, 0x00, 0x61, 0x65, 0x61, 0x62, 0x69, 0x00,
0x01, 0x22, 0x00, 0x00, 0x00, 0x05, 0x37, 0x2d, 0x4d, 0x00, 0x06, 0x0a,
0x07, 0x4d, 0x09, 0x02, 0x12, 0x04, 0x14, 0x01, 0x15, 0x01, 0x17, 0x03,
0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1e, 0x04, 0x22, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0xb8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0xbc, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc4, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x74, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x16, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0f, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x01, 0x00, 0x00, 0x00,
0xc4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x04, 0x00, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x01, 0x00, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
0x98, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x04, 0x00, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
0xbc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x01, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00,
0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
0x60, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x04, 0x00, 0x00, 0x00, 0xbc, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x23, 0x00, 0x00, 0x00,
0x31, 0x04, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00,
0x04, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00,
0xc4, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00,
0x3f, 0x00, 0x00, 0x00, 0xc4, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x00, 0x49, 0x00, 0x00, 0x00, 0xc4, 0x16, 0x00, 0x00,
0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff,
0x59, 0x00, 0x00, 0x00, 0xc4, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0xf1, 0xff, 0x62, 0x00, 0x00, 0x00, 0x74, 0x16, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00,
0x4c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
0x01, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0xa4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0xc8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,
0x1c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x04, 0x00, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, 0x00, 0x89, 0x00, 0x00, 0x00,
0x6d, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, 0x00, 0xad, 0x00, 0x00, 0x00,
0x99, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0xb9, 0x00, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x12, 0x00, 0x06, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0xf3, 0x00, 0x00, 0x00,
0xb8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00,
0x85, 0x04, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x1d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x74, 0x00, 0x24, 0x64, 0x00, 0x5f,
0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x5f, 0x73, 0x75, 0x62, 0x5f,
0x49, 0x5f, 0x6c, 0x69, 0x62, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x63,
0x70, 0x70, 0x00, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x5f,
0x73, 0x75, 0x62, 0x5f, 0x44, 0x5f, 0x6c, 0x69, 0x62, 0x73, 0x68, 0x61,
0x70, 0x65, 0x2e, 0x63, 0x70, 0x70, 0x00, 0x2e, 0x4c, 0x41, 0x4e, 0x43,
0x48, 0x4f, 0x52, 0x30, 0x00, 0x5f, 0x5a, 0x4c, 0x31, 0x30, 0x67, 0x5f,
0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x00, 0x5f, 0x44, 0x59,
0x4e, 0x41, 0x4d, 0x49, 0x43, 0x00, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41,
0x4c, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42,
0x4c, 0x45, 0x5f, 0x00, 0x5f, 0x5a, 0x4e, 0x38, 0x52, 0x65, 0x67, 0x69,
0x73, 0x74, 0x72, 0x79, 0x44, 0x31, 0x45, 0x76, 0x00, 0x73, 0x68, 0x61,
0x70, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x00, 0x73, 0x6e, 0x70, 0x72, 0x69,
0x6e, 0x74, 0x66, 0x00, 0x5f, 0x5a, 0x4e, 0x38, 0x52, 0x65, 0x67, 0x69,
0x73, 0x74, 0x72, 0x79, 0x44, 0x32, 0x45, 0x76, 0x00, 0x73, 0x68, 0x61,
0x70, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00, 0x73, 0x68, 0x61,
0x70, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
0x65, 0x64, 0x00, 0x66, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65,
0x00, 0x77, 0x72, 0x69, 0x74, 0x65, 0x00, 0x73, 0x74, 0x72, 0x6c, 0x63,
0x70, 0x79, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50,
0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46,
0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00,
0x73, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x00, 0x6f, 0x70, 0x65, 0x6e, 0x00,
0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72,
0x00, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x2e, 0x73, 0x79, 0x6d,
0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00,
0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x68,
0x61, 0x73, 0x68, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x79, 0x6d, 0x00,
0x2e, 0x64, 0x79, 0x6e, 0x73, 0x74, 0x72, 0x00, 0x2e, 0x72, 0x65, 0x6c,
0x2e, 0x64, 0x79, 0x6e, 0x00, 0x2e, 0x70, 0x6c, 0x74, 0x00, 0x2e, 0x74,
0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x00,
0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75, 0x70, 0x00, 0x2e, 0x69, 0x6e,
0x69, 0x74, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x00, 0x2e, 0x66, 0x69,
0x6e, 0x69, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x00, 0x2e, 0x64, 0x79,
0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e, 0x67, 0x6f, 0x74, 0x00, 0x2e,
0x62, 0x73, 0x73, 0x00, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
0x00, 0x2e, 0x41, 0x52, 0x4d, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
0x75, 0x74, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
0x60, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
0x80, 0x02, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x38, 0x03, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00,
0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00,
0x30, 0x04, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
0x4c, 0x05, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xbc, 0x15, 0x00, 0x00,
0xbc, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x62, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0xc0, 0x15, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0xc4, 0x15, 0x00, 0x00, 0xc4, 0x05, 0x00, 0x00,
0xb0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x74, 0x16, 0x00, 0x00,
0x74, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x7c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0xc4, 0x16, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x07, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00,
0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xeb, 0x0c, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_libshape_len = 4224;

5
examples/fdpicxip/modules/.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
/*.fdpic
/*.so
/.nuttx-exports
/manyneeded.c
/need*.c

View file

@ -0,0 +1,205 @@
############################################################################
# apps/examples/fdpicxip/modules/Makefile
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
# The FDPIC modules that examples/fdpicxip and testing/fs/xipfs carry inside
# their images, and the sources they are built from.
#
# This is NOT part of the application build. Nothing here runs unless it is
# asked for: the *_bin.h headers are committed, so both apps build with a
# plain toolchain and CI covers them, while the link needs
# arm-uclinuxfdpiceabi binutils, which the tree does not require. See
# nuttx/tools/fdpic/README.md and Documentation/components/fdpic.rst.
#
# To rebuild the headers from these sources:
#
# make -C apps/examples/fdpicxip/modules regen NUTTX_DIR=/path/to/nuttx
#
# NUTTX_DIR must be a configured, built tree with CONFIG_FDPIC and a system
# symbol table: the compile needs its headers and the verify step needs
# libs/libc/exec_symtab.c.
#
# CPU is cortex-m3 rather than the toolchain default, deliberately. A v7-M
# module runs on both the v7-M and v8-M targets, so one set of blobs serves
# the RP2350 (Cortex-M33) and mps2-an500 (Cortex-M7) alike. Building for
# cortex-m33 produces blobs the M7 cannot execute at all.
CPU ?= cortex-m3
FDPICDIR = $(NUTTX_DIR)/tools/fdpic
MODULE_MK = $(FDPICDIR)/nuttx-fdpic.mk
EMBED = $(FDPICDIR)/fdpic-embed
# Where each generated header goes, and its path from the repository root --
# fdpic-embed puts that on line 2, which is what nxstyle wants.
DEMODIR = ..
DEMOREL = apps/examples/fdpicxip
TESTDIR = ../../../testing/fs/xipfs
TESTREL = apps/testing/fs/xipfs
BUILD = $(MAKE) -f $(MODULE_MK) NUTTX_DIR=$(NUTTX_DIR) CPU=$(CPU)
# manyneeded needs one library per DT_NEEDED entry, one more than the loader
# will follow. They exist only to make the linker record nine entries; the
# module is refused while its dynamic section is parsed, before any of them
# would be loaded, so none of them is embedded.
NEEDLIBS := $(foreach n,0 1 2 3 4 5 6 7 8,need$(n).so)
DEMO_HDRS = $(DEMODIR)/qsorter_bin.h $(DEMODIR)/libcounter_bin.h \
$(DEMODIR)/user_bin.h $(DEMODIR)/libshape_bin.h \
$(DEMODIR)/cxxuser_bin.h $(DEMODIR)/lazymod_bin.h
TEST_HDRS = $(TESTDIR)/callback_bin.h $(TESTDIR)/counteruser_bin.h \
$(TESTDIR)/cxxuser_bin.h $(TESTDIR)/funcdesc_bin.h \
$(TESTDIR)/lazymod_bin.h $(TESTDIR)/libcounter_bin.h \
$(TESTDIR)/libshape_bin.h $(TESTDIR)/manyneeded_bin.h \
$(TESTDIR)/missingsym_bin.h
.PHONY: all regen check-nuttx-dir clean
all:
@echo "Nothing to do: the *_bin.h headers are committed."
@echo "To rebuild them: make regen NUTTX_DIR=/path/to/nuttx"
regen: check-nuttx-dir $(DEMO_HDRS) $(TEST_HDRS)
@echo "Regenerated the embedded modules for $(DEMOREL) and $(TESTREL)."
check-nuttx-dir:
ifeq ($(NUTTX_DIR),)
$(error Set NUTTX_DIR to a configured, built NuttX tree)
endif
# The modules. Libraries have no entry point and are named by their SONAME,
# which is what a consumer records in DT_NEEDED and what the loader searches
# for at run time.
qsorter.fdpic: qsorter.c
$(BUILD) MODULE=qsorter SRCS=qsorter.c
callback.fdpic: callback.c
$(BUILD) MODULE=callback SRCS=callback.c
funcdesc.fdpic: funcdesc.c
$(BUILD) MODULE=funcdesc SRCS=funcdesc.c
libcounter.so: libcounter.c
$(BUILD) MODULE=libcounter SRCS=libcounter.c ENTRY=0 \
EXTRA_LDFLAGS="-soname libcounter.so"
mv libcounter.fdpic libcounter.so
user.fdpic: user.c libcounter.so
$(BUILD) MODULE=user SRCS=user.c LIBS=libcounter.so
# C++ compiles with the stock arm-none-eabi-g++; only the link is FDPIC.
libshape.so: libshape.cpp
$(BUILD) MODULE=libshape CXXSRCS=libshape.cpp ENTRY=0 \
EXTRA_LDFLAGS="-soname libshape.so"
mv libshape.fdpic libshape.so
cxxuser.fdpic: cxxuser.cpp libshape.so
$(BUILD) MODULE=cxxuser CXXSRCS=cxxuser.cpp LIBS=libshape.so
# BINDNOW is emptied so the imported descriptors stay in the lazy binding
# table, which is the case this module exists to cover.
lazymod.fdpic: lazymod.c
$(BUILD) MODULE=lazymod SRCS=lazymod.c BINDNOW=
# missingsym is linked with the bare .fdpic target rather than the default
# 'verify' one, because it is exactly what fdpic-verify is meant to catch.
missingsym.fdpic: missingsym.c
$(BUILD) MODULE=missingsym SRCS=missingsym.c missingsym.fdpic
need%.so:
echo "int need_leaf_$*(void){return $*;}" > need$*.c
$(BUILD) MODULE=need$* SRCS=need$*.c ENTRY=0 \
EXTRA_LDFLAGS="-soname need$*.so"
mv need$*.fdpic need$*.so
manyneeded.c: $(NEEDLIBS)
{ for n in 0 1 2 3 4 5 6 7 8; do \
echo "extern int need_leaf_$$n(void);"; done; \
echo "int main(int argc, char *argv[]) {"; \
echo " return need_leaf_0() + need_leaf_1() + need_leaf_2() +"; \
echo " need_leaf_3() + need_leaf_4() + need_leaf_5() +"; \
echo " need_leaf_6() + need_leaf_7() + need_leaf_8();"; \
echo "}"; } > manyneeded.c
manyneeded.fdpic: manyneeded.c $(NEEDLIBS)
$(BUILD) MODULE=manyneeded SRCS=manyneeded.c LIBS="$(NEEDLIBS)" \
manyneeded.fdpic
# The headers. One artifact can be embedded under more than one name: the
# demo's user_bin.h and the suite's counteruser_bin.h are the same module.
$(DEMODIR)/qsorter_bin.h: qsorter.fdpic
$(EMBED) $< g_qsorter_nxf $(DEMOREL)/$(@F) > $@
$(DEMODIR)/libcounter_bin.h: libcounter.so
$(EMBED) $< g_libcounter $(DEMOREL)/$(@F) > $@
$(DEMODIR)/user_bin.h: user.fdpic
$(EMBED) $< g_user $(DEMOREL)/$(@F) > $@
$(DEMODIR)/libshape_bin.h: libshape.so
$(EMBED) $< g_libshape $(DEMOREL)/$(@F) > $@
$(DEMODIR)/cxxuser_bin.h: cxxuser.fdpic
$(EMBED) $< g_cxxuser $(DEMOREL)/$(@F) > $@
$(DEMODIR)/lazymod_bin.h: lazymod.fdpic
$(EMBED) $< g_lazymod $(DEMOREL)/$(@F) > $@
$(TESTDIR)/callback_bin.h: callback.fdpic
$(EMBED) $< g_callback $(TESTREL)/$(@F) > $@
$(TESTDIR)/counteruser_bin.h: user.fdpic
$(EMBED) $< g_counteruser $(TESTREL)/$(@F) > $@
$(TESTDIR)/cxxuser_bin.h: cxxuser.fdpic
$(EMBED) $< g_cxxuser $(TESTREL)/$(@F) > $@
$(TESTDIR)/funcdesc_bin.h: funcdesc.fdpic
$(EMBED) $< g_funcdesc $(TESTREL)/$(@F) > $@
$(TESTDIR)/lazymod_bin.h: lazymod.fdpic
$(EMBED) $< g_lazymod $(TESTREL)/$(@F) > $@
$(TESTDIR)/libcounter_bin.h: libcounter.so
$(EMBED) $< g_libcounter $(TESTREL)/$(@F) > $@
$(TESTDIR)/libshape_bin.h: libshape.so
$(EMBED) $< g_libshape $(TESTREL)/$(@F) > $@
$(TESTDIR)/manyneeded_bin.h: manyneeded.fdpic
$(EMBED) $< g_manyneeded $(TESTREL)/$(@F) > $@
$(TESTDIR)/missingsym_bin.h: missingsym.fdpic
$(EMBED) $< g_missingsym $(TESTREL)/$(@F) > $@
# No NUTTX_DIR needed to clean.
clean:
$(Q) rm -f *.o *.fdpic *.so .nuttx-exports need*.c manyneeded.c

View file

@ -0,0 +1,517 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/callback.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Hands a module function to the firmware every way the firmware will
* accept one.
*
* In FDPIC a function pointer is the address of a two-word descriptor, not
* a code address, and that descriptor lives in the module's writable
* segment in RAM. Firmware that stores such a pointer and later branches to
* it therefore jumps into the module's *data* and faults -- unless the entry
* point it came through resolved the descriptor first.
*
* qsort and bsearch have always done that. pthread_create, signal and
* task_create did not, which made them look usable and then take the board
* down; pthread_once, task_spawn, scandir's filter and sigaction followed
* later. This module is what keeps all of them honest.
*
* scandir is one worth noting: its filter is called by scandir itself and
* must be resolved there, while its comparison function is handed to qsort,
* which resolves it. Resolving both would be a bug, so both are passed here
* at once.
*
* mq_notify and timer_create with SIGEV_THREAD are the interesting ones:
* their callback runs on a work-queue worker that carries no module data
* base. The base is captured at registration and installed around the call,
* so the callback still reaches the module's own globals. Each is checked
* by having the callback write a distinctive value into a module global.
*
* Everything is checked by observing a side effect the callback itself
* produces, because a callback that never runs is the failure being tested
* for -- and on this target the alternative failure is a HardFault, which
* reports nothing at all.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <dirent.h>
#include <fcntl.h>
#include <mqueue.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <spawn.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <time.h>
#include <unistd.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define FAIL_QSORT 0x01
#define FAIL_PTHREAD 0x02
#define FAIL_SIGNAL 0x04
#define FAIL_TASK 0x08
#define FAIL_ONCE 0x10
#define FAIL_SPAWN 0x20
#define FAIL_SCANDIR 0x40
#define FAIL_SIGACTION 0x80
/* The mq checks run under "callback mq" and report in their own byte, so the
* exit status -- only eight bits survive waitpid -- never has to hold more
* than eight flags at once.
*/
#define FAIL_MQ_THREAD 0x01
#define FAIL_MQ_SIGNAL 0x02
#define FAIL_TIMER_THREAD 0x04
/****************************************************************************
* Private Data
****************************************************************************/
/* Written by the callbacks, read by main. These live in the module's
* writable segment, which is what the callback can only reach if it was
* entered with this module's data base in the FDPIC register.
*/
static volatile int g_qsort_calls;
static volatile int g_thread_ran;
static volatile int g_signal_ran;
static volatile int g_task_ran;
static volatile int g_once_ran;
static volatile int g_spawn_ran;
static volatile int g_filter_calls;
static volatile int g_compar_calls;
static volatile int g_sigaction_ran;
static volatile int g_mq_signal_ran;
static volatile int g_mq_thread_ran;
static volatile int g_timer_thread_ran;
/****************************************************************************
* Private Functions
****************************************************************************/
static int cmp_int(const void *a, const void *b)
{
g_qsort_calls++;
return *(const int *)a - *(const int *)b;
}
static void *thread_main(void *arg)
{
g_thread_ran = (int)(intptr_t)arg;
return NULL;
}
static void sig_handler(int signo)
{
g_signal_ran = signo;
}
static void sigaction_handler(int signo, siginfo_t *info, void *context)
{
g_sigaction_ran = signo;
}
static void mq_signal_handler(int signo, siginfo_t *info, void *context)
{
g_mq_signal_ran = signo;
}
static void mq_thread_notify(union sigval value)
{
/* Runs on a work-queue worker, which carries no module data base of its
* own. Writing this module global proves the base was installed around
* the call -- without it this store would fault or land nowhere.
*/
g_mq_thread_ran = value.sival_int;
}
static void timer_thread_notify(union sigval value)
{
g_timer_thread_ran = value.sival_int;
}
static int task_main(int argc, char *argv[])
{
g_task_ran = 1;
return 0;
}
static void once_routine(void)
{
g_once_ran++;
}
static int spawn_main(int argc, char *argv[])
{
g_spawn_ran = 1;
return 0;
}
static int dir_filter(const struct dirent *entry)
{
g_filter_calls++;
return 1;
}
static int dir_compar(const struct dirent **a, const struct dirent **b)
{
g_compar_calls++;
return strcmp((*a)->d_name, (*b)->d_name);
}
/* The message-queue checks run as a second invocation, "callback mq", so
* their two flags report in a byte of their own rather than overflowing the
* eight-bit exit status the other checks already fill.
*/
static int run_mq(void)
{
struct mq_attr attr;
struct sigaction sa;
struct sigevent ev;
struct itimerspec its;
timer_t timer;
mqd_t mqd;
int fails = 0;
int i;
attr.mq_maxmsg = 1;
attr.mq_msgsize = 1;
attr.mq_flags = 0;
mqd = mq_open("/cbmq", O_CREAT | O_RDWR, 0644, &attr);
if (mqd == (mqd_t)-1)
{
return FAIL_MQ_THREAD | FAIL_MQ_SIGNAL | FAIL_TIMER_THREAD;
}
/* mq_notify with SIGEV_THREAD. The callback runs on a work-queue worker
* that carries no module data base of its own; the base captured at
* registration is installed around the call, so the callback reaches this
* module's globals. A distinctive sival marks that the right callback
* ran with the right argument.
*/
memset(&ev, 0, sizeof(ev));
ev.sigev_notify = SIGEV_THREAD;
ev.sigev_notify_function = mq_thread_notify;
ev.sigev_value.sival_int = 0x5a;
if (mq_notify(mqd, &ev) < 0)
{
fails |= FAIL_MQ_THREAD;
}
else
{
char buf[1];
/* The notification fires on a send to an empty queue; drain the
* message afterwards so the queue is empty for the next test and the
* next send does not block on a full queue.
*/
mq_send(mqd, "x", 1, 0);
for (i = 0; i < 50 && g_mq_thread_ran == 0; i++)
{
usleep(10000);
}
mq_receive(mqd, buf, sizeof(buf), NULL);
if (g_mq_thread_ran != 0x5a)
{
fails |= FAIL_MQ_THREAD;
}
}
/* mq_notify with SIGEV_SIGNAL, delivered to this task and caught by a
* handler installed through sigaction.
*/
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = mq_signal_handler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &sa, NULL);
memset(&ev, 0, sizeof(ev));
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = SIGUSR1;
if (mq_notify(mqd, &ev) < 0)
{
fails |= FAIL_MQ_SIGNAL;
}
else
{
char buf[1];
mq_send(mqd, "x", 1, 0);
for (i = 0; i < 50 && g_mq_signal_ran == 0; i++)
{
usleep(10000);
}
mq_receive(mqd, buf, sizeof(buf), NULL);
if (g_mq_signal_ran != SIGUSR1)
{
fails |= FAIL_MQ_SIGNAL;
}
}
mq_close(mqd);
mq_unlink("/cbmq");
/* timer_create with SIGEV_THREAD reaches the module the same way: the
* expiry callback runs on the worker with the module's base installed.
*/
memset(&ev, 0, sizeof(ev));
ev.sigev_notify = SIGEV_THREAD;
ev.sigev_notify_function = timer_thread_notify;
ev.sigev_value.sival_int = 0xa5;
if (timer_create(CLOCK_MONOTONIC, &ev, &timer) < 0)
{
fails |= FAIL_TIMER_THREAD;
}
else
{
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 20 * 1000 * 1000;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
timer_settime(timer, 0, &its, NULL);
for (i = 0; i < 50 && g_timer_thread_ran == 0; i++)
{
usleep(10000);
}
if (g_timer_thread_ran != 0xa5)
{
fails |= FAIL_TIMER_THREAD;
}
timer_delete(timer);
}
syslog(LOG_INFO,
"[callback] mq_thread=%#x mq_signal=%d timer_thread=%#x -- %s\n",
g_mq_thread_ran, g_mq_signal_ran, g_timer_thread_ran,
fails == 0 ? "PASS" : "FAIL");
return fails;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, char *argv[])
{
int v[5] =
{
5, 3, 1, 4, 2
};
struct dirent **namelist;
pthread_once_t once = PTHREAD_ONCE_INIT;
struct sigaction sa;
pthread_t tid;
int fails = 0;
int n;
int i;
if (argc > 1 && strcmp(argv[1], "mq") == 0)
{
return run_mq();
}
/* qsort -- the path that always worked */
qsort(v, 5, sizeof(int), cmp_int);
if (g_qsort_calls == 0 || v[0] != 1 || v[4] != 5)
{
fails |= FAIL_QSORT;
}
/* pthread_create. The thread inherits this module's D-Space, so it can
* reach g_thread_ran only if it was entered at the right address.
*/
if (pthread_create(&tid, NULL, thread_main, (void *)(intptr_t)7) != 0)
{
fails |= FAIL_PTHREAD;
}
else
{
pthread_join(tid, NULL);
if (g_thread_ran != 7)
{
fails |= FAIL_PTHREAD;
}
}
/* signal, delivered to this task */
if (signal(SIGUSR1, sig_handler) == SIG_ERR)
{
fails |= FAIL_SIGNAL;
}
else
{
/* raise() rather than kill(getpid(), ...): getpid is not in the
* firmware's export list, and raise targets the calling thread, which
* is exactly what this is checking.
*/
raise(SIGUSR1);
for (i = 0; i < 50 && g_signal_ran == 0; i++)
{
usleep(10000);
}
if (g_signal_ran != SIGUSR1)
{
fails |= FAIL_SIGNAL;
}
}
/* task_create. A separate task, but the same D-Space. */
if (task_create("cbtask", SCHED_PRIORITY_DEFAULT, 2048, task_main,
NULL) < 0)
{
fails |= FAIL_TASK;
}
else
{
for (i = 0; i < 50 && g_task_ran == 0; i++)
{
usleep(10000);
}
if (g_task_ran == 0)
{
fails |= FAIL_TASK;
}
}
/* sigaction, delivered to this task. signal() above resolves the handler
* before calling sigaction; this reaches sigaction directly, which is the
* path signal() does not cover.
*/
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = sigaction_handler;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGUSR2, &sa, NULL) < 0)
{
fails |= FAIL_SIGACTION;
}
else
{
raise(SIGUSR2);
for (i = 0; i < 50 && g_sigaction_ran == 0; i++)
{
usleep(10000);
}
if (g_sigaction_ran != SIGUSR2)
{
fails |= FAIL_SIGACTION;
}
}
/* pthread_once. Runs on this thread, so only the code address matters. */
if (pthread_once(&once, once_routine) != 0 || g_once_ran != 1)
{
fails |= FAIL_ONCE;
}
/* task_spawn. Like task_create, a separate task with the same D-Space. */
if (task_spawn("cbspawn", spawn_main, NULL, NULL, NULL, NULL) < 0)
{
fails |= FAIL_SPAWN;
}
else
{
for (i = 0; i < 50 && g_spawn_ran == 0; i++)
{
usleep(10000);
}
if (g_spawn_ran == 0)
{
fails |= FAIL_SPAWN;
}
}
/* scandir takes two callbacks that reach the module by different routes:
* the filter is called by scandir itself, while the comparison function is
* handed to qsort. Passing both at once is the point -- it is what would
* catch the comparison function being resolved twice.
*/
namelist = NULL;
n = scandir("/mnt/xipfs", &namelist, dir_filter, dir_compar);
if (n < 0 || g_filter_calls == 0)
{
fails |= FAIL_SCANDIR;
}
if (namelist != NULL)
{
while (n-- > 0)
{
free(namelist[n]);
}
free(namelist);
}
syslog(LOG_INFO,
"[callback] qsort=%d pthread=%d signal=%d task=%d sigaction=%d "
"once=%d spawn=%d filter=%d compar=%d -- %s\n",
g_qsort_calls, g_thread_ran, g_signal_ran, g_task_ran,
g_sigaction_ran, g_once_ran, g_spawn_ran, g_filter_calls,
g_compar_calls, fails == 0 ? "PASS" : "FAIL");
return fails;
}

View file

@ -0,0 +1,210 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/cxxuser.cpp
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* A C++ module using a C++ shared library.
*
* Two instances of this run at once in the demo. Between them they show
* the three things that have to hold:
*
* - constructors ran, in both objects. Neither magic can be right by
* accident: an unconstructed global is zero.
* - the library's constructors ran before this module's, which is the
* ordering DT_NEEDED implies and the loader has to honour.
* - the library's data is private per instance. One copy of its code
* sits in flash; the totals do not interleave.
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
extern "C"
{
int shape_add(int by);
int shape_total(void);
bool shape_constructed(void);
void shape_marker(const char *path);
}
#define USER_MAGIC 0x0c1a55
class Instance
{
public:
Instance() : m_magic(USER_MAGIC), m_libwasready(shape_constructed())
{
}
bool constructed() const
{
return m_magic == USER_MAGIC;
}
/* Whether the library was already constructed when this object's own
* constructor ran. Sampling it here is the only way to observe the
* ordering: by the time main() runs, both have been constructed either
* way.
*/
bool libwasready() const
{
return m_libwasready;
}
private:
int m_magic;
bool m_libwasready;
};
static Instance g_self;
/* Exit status is a bitmask of what failed, so one run reports on all four
* properties independently. Kept in step with the reader in
* apps/testing/fs/xipfs/.
*/
#define USER_FAIL_OWN_CTOR 0x01
#define USER_FAIL_LIB_CTOR 0x02
#define USER_FAIL_ORDER 0x04
#define USER_FAIL_PRIVATE 0x08
/****************************************************************************
* Name: record
*
* Description:
* Write a number to a file, for a caller that cannot rely on this task's
* exit status.
*
* It cannot, in general. waitpid() only retains the status of a child
* that has already exited when CONFIG_SCHED_CHILD_STATUS is set, and that
* depends on CONFIG_SCHED_HAVE_PARENT. With two instances running for
* the same length of time, the second has always exited by the time the
* first waitpid() returns, so its status is simply gone. A file survives
* the task, and survives the module being unloaded.
*
****************************************************************************/
static void record(const char *path, int value)
{
char text[16];
int len;
int fd;
if (path == NULL)
{
return;
}
len = snprintf(text, sizeof(text), "%d", value);
fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd < 0)
{
syslog(LOG_INFO, "[user] cannot record to %s\n", path);
return;
}
/* xipfs wants the size declared up front so it can reserve one
* contiguous extent.
*/
if (ftruncate(fd, len) >= 0)
{
write(fd, text, len);
}
close(fd);
}
extern "C" int main(int argc, char *argv[])
{
int seed = (argc > 1) ? atoi(argv[1]) : 1;
int fails = 0;
int i;
/* Optional second argument: a path for the library's destructor to record
* its final total in. A destructor runs at unload, after this task is
* gone, so leaving a file behind is the only way a test can observe that
* it ran at all. The demo omits it and reads the log instead.
*/
if (argc > 2)
{
shape_marker(argv[2]);
}
syslog(LOG_INFO, "[user %d] own ctor ran: %s, library ctor ran: %s, "
"library first: %s\n",
seed,
g_self.constructed() ? "yes" : "NO",
shape_constructed() ? "yes" : "NO",
g_self.libwasready() ? "yes" : "NO");
/* Every check runs and contributes a bit, rather than the first failure
* returning early. A caller that reports these individually can then say
* which property broke instead of just that something did -- and none of
* its assertions pass merely because an earlier one stopped the run.
*/
if (!g_self.constructed())
{
fails |= USER_FAIL_OWN_CTOR;
}
if (!shape_constructed())
{
fails |= USER_FAIL_LIB_CTOR;
}
if (!g_self.libwasready())
{
fails |= USER_FAIL_ORDER;
}
for (i = 0; i < 3; i++)
{
shape_add(seed);
usleep(100000);
}
if (shape_total() != seed * 3)
{
fails |= USER_FAIL_PRIVATE;
}
syslog(LOG_INFO, "[user %d] library total = %d (expected %d) -- %s\n",
seed, shape_total(), seed * 3,
fails == 0 ? "PASS" : "FAIL");
/* Optional third argument: where to record the bitmask, for a caller that
* cannot rely on the exit status surviving. See record() above.
*/
if (argc > 3)
{
record(argv[3], fails);
}
return fails;
}

View file

@ -0,0 +1,156 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/funcdesc.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Exercises R_ARM_FUNCDESC -- the relocation that asks the loader to
* manufacture a function descriptor and hand back its address.
*
* It is emitted for an *address-taken imported* function, which is a
* different thing from a called one. A call gets a PLT entry and an
* R_ARM_FUNCDESC_VALUE relocation on a descriptor the linker already laid
* out; taking the address instead needs a pointer to a descriptor that does
* not exist yet, so the loader carves one out of the pool it reserves
* behind the writable segment. No other module here emits one, which is
* why this exists.
*
* Every pointer here is called *through*, not merely printed: a descriptor
* with the wrong entry or the wrong GOT half only shows up when it is
* branched through.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
/****************************************************************************
* Private Types
****************************************************************************/
typedef int (*atoifn)(const char *);
typedef void *(*memcpyfn)(void *, const void *, size_t);
typedef int (*strcmpfn)(const char *, const char *);
typedef void (*qsortfn)(void *, size_t, size_t,
int (*)(const void *, const void *));
/****************************************************************************
* Private Data
****************************************************************************/
/* volatile is load bearing, and the reason is worth knowing before anyone
* tidies it away.
*
* Without it these are static pointers that are never written, so GCC
* constant-propagates them, turns every indirect call back into a direct
* one, and deletes the variables. The descriptor address then never has to
* materialise, the linker emits R_ARM_FUNCDESC_VALUE for the direct calls
* instead, and not one R_ARM_FUNCDESC survives -- the module still builds,
* still runs, still passes, and tests nothing it claims to.
*
* volatile forces each pointer to be loaded from memory at the point of
* call, which is what makes the slot genuinely hold the address of a
* descriptor the loader has to supply.
*/
static atoifn volatile g_atoi = atoi;
static memcpyfn volatile g_memcpy = memcpy;
static strcmpfn volatile g_strcmp = strcmp;
static qsortfn volatile g_qsort = qsort;
/****************************************************************************
* Private Functions
****************************************************************************/
/* A local function's address is R_ARM_FUNCDESC_VALUE, not FUNCDESC -- the
* linker can lay that descriptor out itself. Kept here so the module
* exercises both kinds side by side.
*/
static int cmp_int(const void *a, const void *b)
{
return *(const int *)a - *(const int *)b;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, char *argv[])
{
int v[5] =
{
5, 3, 1, 4, 2
};
int copy[5];
char buf[8];
int seed;
int fails = 0;
int i;
seed = g_atoi((argc > 1) ? argv[1] : "7");
if (seed != 7 && seed != 1 && seed != 2)
{
syslog(LOG_INFO, "[funcdesc] FAIL atoi through a descriptor: %d\n",
seed);
fails++;
}
g_memcpy(copy, v, sizeof(v));
for (i = 0; i < 5; i++)
{
if (copy[i] != v[i])
{
syslog(LOG_INFO, "[funcdesc] FAIL memcpy through a descriptor\n");
fails++;
break;
}
}
g_memcpy(buf, "abcdef", 7);
if (g_strcmp(buf, "abcdef") != 0)
{
syslog(LOG_INFO, "[funcdesc] FAIL strcmp through a descriptor\n");
fails++;
}
/* A manufactured descriptor for qsort, called with a descriptor for a
* function of our own -- so the firmware calls back into module code
* that has to arrive with this module's data base in the FDPIC register.
*/
g_qsort(copy, 5, sizeof(int), cmp_int);
for (i = 0; i < 5; i++)
{
if (copy[i] != i + 1)
{
syslog(LOG_INFO, "[funcdesc] FAIL qsort through a descriptor\n");
fails++;
break;
}
}
syslog(LOG_INFO, "[funcdesc] seed %d, %d failures\n", seed, fails);
return fails == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

View file

@ -0,0 +1,45 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/lazymod.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Linked without -z now (BINDNOW= in the makefile), so its imported function
* descriptors land in DT_JMPREL instead of DT_REL.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <syslog.h>
#include <stdlib.h>
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, char *argv[])
{
int seed = (argc > 1) ? atoi(argv[1]) : 1;
syslog(LOG_INFO, "[lazymod] called through a DT_JMPREL descriptor, "
"seed %d\n", seed);
return 0;
}

View file

@ -0,0 +1,58 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/libcounter.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* A shared library with its own state.
*
* g_calls is the interesting part: it lives in the library's writable
* segment, and each task that loads the library gets a private copy. The
* library's code, meanwhile, is mapped once and executed in place.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <syslog.h>
/****************************************************************************
* Private Data
****************************************************************************/
static int g_calls;
/****************************************************************************
* Public Functions
****************************************************************************/
int counter_bump(int by);
int counter_total(void);
int counter_bump(int by)
{
g_calls += by;
return g_calls;
}
int counter_total(void)
{
return g_calls;
}

View file

@ -0,0 +1,160 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/libshape.cpp
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* A C++ shared library, executed in place out of flash.
*
* The point of this file is g_registry. It is a global object with a real
* constructor, and the constructor is the only thing that ever writes
* m_magic. If the loader does not walk DT_INIT_ARRAY, the object simply
* stays in .bss and every field reads back zero -- the library still loads,
* still links, and still runs, and quietly answers wrong. That is why the
* demo checks for a magic rather than just printing a total: the failure
* this is here to catch does not announce itself.
*
* m_total is the second half: it lives in the library's writable segment,
* which is copied once per running instance, so two tasks sharing this
* library's flash-resident code still count independently.
*/
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#define SHAPE_MAGIC 0x5ba9e0
class Registry
{
public:
Registry() : m_magic(SHAPE_MAGIC), m_total(0), m_adds(0)
{
m_marker[0] = '\0';
syslog(LOG_INFO, " [libshape] Registry() ran\n");
}
/* Runs last of the two objects, because destruction mirrors construction
* and this library was constructed first. So a marker written here is
* evidence that the whole DT_FINI_ARRAY chain ran, not just the module's
* half -- which is why the marker is written from the library rather than
* from the module that knows the path.
*/
~Registry()
{
syslog(LOG_INFO, " [libshape] ~Registry() ran after %d adds\n", m_adds);
if (m_marker[0] != '\0')
{
char text[16];
int len;
int fd;
len = snprintf(text, sizeof(text), "%d", m_total);
fd = open(m_marker, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd >= 0)
{
/* xipfs wants the size declared up front so it can reserve one
* contiguous extent.
*/
if (ftruncate(fd, len) >= 0)
{
write(fd, text, len);
}
close(fd);
}
else
{
syslog(LOG_INFO, " [libshape] marker %s failed\n", m_marker);
}
}
}
/* Where ~Registry() should record its final total. Optional: the demo
* does not set one and simply logs instead.
*/
void marker(const char *path)
{
strlcpy(m_marker, path, sizeof(m_marker));
}
bool constructed() const
{
return m_magic == SHAPE_MAGIC;
}
int add(int by)
{
m_adds++;
m_total += by;
return m_total;
}
int total() const
{
return m_total;
}
private:
int m_magic;
int m_total;
int m_adds;
char m_marker[64];
};
static Registry g_registry;
/* C linkage, because the module imports these by name and the loader
* matches dynamic symbols as plain strings.
*/
extern "C"
{
int shape_add(int by);
int shape_total(void);
bool shape_constructed(void);
void shape_marker(const char *path);
}
int shape_add(int by)
{
return g_registry.add(by);
}
void shape_marker(const char *path)
{
g_registry.marker(path);
}
int shape_total(void)
{
return g_registry.total();
}
bool shape_constructed(void)
{
return g_registry.constructed();
}

View file

@ -0,0 +1,40 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/missingsym.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* A module that imports a firmware symbol which does not exist. It links
* cleanly -- the symbol simply becomes an undefined import resolved at load
* -- so the loader is the only thing that can catch it, when resolution
* fails rather than at link time. This is why the build runs fdpic-verify
* by default; this module is the one that deliberately does not pass it, so
* it is linked without that check.
*/
/****************************************************************************
* Public Functions
****************************************************************************/
extern int __xipfs_test_nonexistent(int value);
int main(int argc, char *argv[])
{
return __xipfs_test_nonexistent(argc);
}

View file

@ -0,0 +1,89 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/qsorter.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Demonstrates the two things worth knowing about NuttX FDPIC modules.
*
* 1. qsort() runs in the firmware and calls back into compare(), which
* lives here. That works because the firmware reserves the FDPIC
* register, so this module's data base survives the call in, and
* because libc resolves the callback descriptor on the way back out.
*
* 2. g_data is module data. Every running instance gets a private copy,
* while the code itself is shared and executed in place from flash.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define N 8
/****************************************************************************
* Private Data
****************************************************************************/
static int g_data[N];
/****************************************************************************
* Private Functions
****************************************************************************/
static int compare(const void *a, const void *b)
{
return *(const int *)a - *(const int *)b;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int main(int argc, char *argv[])
{
int seed = (argc > 1) ? atoi(argv[1]) : 0;
int i;
for (i = 0; i < N; i++)
{
g_data[i] = (N - i) * 10 + seed;
}
/* Overlap with any other instance, so shared data would show up as
* corruption rather than passing by luck.
*/
usleep(300000);
qsort(g_data, N, sizeof(int), compare);
syslog(LOG_INFO, "[inst %d] %d %d %d %d %d %d %d %d\n", seed,
g_data[0], g_data[1], g_data[2], g_data[3],
g_data[4], g_data[5], g_data[6], g_data[7]);
return 0;
}

View file

@ -0,0 +1,68 @@
/****************************************************************************
* apps/examples/fdpicxip/modules/user.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Uses libcounter.so. Two instances run concurrently: if the library's
* data were shared between them the totals would interleave.
*
* libcounter is also a *leaf* library -- it calls nothing outside itself,
* so it has no PLT and therefore no DT_PLTGOT. The loader has to fall back
* to PT_DYNAMIC vaddr + memsz to find its GOT. If that fallback is wrong
* the library cannot reach its own globals, which is exactly what the total
* below would expose.
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
/****************************************************************************
* Public Functions
****************************************************************************/
extern int counter_bump(int by);
extern int counter_total(void);
int main(int argc, char *argv[])
{
int seed = (argc > 1) ? atoi(argv[1]) : 0;
int i;
for (i = 0; i < 3; i++)
{
counter_bump(seed);
usleep(100000);
}
syslog(LOG_INFO, "[user %d] library total = %d (expected %d) -- %s\n",
seed, counter_total(), seed * 3,
counter_total() == seed * 3 ? "PASS" : "FAIL");
/* Reported through the exit status as well as the log, so a test can
* assert on it rather than a human reading the console.
*/
return counter_total() == seed * 3 ? EXIT_SUCCESS : EXIT_FAILURE;
}

View file

@ -0,0 +1,268 @@
/****************************************************************************
* apps/examples/fdpicxip/qsorter_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from qsorter.fdpic -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_qsorter_nxf[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0xa1, 0x02, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x11, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00,
0x58, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00,
0x58, 0x13, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x58, 0x03, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0xe0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x14, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
0xa1, 0x02, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x1f, 0x00, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00, 0x75,
0x73, 0x6c, 0x65, 0x65, 0x70, 0x00, 0x71, 0x73, 0x6f, 0x72, 0x74, 0x00,
0x73, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46,
0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00,
0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e,
0x44, 0x5f, 0x5f, 0x00, 0x14, 0x14, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
0xec, 0x13, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xf4, 0x13, 0x00, 0x00,
0xa4, 0x08, 0x00, 0x00, 0xfc, 0x13, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00,
0x04, 0x14, 0x00, 0x00, 0xa4, 0x0d, 0x00, 0x00, 0x0c, 0x14, 0x00, 0x00,
0xa4, 0x02, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x14, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x1c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x24, 0x00, 0x00, 0x00,
0x70, 0xb5, 0x01, 0x28, 0x4e, 0x46, 0x88, 0xb0, 0x34, 0xdd, 0x48, 0x68,
0xff, 0xf7, 0xee, 0xff, 0xb1, 0x46, 0x1a, 0x4b, 0x00, 0xf1, 0x50, 0x05,
0x59, 0xf8, 0x03, 0x30, 0x43, 0xf8, 0x04, 0x5b, 0x0a, 0x3d, 0x85, 0x42,
0xfa, 0xd1, 0x14, 0x48, 0xff, 0xf7, 0xc2, 0xff, 0xb1, 0x46, 0x13, 0x4b,
0x04, 0x22, 0x59, 0xf8, 0x03, 0x40, 0x12, 0x4b, 0x20, 0x46, 0x4b, 0x44,
0x08, 0x21, 0xff, 0xf7, 0xc1, 0xff, 0xe3, 0x69, 0x0f, 0x49, 0x06, 0x93,
0xa3, 0x69, 0xb1, 0x46, 0x05, 0x93, 0x63, 0x69, 0x2a, 0x46, 0x04, 0x93,
0x23, 0x69, 0x06, 0x20, 0x03, 0x93, 0xe3, 0x68, 0x79, 0x44, 0x02, 0x93,
0xa3, 0x68, 0x01, 0x93, 0x63, 0x68, 0x00, 0x93, 0x23, 0x68, 0xff, 0xf7,
0xb5, 0xff, 0x00, 0x20, 0x08, 0xb0, 0x70, 0xbd, 0x00, 0x20, 0xcc, 0xe7,
0xe0, 0x93, 0x04, 0x00, 0x34, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0x0b, 0x68, 0xc0, 0x1a, 0x70, 0x47,
0x5b, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x25, 0x64, 0x5d, 0x20, 0x25, 0x64,
0x20, 0x25, 0x64, 0x20, 0x25, 0x64, 0x20, 0x25, 0x64, 0x20, 0x25, 0x64,
0x20, 0x25, 0x64, 0x20, 0x25, 0x64, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00,
0xe0, 0x13, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0xe0, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfb, 0xff, 0xff, 0x6f, 0x01, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xff, 0x6f,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x18, 0x14, 0x00, 0x00, 0x47, 0x43, 0x43, 0x3a, 0x20, 0x28, 0x41, 0x72,
0x6d, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68,
0x61, 0x69, 0x6e, 0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x52, 0x65, 0x6c,
0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x6d,
0x2d, 0x31, 0x35, 0x2e, 0x38, 0x36, 0x29, 0x29, 0x20, 0x31, 0x35, 0x2e,
0x32, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x32, 0x35, 0x31, 0x32, 0x30, 0x33,
0x00, 0x41, 0x2c, 0x00, 0x00, 0x00, 0x61, 0x65, 0x61, 0x62, 0x69, 0x00,
0x01, 0x22, 0x00, 0x00, 0x00, 0x05, 0x37, 0x2d, 0x4d, 0x00, 0x06, 0x0a,
0x07, 0x4d, 0x09, 0x02, 0x12, 0x04, 0x14, 0x01, 0x15, 0x01, 0x17, 0x03,
0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1e, 0x04, 0x22, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x58, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x13, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff,
0x0b, 0x00, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x00, 0x00,
0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x16, 0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x00, 0x18, 0x14, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x00, 0x00,
0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00,
0x23, 0x00, 0x00, 0x00, 0x18, 0x14, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff, 0x2a, 0x00, 0x00, 0x00,
0x58, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf1, 0xff,
0x33, 0x00, 0x00, 0x00, 0xe0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x16, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00,
0x74, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x8c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x16, 0x00, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x56, 0x00, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00, 0x6b, 0x00, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x73, 0x6f,
0x72, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x24, 0x74, 0x00, 0x63, 0x6f,
0x6d, 0x70, 0x61, 0x72, 0x65, 0x00, 0x24, 0x64, 0x00, 0x2e, 0x4c, 0x41,
0x4e, 0x43, 0x48, 0x4f, 0x52, 0x30, 0x00, 0x67, 0x5f, 0x64, 0x61, 0x74,
0x61, 0x00, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x00, 0x5f,
0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45,
0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x00, 0x75, 0x73, 0x6c,
0x65, 0x65, 0x70, 0x00, 0x71, 0x73, 0x6f, 0x72, 0x74, 0x00, 0x5f, 0x5f,
0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f,
0x5f, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46,
0x49, 0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00,
0x73, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00,
0x00, 0x2e, 0x73, 0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x74,
0x72, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74,
0x61, 0x62, 0x00, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x00, 0x2e, 0x64, 0x79,
0x6e, 0x73, 0x79, 0x6d, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x74, 0x72,
0x00, 0x2e, 0x72, 0x65, 0x6c, 0x2e, 0x64, 0x79, 0x6e, 0x00, 0x2e, 0x70,
0x6c, 0x74, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f,
0x64, 0x61, 0x74, 0x61, 0x00, 0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75,
0x70, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e,
0x67, 0x6f, 0x74, 0x00, 0x2e, 0x62, 0x73, 0x73, 0x00, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x2e, 0x41, 0x52, 0x4d, 0x2e, 0x61,
0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x29, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00,
0x50, 0x02, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0xa0, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x32, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00,
0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x56, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x58, 0x13, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0xe0, 0x13, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x18, 0x14, 0x00, 0x00,
0x18, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00,
0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x8c, 0x04, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00,
0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_qsorter_nxf_len = 2768;

View file

@ -0,0 +1,265 @@
/****************************************************************************
* apps/examples/fdpicxip/user_bin.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Generated from user.fdpic -- do not edit.
*
* An FDPIC module, embedded so the demo has something to load without
* needing a filesystem populated from the host first.
*/
/****************************************************************************
* Public Data
****************************************************************************/
static const unsigned char g_user[] =
{
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
0xd1, 0x02, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x2c, 0x08, 0x00, 0x00,
0x00, 0x02, 0x00, 0x05, 0x34, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00,
0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00,
0x94, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00,
0x94, 0x13, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x94, 0x03, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00,
0x90, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x51, 0xe5, 0x74, 0x64, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x6c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
0xd1, 0x02, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x42, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x00,
0x75, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x00, 0x63, 0x6f, 0x75, 0x6e, 0x74,
0x65, 0x72, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00, 0x73, 0x79, 0x73,
0x6c, 0x6f, 0x67, 0x00, 0x6c, 0x69, 0x62, 0x63, 0x6f, 0x75, 0x6e, 0x74,
0x65, 0x72, 0x2e, 0x73, 0x6f, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49,
0x58, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00, 0x5f,
0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44,
0x5f, 0x5f, 0x00, 0x00, 0x30, 0x14, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00,
0x38, 0x14, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00,
0xa4, 0x08, 0x00, 0x00, 0x48, 0x14, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00,
0x50, 0x14, 0x00, 0x00, 0xa4, 0x0d, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x0c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x14, 0x00, 0x00, 0x00,
0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90,
0xdc, 0xf8, 0x00, 0xf0, 0x1c, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0,
0x0c, 0xeb, 0x09, 0x0c, 0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0,
0x24, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x0c, 0xc0, 0x0c, 0xeb, 0x09, 0x0c,
0xdc, 0xf8, 0x04, 0x90, 0xdc, 0xf8, 0x00, 0xf0, 0x2c, 0x00, 0x00, 0x00,
0xf0, 0xb5, 0x01, 0x28, 0x4c, 0x46, 0x85, 0xb0, 0x2f, 0xdd, 0x48, 0x68,
0xff, 0xf7, 0xee, 0xff, 0xa1, 0x46, 0x05, 0x46, 0x03, 0x26, 0x17, 0x4b,
0x03, 0x93, 0x28, 0x46, 0xff, 0xf7, 0xc8, 0xff, 0x03, 0x98, 0xa1, 0x46,
0xff, 0xf7, 0xba, 0xff, 0x01, 0x3e, 0xa1, 0x46, 0xf5, 0xd1, 0xff, 0xf7,
0xc9, 0xff, 0xa1, 0x46, 0x07, 0x46, 0xff, 0xf7, 0xc5, 0xff, 0x05, 0xeb,
0x45, 0x06, 0x86, 0x42, 0xa1, 0x46, 0x14, 0xd1, 0x0c, 0x4a, 0x7a, 0x44,
0x0c, 0x49, 0x3b, 0x46, 0xcd, 0xe9, 0x00, 0x62, 0x79, 0x44, 0x2a, 0x46,
0x06, 0x20, 0xff, 0xf7, 0xbf, 0xff, 0xa1, 0x46, 0xff, 0xf7, 0xb2, 0xff,
0x30, 0x1a, 0x18, 0xbf, 0x01, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x25,
0xd2, 0xe7, 0x04, 0x4a, 0x7a, 0x44, 0xe9, 0xe7, 0xa0, 0x86, 0x01, 0x00,
0x3a, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
0x50, 0x41, 0x53, 0x53, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x00, 0x5b, 0x75,
0x73, 0x65, 0x72, 0x20, 0x25, 0x64, 0x5d, 0x20, 0x6c, 0x69, 0x62, 0x72,
0x61, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20,
0x25, 0x64, 0x20, 0x28, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64,
0x20, 0x25, 0x64, 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x25, 0x73, 0x0a, 0x00,
0x24, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0xe0, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x28, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x6f,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x43, 0x43, 0x3a,
0x20, 0x28, 0x41, 0x72, 0x6d, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x54, 0x6f,
0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x31, 0x35, 0x2e, 0x32,
0x2e, 0x52, 0x65, 0x6c, 0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64,
0x20, 0x61, 0x72, 0x6d, 0x2d, 0x31, 0x35, 0x2e, 0x38, 0x36, 0x29, 0x29,
0x20, 0x31, 0x35, 0x2e, 0x32, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x32, 0x35,
0x31, 0x32, 0x30, 0x33, 0x00, 0x41, 0x2c, 0x00, 0x00, 0x00, 0x61, 0x65,
0x61, 0x62, 0x69, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x05, 0x37, 0x2d,
0x4d, 0x00, 0x06, 0x0a, 0x07, 0x4d, 0x09, 0x02, 0x12, 0x04, 0x14, 0x01,
0x15, 0x01, 0x17, 0x03, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1e, 0x04,
0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0x24, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0a, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff,
0x08, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xf1, 0xff,
0x0e, 0x00, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0xf1, 0xff, 0x17, 0x00, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
0x08, 0x00, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00,
0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
0xa4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x08, 0x00, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00,
0xbc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x0b, 0x00, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x5f, 0x00, 0x00, 0x00,
0xd1, 0x02, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x00,
0x64, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x08, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x24, 0x74, 0x00, 0x24,
0x64, 0x00, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x00, 0x5f,
0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45,
0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x00, 0x75, 0x73, 0x6c,
0x65, 0x65, 0x70, 0x00, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f,
0x62, 0x75, 0x6d, 0x70, 0x00, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46,
0x49, 0x58, 0x55, 0x50, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x5f, 0x00, 0x6d,
0x61, 0x69, 0x6e, 0x00, 0x5f, 0x5f, 0x52, 0x4f, 0x46, 0x49, 0x58, 0x55,
0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x5f, 0x00, 0x73, 0x79, 0x73,
0x6c, 0x6f, 0x67, 0x00, 0x61, 0x74, 0x6f, 0x69, 0x00, 0x00, 0x2e, 0x73,
0x79, 0x6d, 0x74, 0x61, 0x62, 0x00, 0x2e, 0x73, 0x74, 0x72, 0x74, 0x61,
0x62, 0x00, 0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00,
0x2e, 0x68, 0x61, 0x73, 0x68, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x79,
0x6d, 0x00, 0x2e, 0x64, 0x79, 0x6e, 0x73, 0x74, 0x72, 0x00, 0x2e, 0x72,
0x65, 0x6c, 0x2e, 0x64, 0x79, 0x6e, 0x00, 0x2e, 0x70, 0x6c, 0x74, 0x00,
0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74,
0x61, 0x00, 0x2e, 0x72, 0x6f, 0x66, 0x69, 0x78, 0x75, 0x70, 0x00, 0x2e,
0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x00, 0x2e, 0x67, 0x6f, 0x74,
0x00, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x2e, 0x41,
0x52, 0x4d, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0xb4, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x21, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00,
0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00,
0x44, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x6c, 0x02, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00,
0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00,
0x54, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x90, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x94, 0x13, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00,
0x90, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x14, 0x00, 0x00,
0x24, 0x04, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00,
0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xcc, 0x04, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x1e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00,
0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const unsigned int g_user_len = 2732;