diff --git a/examples/fdpicxip/CMakeLists.txt b/examples/fdpicxip/CMakeLists.txt new file mode 100644 index 000000000..2af0fc4a8 --- /dev/null +++ b/examples/fdpicxip/CMakeLists.txt @@ -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() diff --git a/examples/fdpicxip/Kconfig b/examples/fdpicxip/Kconfig new file mode 100644 index 000000000..6de10e005 --- /dev/null +++ b/examples/fdpicxip/Kconfig @@ -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 diff --git a/examples/fdpicxip/Make.defs b/examples/fdpicxip/Make.defs new file mode 100644 index 000000000..88acd75f8 --- /dev/null +++ b/examples/fdpicxip/Make.defs @@ -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 diff --git a/examples/fdpicxip/Makefile b/examples/fdpicxip/Makefile new file mode 100644 index 000000000..05f90116c --- /dev/null +++ b/examples/fdpicxip/Makefile @@ -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 diff --git a/examples/fdpicxip/cxxuser_bin.h b/examples/fdpicxip/cxxuser_bin.h new file mode 100644 index 000000000..8baafab00 --- /dev/null +++ b/examples/fdpicxip/cxxuser_bin.h @@ -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; diff --git a/examples/fdpicxip/fdpicxip_main.c b/examples/fdpicxip/fdpicxip_main.c new file mode 100644 index 000000000..5c89f2ae0 --- /dev/null +++ b/examples/fdpicxip/fdpicxip_main.c @@ -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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#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(); +} diff --git a/examples/fdpicxip/lazymod_bin.h b/examples/fdpicxip/lazymod_bin.h new file mode 100644 index 000000000..b2d514312 --- /dev/null +++ b/examples/fdpicxip/lazymod_bin.h @@ -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; diff --git a/examples/fdpicxip/libcounter_bin.h b/examples/fdpicxip/libcounter_bin.h new file mode 100644 index 000000000..9ef92cae7 --- /dev/null +++ b/examples/fdpicxip/libcounter_bin.h @@ -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; diff --git a/examples/fdpicxip/libshape_bin.h b/examples/fdpicxip/libshape_bin.h new file mode 100644 index 000000000..178153308 --- /dev/null +++ b/examples/fdpicxip/libshape_bin.h @@ -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; diff --git a/examples/fdpicxip/modules/.gitignore b/examples/fdpicxip/modules/.gitignore new file mode 100644 index 000000000..8c3555579 --- /dev/null +++ b/examples/fdpicxip/modules/.gitignore @@ -0,0 +1,5 @@ +/*.fdpic +/*.so +/.nuttx-exports +/manyneeded.c +/need*.c diff --git a/examples/fdpicxip/modules/Makefile b/examples/fdpicxip/modules/Makefile new file mode 100644 index 000000000..56dfd7ebb --- /dev/null +++ b/examples/fdpicxip/modules/Makefile @@ -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 diff --git a/examples/fdpicxip/modules/callback.c b/examples/fdpicxip/modules/callback.c new file mode 100644 index 000000000..1a1b33325 --- /dev/null +++ b/examples/fdpicxip/modules/callback.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/modules/cxxuser.cpp b/examples/fdpicxip/modules/cxxuser.cpp new file mode 100644 index 000000000..5c27cf575 --- /dev/null +++ b/examples/fdpicxip/modules/cxxuser.cpp @@ -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 +#include +#include +#include +#include + +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; +} diff --git a/examples/fdpicxip/modules/funcdesc.c b/examples/fdpicxip/modules/funcdesc.c new file mode 100644 index 000000000..850715474 --- /dev/null +++ b/examples/fdpicxip/modules/funcdesc.c @@ -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 +#include +#include + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/modules/lazymod.c b/examples/fdpicxip/modules/lazymod.c new file mode 100644 index 000000000..40a21d6fc --- /dev/null +++ b/examples/fdpicxip/modules/lazymod.c @@ -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 +#include + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/modules/libcounter.c b/examples/fdpicxip/modules/libcounter.c new file mode 100644 index 000000000..7d4c16677 --- /dev/null +++ b/examples/fdpicxip/modules/libcounter.c @@ -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 + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/modules/libshape.cpp b/examples/fdpicxip/modules/libshape.cpp new file mode 100644 index 000000000..1cab840ef --- /dev/null +++ b/examples/fdpicxip/modules/libshape.cpp @@ -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 +#include +#include +#include +#include + +#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(); +} diff --git a/examples/fdpicxip/modules/missingsym.c b/examples/fdpicxip/modules/missingsym.c new file mode 100644 index 000000000..184675dde --- /dev/null +++ b/examples/fdpicxip/modules/missingsym.c @@ -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); +} diff --git a/examples/fdpicxip/modules/qsorter.c b/examples/fdpicxip/modules/qsorter.c new file mode 100644 index 000000000..3dead3f03 --- /dev/null +++ b/examples/fdpicxip/modules/qsorter.c @@ -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 +#include +#include + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/modules/user.c b/examples/fdpicxip/modules/user.c new file mode 100644 index 000000000..bd82dbf31 --- /dev/null +++ b/examples/fdpicxip/modules/user.c @@ -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 +#include +#include + +/**************************************************************************** + * 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; +} diff --git a/examples/fdpicxip/qsorter_bin.h b/examples/fdpicxip/qsorter_bin.h new file mode 100644 index 000000000..6e1f39c00 --- /dev/null +++ b/examples/fdpicxip/qsorter_bin.h @@ -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; diff --git a/examples/fdpicxip/user_bin.h b/examples/fdpicxip/user_bin.h new file mode 100644 index 000000000..fd417418c --- /dev/null +++ b/examples/fdpicxip/user_bin.h @@ -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;