Home
Developer Resources
Technical Articles

QNX Technical Articles

QNX Software Development Platform 7.1: Release Notes

QNX Software Development Platform 7.1: Release Notes

Date of this edition: January 10, 2024


Note: Changes to these notes since July 23, 2020 are highlighted below with this icon: New:

QNX SDP is a cross-compiling and debugging environment, including an IDE and command-line tools, for building binary images and programs for ARM v7 and v8, and x86_64 targets running the QNX Neutrino RTOS 7.1. You can install QNX SDP on the following development hosts:

  • Microsoft Windows 10 Pro 64-bit, or Windows 8.1 Pro 64-bit
  • macOS version 10.14, or 10.15
  • Linux Red Hat Enterprise Linux 7 64-bit, or Ubuntu Desktop 18.04 LTS 64-bit, or Ubuntu Desktop 20.04 LTS 64-bit on x86_64 processors (QNX SDP isn't supported on Linux on ARM processors)

Note:
  • New: You can now install QNX SDP 7.1 on Ubuntu Desktop 20.04 LTS 64-bit development hosts.
  • If you installed an alpha version of this software, uninstall it before installing the production version.
  • We've released the QNX Momentics IDE 7.1 as a separate update; click Add Installation in the QNX Software Center and install the QNX Momentics IDE. You should use this version of the IDE with QNX SDP 7.1. For information about changes to the IDE, see its release notes.
  • New: As of August 6, 2020, the default update policy when you install QNX SDP 7.1 is conservative instead of ultraconservative. For information about changing the update policy, see the myQNX License Manager and QNX Software Center User's Guide.
  • Make sure that Plug and Play OS is disabled in the BIOS before you run QNX Neutrino on your target.

Throughout this document, you may see reference numbers associated with particular issues, changes, etc. When corresponding with our Technical Support staff about a given issue, please quote the relevant reference number. You might also find the reference numbers useful for tracking issues as they become fixed.

Contents

Which platforms does QNX Neutrino RTOS support?

We've validated the QNX Neutrino RTOS on the following platforms:

Silicon Supplier Chipset or Board Name QNX Board Support Package Screen Board Support
Renesas R-CAR V3H QNX SDP 7.1 BSP for Renesas R-Car V3H QNX SDP 7.1 Screen Board Support R-Car V3H
Renesas R-CAR H3 QNX SDP 7.1 BSP for Renesas R-Car H3

QNX SDP 7.1 Screen Board Support R-Car H3

QNX SDP 7.1 Screen Board Support R-Car M3-W HW

QNX SDP 7.1 Screen Board Support R-Car M3-N HW

NXP iMX8QM-MEK QNX SDP 7.1 BSP for i.MX8 QuadMax QNX SDP 7.1 Screen Board Support i.MX8
NXP iMX8QXP QNX SDP 7.1 BSP for i.MX8QXP CPU QNX SDP 7.1 Screen Board Support i.MX8
NXP SabreSmart i.MX6Q QNX SDP 7.1 BSP for i.MX6 SABRE Platform for Smart Devices QNX SDP 7.1 Screen Board Support i.MX6x
Texas Instruments Sitara AM572x QNX SDP 7.1 BSP for AM572 QNX SDP 7.1 Screen Board Support AM572/Jacinto6
Intel Coffee lake QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Kaby lake QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Skylake QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Apollo Lake NUC QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Gemini Lake NUC QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Baytrail (Valleyview) QNX SDP 7.1 BSP for Generic x86-64 (64-bit) QNX SDP 7.1 Screen Board Support Intel
Intel Denverton QNX SDP 7.1 BSP for Generic x86-64 (64-bit) No Screen Board support available.
AMD Ryzen QNX SDP 7.1 BSP for Generic x86-64 (64-bit) No Screen Board support available.
AMD eKabini QNX SDP 7.1 BSP for Generic x86-64 (64-bit) No Screen Board support available.

You can also use the mkqnximage utility to generate a system image for use as a virtual machine. For more information, see its entry in the Utilities Reference.

Weve validated QNX wireless drivers on the following platform combinations:

  • NXP i.MX6 + Cypress Wireless CYW89359 (PCIe)
  • NXP i.MX8XP + Cypress Wireless CYW89359 (PCIe)
  • NXP i.MX8QM + Cypress Wireless CYW89359 (PCIe)
  • Intel x86-64 + Cypress Wireless CYW89359 (PCIe)

We routinely test QNX Wi-Fi drivers using the Wi-Fi Alliance test suite (https://www.wi-fi.org/certification/programs). Test coverage includes a subset of these test suites:

  • Wi-Fi CERTIFIED a/b/g/n Station & Access Point Modes
  • Wi-Fi CERTIFIED ac Station & Access Point Modes
  • Protected Management Frames Station & Access Point Modes
  • Connectivity: Wi-Fi Direct
  • Optimization: Wi-Fi WMM Power Save
  • Access: Station Mode Wi-Fi Protected Setup
  • Access: Access Point Mode Wi-Fi Protected Setup
  • Wi-Fi CERTIFIED WPA3
  • WPA2 Security Improvements
  • Key Reinstallation Vulnerability Detection
Cypress Wireless CYW89359 (PCIe)
Wi-Fi Alliance is always adding new test cases and mandatory requirements. Please Contact Blackberry QNX Customer sales support for any questions regarding the latest WFA Certification status of the CYW89359.

Note: For QNX SDP 7.1 NXP Marvell MX PCIE/SDIO drivers, licensing agreements prevent the distribution of updated firmware. Please contact your QNX representative for support.

What's new in QNX SDP?

What's new: Kernel

  • We now support ARMv8.2 targets.
  • By default, you can now use only secure sigevents that you've registered with MsgRegisterEvent(). There's a new -U option for procnto that lets you use nonregistered events too. Instead of using this option, you can use the _NTO_COF_UNREG_EVENTS flag when you call ConnectAttach() to allow a specific connection to use registered and unregistered events.

    Note:
    • _NTO_COF_UNREG_EVENTS and procnto's -U option are temporary workarounds and will be removed in a future version. You should update your system to use only registered events.
    • The mq_notify() function accepts registered events, but for compatibility with POSIX, it also accepts unregistered events, even if the system as a whole is required to use registered events.

  • Address Space Layout Randomization (ASLR) is now enabled by default.
  • We now save and restore the FPU context in Interrupt Service Routines (ISRs), signal handlers, trace event handlers, and idle handlers. GCC 8 may optimize some non-floating-point operations—especially array operations—by using floating-point (FP) registers and operations (e.g., using SIMD). This means that although there is no C code using FP operations, the generated opcodes may use them, violating the requirement to not touch floating point registers in ISRs, signal handlers, trace event handlers, and idle handlers, leading to corruption of the FP state in user threads, and doing so in a way that is extremely difficult to debug.

    Rather than require the use of architecture-specific options (-mgeneral-regs-only for AArch64 or x86_64; there isn't such an option for ARMLE-v7) to force the compiler not to use these registers for an entire compilation unit, we decided to save all FP registers if and when an ISR first accesses any FP register, and to save the FP registers on entering a signal handler, trace event handler, or idle handler. We restore all the FP registers after leaving the ISR or handler. This has the following effects:

    • It removes the danger of corrupting the FP registers by optimized code generated by the compiler despite the lack of any FP operations in the ISR or handler's source code.
    • It allows the use of FP operations inside an ISR or handler. For an ISR, there's a one-time cost each time the ISR is invoked if there is any use of floating-point registers.

    It's still possible to force an ISR to not use FP using the compiler options mentioned above (and therefore guarantee avoiding the performance hit of saving the FP registers), but if the ISR is in a C file that also has functions that explicitly use floating point, or would benefit from these optimizations, you can move the ISR to its own C file and use the appropriate flag to compile that file, but you need to be careful with preprocessor macros and calling functions that aren't in the C file.

  • There are some new mechanisms for improving the security of shared memory objects:
    • shared memory handles that provide a safe, secure and efficient way to share buffers among processes without the use of public paths
    • a way for the creator of a shared memory object to seal a shared memory object to prevent other processes from changing the physical layout of the object, even if these processes are allowed to change the object's contents
    • a way for the creator of a shared memory object to revoke access to the object such that it can be safely destroyed or reused for other purposes. Without the revocable flag, a shared memory object is cleaned up only when the last process removes a mapping to it, which means that the creator has no control over destruction and reuse.

    For more information, see Secure Buffer Management in the Shared Memory chapter of the QNX Neutrino Programmer's Guide.

  • The following security trace events are new:
    Event Emitted when:
    _NTO_TRACE_SEC_PERM_LOOKUP secpol_get_permission() is called to get a handle to a permission that's associated with a custom class
    _NTO_TRACE_SEC_PERM_TEST secpol_check_permission() is called to test if a given type has a permission
    _NTO_TRACE_SEC_UNREG_EVENT MsgDeliverEvent() is called with an unregistered sigevent

    For more information, see the System Analysis Toolkit (SAT) User's Guide.

  • We've made the following changes to named semaphores:

    • We now support anonymous named semaphores; for more information see sem_open() in the C Library Reference.
    • If you create several named semaphores with the same name, sem_open() returns a different virtual address for each semaphore; this behavior diverges from the POSIX standard.
    • Named semaphores are no longer slower than unnamed semaphores.
    • Named semaphores are no longer supported over Qnet.

  • We've discontinued the _NTO_PF_NO_LIMITS process flag.
  • The path manager now rejects all thread-control commands made through the /proc filesystem, except for the following:
    • _NTO_TCTL_NAME
    • _NTO_TCTL_RUNMASK
    • _NTO_TCTL_RUNMASK_GET_AND_SET
    • _NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT
    • _NTO_TCTL_ONE_THREAD_CONT
    • _NTO_TCTL_ONE_THREAD_HOLD
    • _NTO_TCTL_THREADS_CONT
    • _NTO_TCTL_THREADS_HOLD

    (Ref# J2221706, J2764447)

  • We now support the jemalloc memory allocator as an alternative to the default allocator. To use jemalloc, do one of the following:
    • Set LD_PRELOAD (e.g., LD_PRELOAD=libjemalloc.so pidin).
    • Build and link against jemalloc (e.g., qcc ... -ljemalloc ...).

    Note: The jemalloc library is experimental and isn't certified for use in safety applications.

    For more information, see the documentation for jemalloc at http://jemalloc.net/.

What's new: Runtime Linker

We've moved the runtime linker, ldd, out of libc.so and into ldqnx.so.2 for 32-bit targets, and ldqnx-64.so.2 for 64-bit targets.

The C Library is typically in /proc/boot in an OS image, but programs expect to find the runtime linker in /usr/lib, so you formerly had to set up a link such as the following in your mkifs buildfiles:

  • procmgr_symlink ../../proc/boot/libc.so /usr/lib/ldqnx.so.2
  • [type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so.4
  • procmgr_symlink ../../proc/boot/libc.so /usr/lib/ldqnx-64.so.2
  • [type=link] /usr/lib/ldqnx-64.so.2=/proc/boot/libc.so.4

Now, if you mount your IFS at / (the default), you should put ldqnx.so.2 or ldqnx-64.so.2 directly in /usr/lib and delete the links.

If you mount the IFS elsewhere, you should include ldqnx.so.2 or ldqnx-64.so.2 in your OS image and create a process manager symlink from wherever you put the file to /usr/lib/ldqnx.so.2 or /usr/lib/ldqnx-64.so.2. For example:

  • procmgr_symlink /my_ifs/ldqnx.so.2 /usr/lib/ldqnx.so.2
  • procmgr_symlink /my_ifs/ldqnx-64.so.2 /usr/lib/ldqnx-64.so.2

What's new: Compiler, tools, and utilities


Note: You need to recompile all your binaries.

The QNX Momentics Tool Suite 7.1 includes the following versions of the compiler and tools:

  • GCC 8.3 tool chain
  • GDB 8.2
  • Binutils 2.32

We now support C++14 and C++17. Our version of gcov is compatible with version 1.15 or later of lcov, as described below.

For details about what's new in GCC 8, see https://gcc.gnu.org/gcc-8/changes.html.

The following utilities are new:

fuser
List the process IDs of all processes that have one or more files open
kdserver
Kernel dump parser
mkqnximage
Generate a system image for use as a virtual machine

Other changes include the following:

canctl
The following options are new:
  • -c — set the reference clock frequency and bit timings
  • -i — get device information
  • -R — read extended CAN messages continuously, with a specified delay between each read
  • -s — get device statistics

gcc
  • We've enabled the -fasynchronous-unwind-tables option by default for AArch64 targets. The purpose of this option is to provide enhanced diagnostics in the absence of debug information. It results in a slight increase in size of stripped binaries.
  • GCC 8 now warns you if the constructor that it chooses to satisfy an empty initializer list of a class or struct is marked as explicit. (Ref# J2636749)
  • We now provide a shared version of GGC's low-level runtime library, libgcc_s (see https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc). You need to include libgcc_s.so.1 in OS images.
gcov
New: If you want to use lcov (which we don't provide) on a Linux host to view coverage data, configure it to work with our version of gcov by adding a line such as the following to your .lcovrc file:
geninfo_gcov_tool=ntox86_64-gcov
  

You need to use version 1.15 or later of lcov.

gdb
The gdb debugger now supports disconnecting from the target when the connection was made via the IDE or pdebug. (Ref# J382754)
gzip, gunzip
QNX Neutrino now uses the Toybox versions of gzip and gunzip.
ldd
We've moved the runtime linker out of libc.so and into its own library, libldqnx.so. For more information, see "Runtime linker." Because of this change, we've changed the version number of libc.so to 5.
mkbuild
The mkbuild utility no longer fails with a not found error on Linux, macOS, and Windows host environments. (Ref# J1683331, J2656387)
mk*fs
The following attributes are new:
  • drop — specify patterns of file names that you want to ignore when recursively importing host directories.
  • include — include one buildfile in another.
mkifs
  • If you don't specify the CPU type in a virtual attribute, and the PROCESSOR environment variable isn't already set, mkifs now assumes the CPU type is x86_64.
  • We've documented the mount attribute. You can use this with the prefix attribute to reduce the time spent searching for files on large systems.
mkqnx6fsimg
  • There's a new acl attribute that lets you specify the access control list for a file or directory.
  • The entry for mkqnx6fsimg in the Utilities Reference now says that the default value of the blksize attribute is 4096 bytes.
mount
There's a new -f option that displays the mount flags and options.
pidin
For the -F and -f options, a new format character k displays the abilities of a process.
smmuman
SMMUMAN now parses textual substitutions on the command line, instead of just in its configuration file. (Ref# J2718602)
top
There's a new -z option that lets you specify the number of threads to display.
zcat
QNX Neutrino now uses the Toybox version of zcat.

For more information, see the Utilities Reference.

Toybox

This release ships with Toybox command line utilities version 0.8.2.

QNX Neutrino uses the Toybox versions of gzip, gunzip, and zcat.

Using otherToyboxcommands to replace their equivalentQNX Neutrinoutilities is optional, buttoyboxcommands will replace their equivalentQNX Neutrinoutilities in a future release.

For more information, see the toybox entry in the Utilities Reference.

What's new: Libraries and header files


Note: The version number for libc.so is now 5.

The new functions and data structures in the QNX Neutrino libraries include:

asprintf()
Print formatted output into an allocated string
dprintf()
Write output to a file associated with a file descriptor
faccessat()
Check if a file or directory at a given location can be accessed
fchecktrust()
Determine if a file is trusted
fchmodat()
Change the permissions for a file at a given location
fchownat()
Change the user ID and group ID of a file at a given location
ffsl(), ffsll()
Find the first bit that's set in a bit string
fls(), flsl(), flsll()
Find the last bit that's set in a bit string
iofunc_mmap_default_ext(), iofunc_mmap_ext()
Extended handlers for _IO_MMAP messages.
linkat()
Create a link to an existing file located at a given path
mkdirat()
Create a directory at a given location
mkfifoat()
Create a FIFO special file at a given location
mknodat()
Make a new filesystem entry at a given location
mmap_handle()
Similar to mmap(), but takes a handle for a shared memory object instead of a file descriptor.
openat()
Open a file at a given location
open_ext()
Open a path and set connection flags
posix_spawnattr_getaslr()
Return the Address Space Layout Randomization (ASLR) setting from a posix_spawn() attribute structure
posix_spawnattr_setaslr()
Control how the Address Space Layout Randomization (ASLR) setting of a child is determined
posix_spawnattr_setcwd_np()
Set the current working directory attribute in a spawn attributes object
procmgr_ability_name()
Get the name of a custom ability
procmgr_session_ext()
Provide process manager session support
readlinkat()
Place the contents of a symbolic link found at a given location into a buffer
resmgr_msgget()
Read a message from a client, from local data, or both
resmgr_msggetsize()
Get the size of a message and its local and remote parts
resmgr_msggetv()
Read a message from a client, from local data, or both
New: setgroupspid()
Set supplementary group IDs for a child process. This function lets you modify a child process's supplementary group set without having to set the parent's groups before spawning. It's similar to setgroups() but takes an additional pid argument. The process identified by pid must be a child of the calling process that was created by posix_spawn() or posix_spawnp() with the POSIX_SPAWN_HOLD flag set, and must not have yet received a SIGCONT.
SETIOV_CONST()
A variant of SETIOV()
shm_create_handle()
Create a handle so a specific process can access a shared memory object
shm_delete_handle()
Delete a handle to a shared memory object
shm_open_handle()
Open a shared memory object based on a handle
shm_revoke()
Revoke access to shared memory
strndup()
Create a duplicate of a string, up to a maximum length
symlinkat()
Create a symbolic link to a path, at a given location
unlinkat()
Remove a link to a file at a given location
vasprintf()
Print formatted output into an allocated string (varargs)
vdprintf()
Write output to a file associated with a file descriptor (varargs)
wcwidth()
Determine the number of column positions of a wide character

The following functions are now in libregex instead of libc.a:

  • re_comp()
  • re_exec()
  • regcomp()
  • regerror()
  • regexec()
  • regfree()

The following functions that were previously only in libc.a are now also in libc.so:

  • alphasort()
  • cfgopen()
  • encrypt()
  • endfsent()
  • endutent()
  • fcfgopen()
  • forkpty()
  • ftw()
  • getfsent()
  • getfsfile()
  • getfsspec()
  • getgrouplist()
  • getlogin()
  • getlogin_r()
  • getpass()
  • getutent()
  • getutid()
  • getutline()
  • getw()
  • getwd()
  • glob()
  • globfree()
  • grantpt()
  • hwi_find_item()
  • hwi_find_tag()
  • hwi_next_item()
  • hwi_next_tag()
  • hwi_off2tag()
  • hwi_tag2off()
  • initstate()
  • insque()
  • login_tty()
  • modem_open()
  • modem_read()
  • modem_script()
  • modem_write()
  • nftw()
  • openpty()
  • pclose()
  • popen()
  • posix_openpt()
  • ptsname()
  • ptsname_r()
  • pututline()
  • putw()
  • qnx_crypt()
  • random()
  • rdchk()
  • remque()
  • _scalloc()
  • scandir()
  • sched_get_priority_adjust()
  • setfsent()
  • setkey()
  • setstate()
  • setutent()
  • _sfree()
  • slogb()
  • slogf()
  • slogi()
  • _smalloc()
  • srandom()
  • _srealloc()
  • strptime()
  • unlockpt()
  • utmpname()
  • vslogf()
  • wordexp()
  • wordfree()

It's now safe to call the following functions from an interrupt service routine:

  • acosh(), acoshf(), acoshl()
  • acos(), acosf(), acosl()
  • asinh(), asinhf(), asinhl()
  • asin(), asinf(), asinl()
  • atan2(), atan2f(), atan2l()
  • atanh(), atanhf(), atanhl()
  • atan(), atanf(), atanl()
  • cabs(), cabsf(), cabsl()
  • cacosh(), cacoshf(), cacoshl()
  • cacos(), cacosf(), cacosl()
  • carg(), cargf(), cargl()
  • casinh(), casinhf(), casinhl()
  • casin(), casinf(), casinl()
  • catanh(), catanhf(), catanhl()
  • catan(), catanf(), catanl()
  • cbrt(), cbrtf(), cbrtl()
  • ccosh(), ccoshf(), ccoshl()
  • ccos(), ccosf(), ccosl()
  • ceil(), ceilf(), ceill()
  • cexp(), cexpf(), cexpl()
  • cimag(), cimagf(), cimagl()
  • clog(), clogf(), clogl()
  • conj(), conjf(), conjl()
  • copysign(), copysignf(), copysignl()
  • cosh(), coshf(), coshl()
  • cos(), cosf(), cosl()
  • cpow(), cpowf(), cpowl()
  • cproj(), cprojf(), cprojl()
  • creal(), crealf(), creall()
  • csinh(), csinhf(), csinhl()
  • csin(), csinf(), csinl()
  • csqrt(), csqrtf(), csqrtl()
  • ctanh(), ctanhf(), ctanhl()
  • ctan(), ctanf(), ctanl()
  • erfc(), erfcf(), erfcl()
  • erf(), erff(), erfl()
  • exp2(), exp2f(), exp2l()
  • expm1(), expm1f(), expm1l()
  • exp(), expf(), expl()
  • fabs(), fabsf(), fabsl()
  • fdim(), fdimf(), fdiml()
  • feclearexcept()
  • fedisableexcept()
  • feenableexcept()
  • fegetenv()
  • fegetexceptflag()
  • fegetprec()
  • fegetround()
  • feholdexcept()
  • feraiseexcept()
  • fesetenv()
  • fesetexceptflag()
  • fesetprec()
  • fesetround()
  • fetestexcept()
  • feupdateenv()
  • floor(), floorf(), floorl()
  • fma(), fmaf(), fmal()
  • fmax(), fmaxf(), fmaxl()
  • fmin(), fminf(), fminl()
  • fmod(), fmodf(), fmodl()
  • fpclassify()
  • frexp(), frexpf(), frexpl()
  • hypot(), hypotf(), hypotl()
  • ilogb(), ilogbf(), ilogbl()
  • isfinite()
  • isgreaterequal()
  • isgreater()
  • isinf()
  • islessequal()
  • islessgreater()
  • isless()
  • isnan()
  • isnormal()
  • isunordered()
  • j0(), j0f()
  • j1(), j1f()
  • jn(), jnf()
  • ldexp(), ldexpf(), ldexpl()
  • lgamma(), lgamma_r(), lgammaf(), lgammaf_r(), lgammal(), lgammal_r()
  • llrint(), llrintf(), llrintl()
  • llround(), llroundf(), llroundl()
  • log10(), log10f(), log10l()
  • log1p(), log1pf(), log1pl()
  • log2(), log2f(), log2l()
  • logb(), logbf(), logbl()
  • log(), logf(), logl()
  • lrint(), lrintf(), lrintl()
  • lround(), lroundf(), lroundl()
  • modf(), modff(), modfl()
  • nan(), nanf(), nanl()
  • nearbyint(), nearbyintf(), nearbyintl()
  • nextafter(), nextafterf(), nextafterl()
  • nexttoward(), nexttowardf(), nexttowardl()
  • pow(), powf(), powl()
  • remainder(), remainderf(), remainderl()
  • remquo(), remquof(), remquol()
  • rint(), rintf(), rintl()
  • round(), roundf(), roundl()
  • scalbln(), scalblnf(), scalblnl()
  • scalbn(), scalbnf(), scalbnl()
  • scalb()
  • signbit()
  • sinh(), sinhf(), sinhl()
  • sin(), sinf(), sinl()
  • slog2fa()
  • slog2f()
  • snprintf()
  • sprintf()
  • sqrt(), sqrtf(), sqrtl()
  • sscanf()
  • strtod(), strtof(), strtold()
  • swprintf()
  • swscanf()
  • tanh(), tanhf(), tanhl()
  • tan(), tanf(), tanl()
  • tgamma(), tgammaf(), tgammal()
  • trunc(), truncf(), truncl()
  • vslog2fa()
  • vslog2f()
  • vsnprintf()
  • vsprintf()
  • vsscanf()
  • vswprintf()
  • vswscanf()
  • wcstod(), wcstof(), wcstold()
  • y0(), y0f()
  • y1(), y1f()
  • yn(), ynf()

It's now safe to call the following functions from a signal handler:

  • acosh(), acoshf(), acoshl()
  • acos(), acosf(), acosl()
  • asinh(), asinhf(), asinhl()
  • asin(), asinf(), asinl()
  • atan2(), atan2f(), atan2l()
  • atanh(), atanhf(), atanhl()
  • atan(), atanf(), atanl()
  • cabs(), cabsf(), cabsl()
  • cacosh(), cacoshf(), cacoshl()
  • cacos(), cacosf(), cacosl()
  • carg(), cargf(), cargl()
  • casinh(), casinhf(), casinhl()
  • casin(), casinf(), casinl()
  • catanh(), catanhf(), catanhl()
  • catan(), catanf(), catanl()
  • cbrt(), cbrtf(), cbrtl()
  • ccosh(), ccoshf(), ccoshl()
  • ccos(), ccosf(), ccosl()
  • ceil(), ceilf(), ceill()
  • cexp(), cexpf(), cexpl()
  • cimag(), cimagf(), cimagl()
  • clog(), clogf(), clogl()
  • conj(), conjf(), conjl()
  • copysign(), copysignf(), copysignl()
  • cosh(), coshf(), coshl()
  • cos(), cosf(), cosl()
  • cpow(), cpowf(), cpowl()
  • cproj(), cprojf(), cprojl()
  • creal(), crealf(), creall()
  • csinh(), csinhf(), csinhl()
  • csin(), csinf(), csinl()
  • csqrt(), csqrtf(), csqrtl()
  • ctanh(), ctanhf(), ctanhl()
  • ctan(), ctanf(), ctanl()
  • erfc(), erfcf(), erfcl()
  • erf(), erff(), erfl()
  • exp2(), exp2f(), exp2l()
  • expm1(), expm1f(), expm1l()
  • exp(), expf(), expl()
  • fabs(), fabsf(), fabsl()
  • fdim(), fdimf(), fdiml()
  • feclearexcept()
  • fedisableexcept()
  • feenableexcept()
  • fegetenv()
  • fegetexceptflag()
  • fegetprec()
  • fegetround()
  • feholdexcept()
  • feraiseexcept()
  • fesetenv()
  • fesetexceptflag()
  • fesetprec()
  • fesetround()
  • fetestexcept()
  • feupdateenv()
  • floor(), floorf(), floorl()
  • fma(), fmaf(), fmal()
  • fmax(), fmaxf(), fmaxl()
  • fmin(), fminf(), fminl()
  • fmod(), fmodf(), fmodl()
  • fpclassify()
  • frexp(), frexpf(), frexpl()
  • hypot(), hypotf(), hypotl()
  • ilogb(), ilogbf(), ilogbl()
  • isfinite()
  • isgreaterequal()
  • isgreater()
  • isinf()
  • islessequal()
  • islessgreater()
  • isless()
  • isnan()
  • isnormal()
  • isunordered()
  • j0(), j0f()
  • j1(), j1f()
  • jn(), jnf()
  • ldexp(), ldexpf(), ldexpl()
  • lgamma(), lgamma_r(), lgammaf(), lgammaf_r(), lgammal(), lgammal_r()
  • llrint(), llrintf(), llrintl()
  • llround(), llroundf(), llroundl()
  • log10(), log10f(), log10l()
  • log1p(), log1pf(), log1pl()
  • log2(), log2f(), log2l()
  • logb(), logbf(), logbl()
  • log(), logf(), logl()
  • lrint(), lrintf(), lrintl()
  • lround(), lroundf(), lroundl()
  • modf(), modff(), modfl()
  • nan(), nanf(), nanl()
  • nearbyint(), nearbyintf(), nearbyintl()
  • nextafter(), nextafterf(), nextafterl()
  • nexttoward(), nexttowardf(), nexttowardl()
  • pow(), powf(), powl()
  • remainder(), remainderf(), remainderl()
  • remquo(), remquof(), remquol()
  • rint(), rintf(), rintl()
  • round(), roundf(), roundl()
  • scalbln(), scalblnf(), scalblnl()
  • scalbn(), scalbnf(), scalbnl()
  • scalb()
  • signbit()
  • sinh(), sinhf(), sinhl()
  • sin(), sinf(), sinl()
  • snprintf()
  • sprintf()
  • sqrt(), sqrtf(), sqrtl()
  • sscanf()
  • swprintf()
  • swscanf()
  • tanh(), tanhf(), tanhl()
  • tan(), tanf(), tanl()
  • tgamma(), tgammaf(), tgammal()
  • trunc(), truncf(), truncl()
  • vsnprintf()
  • vsprintf()
  • vsscanf()
  • vswprintf()
  • vswscanf()
  • y0(), y0f()
  • y1(), y1f()
  • yn(), ynf()

Other changes include:

acl_*()
The documentation for these functions now correctly specifies when these functions set errno to EINVAL. (Ref# J2782102)
acl_init()
This function now sets errno to EINVAL if the value of the count argument is less than zero. (Ref# J2763532)
acl_set_file()
This function now sets errno to EINVAL if the value of the type argument isn't ACL_TYPE_ACCESS. (Ref# J2763532)
cacosh()
In our implementation, cacosh (0 + NaNi) now returns NaN±(π/2)i, where the sign of the imaginary part is unspecified, as specified by the C11 standard. (Ref# J2621656)
cfgopen(), fcfgopen()
We've changed the type of the nblen argument from int to size_t.
ClockCycles()
New: The hardware underlying ClockCycles() must be synchronized across all processors on an SMP system. Here, synchronized means the difference in time values (i.e., deltas) measured by different processors must be small enough to be not software observable. This design means that you don't have to call ThreadCtl( _NTO_TCTL_RUNMASK, ...) to prevent threads from migrating to another processor between calls to ClockCycles().
clog()
In our implementation, clog (±Inf + NaNi) now returns Inf + NaNi, as specified by the C11 standard. (Ref# J2621656)
ConnectAttach()
There's a new _NTO_COF_UNREG_EVENTS flag that you can use to override the OS requirement that you use only registered sigevents. Instead of using this flag, you can use procnto's -U option to allow all processes to use unregistered and registered events.

Note: _NTO_COF_UNREG_EVENTS and procnto's -U option are temporary workarounds and will be removed in a future version. You should update your system to use only registered events.

ConnectFlags()
You can now use this function to set the _NTO_COF_UNREG_EVENTS flag for a connection.
crypt()
We've enhanced the description of the password element in the documentation.
dispatch_create_channel()
  • The DISPATCH_FLAG_CHANNEL_COIDDEATH flag is deprecated and now has no effect. This function no longer gives an error of EBUSY.
  • New: This function now supports DISPATCH_FLAG_NOLOCK as a bit in the flags argument. In most resource managers, the mapping from message types to message handlers is static for the life of the resource manager, but the lookup must be done on every message. The framework locks and unlocks the mapping data on every message, but if a resource manager is going to have a static mapping, this overhead can be eliminated. Setting the DISPATCH_FLAG_NOLOCK flag tells the dispatch framework that it can safely eliminate those protections. This means that once the dispatch framework becomes active (that is, once at least one call to dispatch_context_alloc() has been made with the dispatch framework), the mapping can't be changed. This has the restrictions that for an active dispatch framework (dpp) you may not call:
    • message_attach()
    • message_detach()
    • pulse_attach()
    • pulse_detach()
    • resmgr_attach() unless at least one resmgr_attach() has been done before the dispatch_context_alloc()
    • select_attach() unless at least one select_attach() has been done before the dispatch_context_alloc()
    • select_attach() with the SELECT_FLAG_SRVEXCEPT flag unless at least one select_attach() with the SELECT_FLAG_SRVEXCEPT flag has been done before the dispatch_context_alloc()
dispatch_timeout()
It's now safe to call this function from a multithreaded process.
feclearexcept(), fegetenv(), fegetexceptflag(), feholdexcept(), feraiseexcept(), fesetenv(), fesetexceptflag(), feupdateenv()
Note that these functions always return 0. We've updated the documentation. (Ref# J2872824)
fork()
The child process no longer inherits I/O privileges.
forksafe_mutex_destroy(), forksafe_mutex_init(), forksafe_mutex_lock(), forksafe_mutex_trylock(), forksafe_mutex_unlock()
There are now two versions of the forksafe_mutex_*() functions:
  • The functions in libc are declared as weak symbols and use a regular mutex, simply calling the corresponding pthread_mutex_*() functions.
  • The functions in libforksafe_mutex use a forksafe mutex.
getutid()
If id->ut_type is INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, or DEAD_PROCESS, getutid() now correctly looks for the first entry with a ut_type of INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, or DEAD_PROCESS, and a ut_id field that matches id->ut_id.
libm
  • There are now two versions of the math library:
    libm
    The general-purpose math library.
    libm-sve
    A library that optimizes the code for ARMv8.2 chips that have Scalable Vector Extension hardware.

    If you want to use the SVE version, include libm-sve.so in your OS image and set up a symbolic link from libm.so to libm-sve.so.

  • Use the -fno-builtin option to prevent the compiler from using built-in versions of the math functions.
<limits.h>
We've corrected the definition of USHRT_MAX. (Ref# J2753844, J2753845)
mmap()
There's a new MAP_NOINHERIT flag that prevents a child process from inheriting a memory mapping if the parent calls fork().
MsgKeyData()
You no longer need the PROCMGR_AID_KEYDATA ability enabled for operations of type _NTO_KEYDATA_VERIFY. Resource managers no longer need to retain this ability to handle DUP messages.
mq_timedreceive(), mq_timedsend()
These functions now set errno to ETIMEDOUT instead of EINTR when they time out.
nanospin_calibrate()
The nanospin*() functions have been reimplemented to be based on ClockCycles(), and consequently nanospin_calibrate() is no longer needed. It's still safe to use in the same way as before, but all it does now is return EOK.
<sys/neutrino.h>
There's a new _NTO_PF_NOEXEC_STACK process flag that indicates that a process doesn't require an executable stack. There are also new _NTO_PF_NOISYNC and _NTO_PF_LOADER_PERMS flags that the process manager uses internally.
open()
  • This function now supports the O_DIRECTORY flag.
  • When a filesystem is mounted as read-only and you try to open one of its files in read-write mode, open() now correctly sets errno to EROFS. (Ref# J1683771)
pci_device_read_ba()
The documentation for this function now points out that if you want to determine how many valid base addresses the device uses, you need to set the ba argument to NULL and set the variable pointed to by nba to the maximum number of BARs. If you set the variable pointed to by nba to zero, pci_device_read_ba() returns PCI_ERR_OK but doesn't set *nba to the number of valid base addresses. (Ref# J2774957)
posix_spawn(), posix_spawnp()
These functions now indicate an error of ENAMETOOLONG if the length of the path argument is greater than PATH_MAX, or an action set with posix_spawn_file_actions_addopen() has a path that's longer than PATH_MAX.
posix_spawnattr_getxflags(), posix_spawnattr_setxflags()
We recommend you use posix_spawnattr_getaslr() and posix_spawnattr_setaslr() instead of the POSIX_SPAWN_ASLR_INVERT extended flag.
posix_typed_mem_open()
This function now correctly opens a typed memory object even if you don't specify a leading slash in the name and you aren't in the root directory. (Ref# J1035253)
ProcessInfo_t
We've changed the name of the class member in this structure to class_type, so you can now use the <sys/shutdown.h> header file in a C++ program; class is a C++ keyword. (Ref# J175563)
pthread_atfork()
New: For conformance with POSIX, this function is now declared in <pthread.h>.
pthread_condattr_setclock()
This function now returns EINVAL if the clock ID doesn't refer to a known clock, or refers to a CPU-time clock.
ptsname(), ptsname_r()
These functions now set errno if an error occurs.
pulse_attach()
This function no longer gives an error of EBUSY.
sem_timedwait(), sem_wait()
We've corrected a race condition with named semaphores that could cause calls to sem_timedwait() not to be unblocked when the timer expired, and calls to either of these functions not to be unblocked by signals. (Ref# 2811281)
shm_ctl(), shm_ctl_special()
  • The flags argument supports the following new bits:
    • SHMCTL_GET_FLAGS — return the flags defined for the object.

      New: Note that the flags returned don't include SHMCTL_TYMEM because it applies only to the backing that's installed when you call a specific instance of shm_ctl(). The object might be backed in part by memory not from typed memory.

    • SHMCTL_REVOCABLE — gives the creator of a shared memory object the ability to revoke access to it by calling shm_revoke().
    • SHMCTL_SEAL — prevent the object's layout (e.g., its size and backing memory) and attributes from being modified.
    • SHMCTL_TYMEM — allocate typed memory from a physical address.
  • For AArch64 platforms, you should use the new AARCH64_PTE_* flags in the special argument to shm_ctl_special() to specify memory attributes and shareability. These map better to the attributes than the ARMv7 ARM_SHMCTL_* bits, which are supported on AARch64 only for backward compatibility.

    Note: You must OR the AARCH64_PTE_* flags with AARCH64_SHMCTL.

SignalAction()
A process can now attach signal handlers only to itself. Only the kernel can query another process's signal actions.
SignalKill(), SignalKillSigval()
If the signal number is zero, these functions check to see if the specified process exists; they now check the validity of the specified thread ID only if it's nonzero.
SyncMutexEvent()
The event argument is now marked as const.
ThreadCtlExt()
The following commands now require process manager abilities in order for you to use them on a different process:
Command Ability
_NTO_TCTL_NAME PROCMGR_AID_XPROCESS_QUERY to get the name; you can't set a thread name in another process
_NTO_TCTL_RUNMASK PROCMGR_AID_XPROCESS_DEBUG
_NTO_TCTL_RUNMASK_GET_AND_SET PROCMGR_AID_XPROCESS_DEBUG
_NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT PROCMGR_AID_XPROCESS_DEBUG
_NTO_TCTL_ONE_THREAD_CONT PROCMGR_AID_SIGNAL for SIGCONT
_NTO_TCTL_ONE_THREAD_HOLD PROCMGR_AID_SIGNAL for SIGSTOP
_NTO_TCTL_THREADS_CONT PROCMGR_AID_SIGNAL for SIGCONT
_NTO_TCTL_THREADS_HOLD PROCMGR_AID_SIGNAL for SIGSTOP

(Ref# J2221706, J2764447)

timespec2nsec()
We've changed the macro implementation of this function to be an inline function, so it no longer evaluates its argument twice. (Ref# J2642294, J2642295)

For more information, see the C Library Reference.

What's new: Graphics

The following are enhancements since the previous released versions of Screen:

  • support of Screen versioning. Screen version 3.0.0 is associated with the release of QNX SDP 7.1
  • new API functions to support asynchronous notifications:

    • screen_register_event()
    • screen_unregister_event()
    You must now first call screen_register_event() to register the event that you'll be using in screen_notify(). Also, when you no longer need the event for any asynchronous notifications, you should remove the event registration by calling screen_unregister_event().
  • support of OpenCL 1.2 is now available on some platforms
  • support of DRM and Mesa libraries that are associated with Intel's Generation 9 GPU
  • support of libraries that enable Screen to run without physical display hardware as an addon package: SDP 7.1 Screen Board Support Null Driver
  • support of new vmwgfx drivers and drm-vmwgfx utility for the purpose of working with virtual target environments in VMWare versions 12 or higher as an addon package: SDP 7.1 Screen Board Support VMWare (vmwgfx)
  • support of new gltracelogger and gltraceprinter utilities to record and print, respectively, all OpenGL calls made by the target application as an addon package: SDP 7.1 Screen Utilities
  • source code examples are now available in an addon package: SDP 7.1 Screen Demos and Tutorials Source Code

    The binary that corresponds to each application is included as part of your SDP 7.1 Screen installation. You can find the binaries on your development host under $QNX_TARGET/cpu_arch/usr/bin/ where cpu_arch is the CPU architecture of your target. Note that not all binaries may be available for all targets.

    This package is located under Source Bundles from the QNX Software Center. The source code is provided for the following Screen demos and tutorials:

    Binary Source code Description
    events tutorials/events Create a window manager connection to Screen and dump the events received as output to the console
    sw-vsync tutorials/sw-vsync Display software-rasterized content
    win-vsync tutorials/win-vsync Display software-rasterized content using multiple windows in a hierarchy
    gles2-gears demos/gles2-gears Display hardware-rendered content using OpenGL ES 2.x
    sharewin demos/sharewin Demonstrate content sharing between windows
    vcapture-demo demos/vcapture-demo Demonstrate camera and video content
    To compile these programs, do the following:
    1. If you're not already there, go to the location where you extracted the source archive:
      cd source_directory

      where source_directory is where you've extracted the source code to.

    2. Compile by running make:
      make

      The binary output from compiling the source is located under the directory of each of the respective applications. For example:

      ..srcappsscreendemosgles2-gearsntox86_64ogles2-gears
      				
  • updates to the packaging of QNX SDP 7.1 Screen:
    • imaging support (e.g., image codecs) are no longer included as part of QNX SDP 7.1 Screen

      Prior to SDP 7.1, the image codecs were included in Fonts, Device Input and Image Codecs. Now, they are now available in the addon package, SDP 7.1 Image Codecs.

    • Prior to SDP 7.1, the following Screen utilities were included in Screen Base Graphics:

      • screencmd
      • screeninfo

      For SDP 7.1, the following Screen utilities are available in the addon package, SDP 7.1 Screen Utilities:

      • screencmd
      • screeninfo
      • gltracelogger
      • gltraceprinter

Which platforms does Screen Graphics subsystem support?

We've validated the Screen Graphics subsystem in VMWare virtualization environment and the following platforms:

Silicon Supplier Chipset or Board Name CPU GPU GPU Stack Display Controller Display Interface Number of Displays Display Resolution Monitor Name Touch Video Capture Interface Video Decoder
Renesas R-CAR V3H ARM Dual Cortex-A53 None N/A VSPD HDMI 1 720p

Lilliput 10.1″ FA1012 (HDMI)

HID via Lilliput display N/A N/A
Renesas

R-CAR H3 Starter (1.2 and 2.0)

R-CAR H3 Salvator X

ARM Quad Cortex-A57 GX6650 ImgTech PowerVR Series6XT VSPD HDMI, LVDS 2 1080p

Lilliput 10.1″ FA1012 (HDMI)

eGalax N/A N/A
NXP iMX8QM-MEK

ARM Quad Cortex-A53

ARM Dual Cortex-A72

GC7000VX Vivante-6.x 2-DPU LVDS

IMX-LVDS-HDMI card supported

IMX-MIPI-HDMI card supported

on-board HDMI supported

2 LVDS-to-HDMI

1 MIPI-to-HDMI

1 HDMI

1080p

720p

Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) MIPI CSI2

OV5640

OV10635 + MAX9286

NXP iMX8QXP

ARM Quad Cortex-A53

ARM Dual Cortex-A72

GC7000VX Vivante-6.x 2-DPU LVDS

IMX-LVDS-HDMI card

on-board HDMI supported

2 LVDS-to-HDMI

1080p

720p

Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) MIPI CSI2

OV5640 (both MIPI CSI2 and parallel)

OV10635 + MAX9286 (only MIPI CSI2)

NXP SabreSmart i.MX6Q

GC2000

GC320

GC355

Vivante 5.x

IPU3 LVDS (2), HDMI 3

LVDS: 1024x768

HDMI: 720p, 1080p

Lilliput 10.1 FA1012 (HDMI)

Hannstar

eGalax

MIPI-CSI-2, Parallel

OV5640

Texas Instruments Sitara AM572x ARM Dual Cortex A15 SGX544MP2 Imgtec DDK-1.13 DSS

HDMI, LCD

2

HDMI: 720p

LCD: 1920x1200

Lilliput 10.1" FA1012 (HDMI)

Attached (LCD)

LG (I2C Controller)

Parallel tvp5158
Intel Coffee lake i3/i5/i7 Intel HD 610-655 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD DPI, HDMI 2

DPI:

HDMI: 1080p

Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) N/A N/A
Intel Kaby lake i3/i5/i7 Intel HD 610-640 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD DPI, HDMI 2

DPI:

HDMI: 1080p

Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) N/A N/A
Intel Skylake i5 Intel HD 6000 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD DPI, HDMI 2

DPI:

HDMI: 1080p

Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) N/A N/A
Intel Skylake i5 Intel HD 6000 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD DPI, HDMI 2

DPI:

HDMI: 1080p

Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel Apollo NUC Apollo Lake HD Graphics 500-505 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD HDMI 2 1080p Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) N/A N/A
Intel Gemini Lake NUC Gemini Lake Intel HD Graphics 600-605 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD HDMI 2 1080p Lilliput 10.1" FA1012 HID (via Monitor) N/A N/A
Intel Baytrail (Valleyview) Atom Intel HD 4000 Mesa3D 18.3.6, i915/DRM 4.18.20 IntelHD HDMI 1 720p Lilliput 10.1" FA1012 (HDMI) HID (via Monitor) N/A N/A

Screen board packages must be installed individually. They are located in the QNX Software Center. Navigate to Screen Board Support. When you expand Screen Board Support, you may see a list of several Screen board support packages. However, this update of Screen is currently compatible with only the following board support packages:

  • QNX SDP 7.1 Screen Board Support i.MX8
  • QNX SDP 7.1 Screen Board Support AM572/Jacinto6
  • QNX SDP 7.1 Screen Board Support i.MX6x
  • QNX SDP 7.1 Screen Board Support Intel
  • QNX SDP 7.1 Screen Board Support - Qualcomm C2D blitter
  • QNX SDP 7.1 Screen Board Support R-Car H3
  • QNX SDP 7.1 Screen Board Support R-Car M3N HW
  • QNX SDP 7.1 Screen Board Support R-Car M3W HW
  • QNX SDP 7.1 Screen Board Support R-Car V3H
  • QNX SDP 7.1 Screen Board Support VMWare (vmwgfx)

Caution:

Screen board support packages previously released haven't been validated with this update of Screen.

We recommend that if you are using Screen board support packages for boards other than those supported in this update, use a separate installation to install and use this Screen and its new board support packages. For more information on how to add an installation, see myQNX License Manager and QNX Software Center User's Guide.


What's new: Audio

Updates to the libasound library client APIs require audio applications to make some minor modifications, and updates to io-audio may require minor modifications to audio drivers (deva-*). For detailed information, see Migrating to QNX SDP 7.1.

  • The audio mixer controls and channel mapping have been updated to improve support for multichannel audio systems. The library now supports up to 64 channel positions (see snd_pcm_chmap_position in asound.h for the full list of supported channel positions).
  • The trigger callbacks for stop (ado_pcm_trigger(), ado_afm_trigger_stop(), ado_afm_service_subchns_stop()) now have two stop commands that indicate whether the stop was the result of a drain or drop action.
  • The *_flush() and *_drain() functions have been replaced with the following APIs: snd_pcm_channel_drop(), snd_pcm_channel_drain(), snd_pcm_plugin_drop(), snd_pcm_plugin_drain().
  • For volume ramping, if you configured a duration time for the pause_resume type thats larger than your buffer size (application-specific), and then call snd_pcm_*_pause(), you no longer hear what seems like skipping of the same sample as the volume level decreases, until the volume level is zero. (Ref# J1681547)
  • Calling select() or poll() on the file descriptor handle you got from snd_pcm_file_descriptor() when the PCM state is in the SND_PCM_STATUS_NOTREADY state no longer results in an ENOTSUP error. (Ref# J1679037)

What's new: Documentation

The new documents include:

QNX Helpers Developer's Guide
Describes the libraries that provide QNX helpers, including helpers that assist with logging, string conversion, and number and type sizes.
System Security Guide
Intended for both system integrators who are responsible for the security of a QNX Neutrino system and developers who want to create a QNX Neutrino resource manager free from vulnerabilities. Replaces the Security Developer's Guide.

Updates to the existing documentation include:

  • We've enhanced the description of the password format used in the /etc/shadow file. See the Managing User Accounts chapter of the QNX Neutrino User's Guide.
  • In the Programmer's Guide, a new "Auditing builds" section discusses the tools that QNX provides to gather information about build artifacts, including which shared libraries a binary needs, the package it belongs to, and the command line options that were used to build it.

What's new: Drivers

Block-oriented drivers (devb-*)

devb-ustor
Driver for USB-based storage devices that also supports USB 3.0 Stream Protocol

Random service entropy libraries (devr-*)

The new libraries include:

devr-drng.so
Random service entropy library based on RDRAND and RDSEED instructions
devr-file.so
Random service entropy library for path-based entropy sources
devr-virtio.so
Random service entropy library for a Virtio RNG (random number generator)

USB server and drivers (devu-*)

io-usb-otg
The USB server now supports the USB 3.0 Stream Protocol and USB 3.0 Super Speed Plus(SS+).

What's new: Filesystems

fs-qnx6.so
  • We've corrected a race condition that could occur between updating the inode for an encrypted file or directory and locking the domain that its in. (Ref# J2597876, J2620951)
  • If the host filesystem (meaning the backend filesystem on which you're creating a filesystem image) uses a block size of 16 KB or 32 KB, then if an image file is formatted with another Power-Safe filesystem and the size of that image file isn't a multiple of 16 KB or 32 KB, respectively, the filesystem image created may no longer be unusable. (Ref# J2871755)
  • The Power-Safe filesystem now creates sparse files when growing a file with ftruncate() or when writing at an offset that is beyond the end of a file. The new nosparse option lets you prevent sparse files from being created. (Ref# J172702)
fs-udf.so
You can now mount a UDF or NTFS-formatted CD when you have a USB CD/USB drive connected to the target. (Ref# J1679662)
fsysinfo
This utility now reports the correct SLAB map and unmap statistics. (Ref# J1670533)
io-blk.so
We've documented the verbose=t option.
QNX Trusted Disk (QTD)
QTD now supports the secure hash algorithms sha512-256, blake2s256, blake2b256, and blake2b512.

What's new: Networking

brconfig
The following options are new:
  • mcf — enable multicast filtering.
  • -mcf — disable multicast filtering.
  • nohost address — dont process IP packets for the specified multicast address.
  • -nohost address — disable the nohost option for the specified multicast address.
io-pkt
The following options are new:
  • -I — don't acquire _NTO_TCTL_IO_PRIV in this instance of io-pkt.

What's new: Resource managers

  • We've replaced the mechanism for locking and unlocking the iofunc_attr_t structure. To do this, we replaced the lock_tid and lock_count with a union that contains lockobj and lock. The lock member is a built-in lock mutex, and lockobj is a pointer to an external locking object. If you use iofunc_attr_init() to initialize the structure, it initializes the built-in lock mutex (lock) using a static lock initializer; if you want to use an external lock object, override the built-in lock by pointing the lockobj member to the external lock object.
  • There's a new message that describes the physical layout of a shared memory object in one transaction and without the need to map the object (to avoid wasting time and virtual address space)
  • There's now an enhanced mmap() protocol between the memory manager and a server that allows the server to respond to a mmap() call by specifying a shared memory object and an offset which the client should be mapping. This should eliminate many of the current use cases for mmap_peer(), especially with direct physical addresses.

For information about these, see Handling mmap() messages in the Handling Other Messages chapter of Writing a Resource Manager.

What's new: Security

The supported version of theOpenSSLcryptography library is 1.1.1g, which may require you to revise and recompile any existing code that depends on OpenSSL.

Other changes include:

  • A new pathtrust feature that uses QNX Trusted Disk and abilities to restrict the code executed by a privileged process has replaced the previous version of pathtrust.
  • The new QNX cryptography library (qcrypto library) is a generic cryptographic shim layer that allows system integrators to choose which cryptography provider responds to requests on a per-process basis.
  • We now provide fortified versions of some APIs that are designed to detect out-of-bounds memory accesses by performing lightweight parameter validation at compile-time, runtime, or both. For more information, see Fortified System Functions in the System Security Guide.

What's new: Services

We now support Platform-independent Publish Subscribe (PiPS). For more information, see the PiPS Developer's Guide.

What's new: Startup

startup-*
The -R option can now include an optional unsigned integer argument, use_low_memory. If it's zero (the default), startup gets memory from the top of memory, which doesn't work for drivers with 32-bit DMA address restrictions if the target has RAM available above 4 GB. If use_low_memory is nonzero, startup tries to allocate from the lower end of memory, in the hope that there's enough below4G memory to work with 32-bit DMA restrictions. If below4G is already full, the driver can still get an address that's above 4 GB.
startup-x86
If the Execute Disable Bit is disabled and you're using the x86_64 kernel, startup-x86 displays a message and then crashes.

Debugging information for shipped binaries

We generate the QNX SDP target binaries with debugging information (-g), storing the debug form of the binary in a separate binaryName.sym file. Compiler options are also recorded for all binaries in the .sym file. The non-sym form is stripped of the debug and .ident information (use -s works only on files containing the .ident section).

Most target packages include debugging information (.sym files). If the debug symbols information is especially large, there might be a separate debug package in the QNX Software Center.

The binaries and their .sym file files are linked, so gdb understands where to find the symbol data. There's no need to store .sym files for the binaries on a target.

In order to install debugging symbols, select your installation from the toolbar, and then go to the Advanced tab. Click Edit Installation Properties. In the property dialog that opens, ensure that the Install debug symbols check box is checked. Note that this box is checked by default. Click OK.

If you decide not to install the debugging information and later want it, right-click on a package and then choose Install debug symbols.

Discontinued items

We've discontinued the following:

  • support for 32-bit x86 targets, including _intr_v86()
  • Transparent Distributed Processing (Qnet) connectivity to QNX Neutrino 6.x targets
  • device drivers deva-ctrl-a2dp.so and deva-ctrl-usb_btsco.so (currently, they are still included in the documentation)
Instead of using: Use: Notes:
avbmonitor, deva-ctrl-avb.so, lsm-avb.so A third-party AVB product
bootpd, /etc/bootptab dhcpd
New: crypt() (libc version) crypt() (liblogin version)
devnp-ecm.so, devnp-ecmplus.so, devnp-ncm.so devnp-usbnet.so
dhcp.client dhclient
display-image Screen utility that shows a specified image on the display
dpy-vsync Screen utility that shows software-rasterized content on multiple displays
/etc/group, /etc/passwd Versions that you create as appropriate for your system
font-freetype Screen utility that demonstrates free-type font rendering
fpemu.so
fs-nfs2 fs-nfs3
GNU gzip, gunzip, uncompress, zcat Toybox gzip, gunzip, zcat
in32, out32 io
InterruptCharacteristic(), InterruptCharacteristic_r(), lazy interrupts, and interrupt latency For backward compatibility, InterruptCharacteristic() and InterruptCharacteristic_r() are still defined but do nothing.
ioctl_socket() ioctl()
iruserok(), rcmd(), Rrcmd(), rresvport(), ruserok()
*-ld.gold, the gold version of the linker *-ld
libpng 1.4 libpng 1.6
libsocks
lsm-nraw.so
lsm-slip.so, slattach Ref# J2870632, J2876798
Merkle filesystem, including fsf-merkle.so, libfsmerkle.so.1, mkmerklefs QNX Trusted Disk (QTD), including fs-qtd.so, mkqfs
_NTO_PF_NOCTTY, _NTO_PF_NO_LIMITS, _NTO_PF_PTRACED, _NTO_PF_THREADWATCH, _NTO_PF_VFORKED Process flags
ntpdc ntpq
pathtrust See the Pathtrust chapter of the System Security Guide
pcnfsd
Python 2 Python 3
qad QNX anomaly detector
QCC q++
qcc -w[0-9] gcc-style -W* options
qconfig QNX Software Center
rcp, rlogin, rlogind, rsh, rshd, ruptime, rwho, rwhod
resvanonport
route6d RIP6 routing daemon
snd_pcm_capture_flush(), snd_pcm_channel_flush(), snd_pcm_playback_flush(), snd_pcm_plugin_flush() snd_pcm_channel_drain(), snd_pcm_plugin_drain() QNX Sound Architecture API functions
snd_pcm_playback_drain(), snd_pcm_plugin_playback_drain() snd_pcm_channel_drop(), snd_pcm_plugin_drop() QNX Sound Architecture API functions
vfork() posix_spawn()
Virtual filesystem (VFS) hooks functionality in io-blk.so Ref# J2554097
wlanctl
wlconfig WPA supplicant library

Deprecation notices

We've deprecated the following and will remove them in a future release:

  • the -ansi option for qcc. This option now has no effect.
  • the procnto memory configuration options for turning PROT_EXEC on or off (-mx and -m~x). These options no longer have any effect; by default, a binary's stack isn't executable, but you can use the elfnote utility to change this.
  • the MALLOC_OPTIONS environment variable
  • the -lang-c option for qcc
  • Networking Middleware, including the following:
    • /etc/ap_pps_mhs.conf
    • /etc/dhcpd-mhs.conf
    • /etc/net_pps.conf
    • /etc/pf.conf.tetherman
    • net_pps
    • rtsold-dnsscript
    • /scripts/service-wifi-bcm4359.sh
    • /scripts/service-wifi-marvell8897.sh
    • tetherman
    • /var/etc/hostapd_08.conf
    • /var/etc/hostapd.deny
    • /var/etc/netsecure/wpa_pps_p2p.conf
    • /var/etc/p2p/dhcpd-p2p.conf
    • /var/etc/tethering/dhcpd
    • /var/etc/wpa_pps.conf
    • wpa_pps
  • the copy and data attributes for mkifs. These attributes no longer do anything.
  • Transparent Distributed Processing (Qnet)
  • Persistent Publish/Subscribe
  • racoon IPsec tool
  • Sandboxing (security feature)
  • the SHMCTL_GLOBAL, SHMCTL_PRIV, SHMCTL_LOWERPROT, SHMCTL_HIGHUSAGE, and SHMCTL_NODEFRAG flags for shm_ctl()
  • the DISPATCH_FLAG_CHANNEL_COIDDEATH flag for dispatch_create_channel(). This flag now has no effect.
  • cfgopen(), fcfgopen()
  • the maxcio option for io-blk
  • New: the op utility
  • New: seedres
  • New: Talking to a remote High Availability Manager (HAM) over Qnet. This means the following functions are deprecated:
    • ham_action_fail_notify_pulse_node()
    • ham_action_fail_notify_signal_node()
    • ham_action_handle_node()
    • ham_action_notify_pulse_node()
    • ham_action_notify_signal_node()
    • ham_attach_node()
    • ham_condition_handle_node()
    • ham_connect_nd()
    • ham_connect_node()
    • ham_detach_name_node()
    • ham_disconnect_nd()
    • ham_disconnect_node()
    • ham_entity_node()
    • ham_entity_handle_node()
    • ham_stop_nd()
    • ham_stop_node()
  • New: the restart utility
  • New: the functionality of devr-drng.so is now integrated directly inside the random service, so it is being removed
  • New: support for minidrivers that perform Instant Device Activation (IDA) (currently, it is still included in the documentation)
Instead of: Use:
bcmp() memcmp()
bcopy() memmove()
bzero() memset()
New: Dynamic encryption domains Regular encryption domains
fdistrusted() fchecktrust()
New: flink() link() or linkat()
New: fsevents, fsev_t, and the FSE*() macros inotify*()
index() strchr()
iofunc_devctl_verify() Your own code that checks permissions based on each devctl() command that your resource manager supports; see Device control I/O function handler in the Resource Managers chapter of Getting Started with QNX Neutrino
New: nap() and napms() delay()
pam_mac pam_secpol
POSIX_SPAWN_ASLR_INVERT flag for posix_spawn() and posix_spawnp() posix_spawnattr_setaslr()
procmgr_set_type_id() secpol_transition_type()
rindex() strrchr()
New: secpol -p option secpolpush
New: set_ids_from_arg() (liblogin version) set_ids_from_arg() (libsecpol version)

Experimental items


Caution: Experimental software is primarily provided for customers and the community to try out, and perhaps to get a glimpse of what might be in store for the future. For information about the use of experimental software, see the Commercial Software License Agreement (CSLA) or Partner Software License Agreement (PSLA) in the Licensing area of our website, http://www.qnx.com/legal/licensing/.

The experimental items in this release are:

  • the jemalloc memory allocator; see "What's new: Kernel," above
  • QNX framework for integrity measurement (QFIM)
  • Trusted Platform Module (TPM)

The memory manager's backward-compatibility mode

The memory manager supports a backward-compatibility mode that you can control with the b and ~b settings for procnto's -m option. The behavior is as follows:

b
Enable backward-compatibility mode. If you call mmap() with flags of MAP_PRIVATE | MAP_PHYS, the memory manager changes MAP_PRIVATE to MAP_SHARED.
~b
Disable backward-compatibility mode. If you call mmap() with flags of MAP_PRIVATE | MAP_PHYS, mmap() returns MAP_FAILED and sets errno to EINVAL.

The default is b (enabled).

LL/SC vs LSE atomics

New:

The ARMv8-A architecture (see https://developer.arm.com/documentation/ddi0487/latest/) provides two groups of opcodes for atomic operations:

  • standard load-link/store conditional (LLSC)
  • ARMv8.1-A Large System Extension (LSE)

On the 64-bit ARM variant of procnto, if all CPUs support LSE atomics, we default to using LSE, otherwise we revert to LLSC.

LSE atomics are relatively new, and our experience with them has shown they don't always lead to performance gains, so if all the CPUs in your system support ARMv8.1-A LSE atomics, we suggest profiling the following functions using both LLSC and LSE so you can make the choice that's best for you:

  • atomic_add()
  • atomic_add_value()
  • atomic_clr()
  • atomic_clr_value()
  • atomic_set()
  • atomic_set_value()
  • atomic_sub()
  • atomic_sub_value()
  • atomic_toggle()
  • atomic_toggle_value()

Also note that pthread_spin_lock() and pthread_spin_trylock() use these atomic functions; pthreead_barrier_wait() and pthread_mutex_destroy() also use them, but to a lesser extent.

On systems that default to LSE, you can revert to using LLSC by clearing the AARCH64_CPU_FLAG_LSE flag in the system page by either temporarily modifying the startup, or if the startup supports the -F option, clearing the CPU flag by passing -F~0x8000 to startup.

The C11 atomic functions use LSE instructions only if you specify -march==armv8-a+lse or -march=armv8.N (where N is 1 or higher) on the compiler command line. The default is to build for the lowest common denominator ARMv8 instruction set, which doesn't include the LSE instructions.

Known issues

QNX SDP 7.1 contains known issues in the following areas:

Known issues: Kernel

  • The values for procnto's -q option shouldn't include leading hyphens, contrary to what the documentation says (e.g., -qs, not -q-s). (Ref# J2879373)
  • If you use private PROT_NOCACHE mapping on ARMv7 or AArch64 targets, data corruption might occur when the page is privatized. (Ref# J2875870)

    Workaround: Avoid private PROT_NOCACHE mappings.

  • User-specified band configurations in the standard memory allocator may corrupt your application's memory, and may cause the application to crash. (Ref# J169727)

    Workaround: If you specify the band configuration, make sure that the bands are 4080 bytes or smaller, and that all band sizes are multiples of 8 bytes.

  • New:The Resident Set Size, known as the RSS field of the as_stats struct, incorrectly reports steady growth, suggesting a memory leak in the presence of copy-on-write and write faults. This is known to affect both superlocked and non-superlocked systems. This issue has no impact on the system other than the incorrect reporting. (Ref# J2912268)
  • New:If superlocking is disabled, one of many mappings within a process in the same region of memory has a synchronization object, and munmap() calls a successive mapping that hasn't been backed, the assert fails and a kernel crash occurs. (Ref# J2901564)

    Workaround: Avoid placing synchronization objects in duplicate mappings of the same underlying physical memory or enable superlocking to ensure memory is backed after calling mmap().

  • New: The documentation incorrectly includes entries for the resmgr_pause_queue() and resmgr_pause_resume() C Library functions. These functions aren't supported in this release. (Ref# J2941286)
  • New: The documentation incorrectly provides descriptions of the dupignore attribute for several utilities that generate filesystem images: mkefs, mkefts, mkifs, mkfatfsimg, and mkqnx6fsimg. This attribute doesn't exist for these utilities in QNX SDP 7.1. (Ref# J2943022)
  • New: The documentation incorrectly includes an entry for the SysSrandom_r() C Library function. This function isn't supported in this release; only the non-re-entrant SysSrandom() version is. (Ref# J2946114)

Known issues: Compiler, tools, and utilities

Binutils
  • Version 2.32 of this package doesn't support the vmovdqu assembler instruction. (Ref# J2864007)

    Workaround: Use the -mavx512bw option to bypass this issue.

  • The current version of this package has known vulnerabilities. (Ref# J2876213, J2875624)
echo.exe
On Windows, the QNX-provided echo.exe interprets the Windows separator as an escape character. As a result, environment variable settings won't work if you use as a path separator; use / instead. (Ref# 19924, J142704)
gcc
  • When coverage is enabled on Windows hosts, the location for the *.gcda coverage files isn't generated correctly. The file name also includes what should be the directory structure. This creates a file such as c:abcefgxyz.gcda which has a path of c:, when it should be with components abc and efg. (Ref# J2876421)
  • GCC doesn't currently support arrays in std::shared_ptr. Any attempt to use arrays in std::shared may result in a compilation error, but in the case it doesn't, there's a potential for memory corruption (delete instead of delete[] called, operator->() giving unexpected results). (Ref# J2878655)
  • If you build a large program with the -O0 option for ARMv7 (where the program is large enough that a call from one function to another has an offset that's too large to fit in the ARMv7 jump instruction), the resulting binary might crash with a SIGSEGV. (Ref# J2876648)

    Workaround: Choose an optimization level (e.g., -Os) where the interfunction calls are closer.

  • GCC 8.3 doesn't provide the std::execution C++ header that's required for C++17 conformance. (Ref# J2876330)
  • GCC doesn't parse attribute-specifiers appertaining to a function type-specifier: one attribute is OK, but when there's more than one, and one of those is empty, there's a parsing error. (Ref# J2608081)

    Workaround: Don't use attribute specifiers on function type-specifiers.

  • For ARM targets, the gcc compiler mishandles a class that contains a pure virtual function using variable arguments and is inherited virtually. This is a known issue for gcc. (Ref# J382833, GCC PR 53440)
gdb
  • When you're examining a core file, you need to load the executable before loading the core file. If you load the core file first and then the executable, the executable isn't relocated correctly, and the symbol information from the core file doesn't match. (Ref# J2872630)
  • QEMU doesn't emulate the DBGAUTHSTATUS register on ARMLE-v7 virtual machines, so when gdb tries to access it, an exception occurs, and the kernel crashes.
ksh, sh
On Windows, because of the way that the MSYS versions of the shell manipulate the environment variable, PATH doesn't appear to include $QNX_HOST/usr/bin, but it does. (Ref# 59412, J143432 )
make
If you have an x86 directory in your build system, by default make attempts to build in it and fails because SDP 7.1 doesn't support 32-bit x86. (Ref# J2875712)

Workaround: Go into the x86 directory and run the following command:

touch Makefile.dnm
  

You could instead rename or delete the directory.

mkqfs
The documentation for this utility doesn't explain that it checks for a valid QNX license key before performing any operation. If the license check fails, the utility stops running and displays a diagnostic message. A license check may fail if the license key is expired, missing, or not currently activated, or if the key doesnt contain the permissions needed to run the utility. (Ref# J2886969)
pci-server
New: Note that you don't need to run seedres before starting pci_server. (Ref# J2891692)
q++, qcc
  • The q++ compiler fails to expand parameter packs correctly in lambda by-reference captures under some circumstances, resulting in a compilation failure. (Ref# J2878600)

    Workaround: Use template parameter pack expansions in by-copy lambda captures only. Don't use them in by-reference captures.

  • The -M option has some issues. For instance, qcc abc.c -Wc,-MD does not work while qcc abc.c -MD seems to work but produces a map file. The same is seen with these options for q++. (Ref# J2813708)
  • New: If you use the standard filesystem library (std::filesystem), you need to explicitly link in libc++fs.a. In other words, if your C++ code contains #include <filesystem>, then your linker line should contain -lc++fs. This is unlike other parts of the C++ standard library where the implementations are pulled in automatically by the q++ compiler. (Ref# J2871726)
random
New:Sometimes when using random, benign warnings will appear in the error log. This is due to the service failing to query the state of a process' threads in time, before they dissapear. This can cause a failure message to appear because the devctl request is attempting to access a thread which no longer exists. (Ref# J2903230)
rpcgen
On Linux hosts, when you run the rpcgen utility from your SDP installation to generate code, sometimes the code has syntax errors (e.g., missing closing conditional brackets) or generates code that our toolchain doesn't compile. (Ref# J1686804)

Workaround: Use the rpcgen utility that comes with your Linux distribution instead of the one from your installation of SDP to generate code that compiles with our toolchain.

secpolcompile
The documentation for this utility doesn't explain that it checks for a valid QNX license key before performing any operation. If the license check fails, the utility stops running and displays a diagnostic message. A license check may fail if the license key is expired, missing, or not currently activated, or if the key doesnt contain the permissions needed to run the utility. (Ref# J2886969)
slogger2
  • You can't currently use pps to change slogger2's level of verbosity. (Ref# J2877932)
  • New: The documentation incorrectly describes the slogger -U option by suggesting that supplementary group IDs (gids) can be specified. In fact, the only acceptable form for this option's argument is: -U uid:gid. The use message for this utility correctly describes this option. (Ref# J2930150)
su
New: Due to a recent change to libpam, if you use su root, you might get a system error. PAM requires that the chain of directories leading up to its configuration files and modules not have group or world write access. It omitted the root directory until recently.

Workaround: add mntperms=755 as an option to the command you use for mounting your filesystem.

valgrind
  • On AArch64 targets, the inline version of InterruptDisable() uses an instruction that the VEX compiler doesn't understand. (Ref# J2878782)
  • Some Valgrind tests fail with this assertion:
    ../../coregrind/m_signals.c:1151 (handle_SCSS_change): Assertion 'VG_(isfullsigset)( &ksa_old.sa_mask )' failed.
        

    (Ref# J2878780)

  • Some Valgrind tests fail with this assertion:
    ./../coregrind/m_syswrap/syswrap-nto.c:321 (run_a_thread_NORETURN): Assertion 'VG_(clstk_init) > VG_(clstk_start_base) && VG_(clstk_init) < VG_(clstk_end)' failed.
    +valgrind: Initial client stack pointer not within stack area
        

    (Ref# J2878779)

Windows utilities
The Windows installation includes various executables that have the same name as some QNX utilities, such as find, sort, and split. By default, Windows places the path to the Windows executables at the beginning of the Windows PATH environment variable, and the QNX executables appear afterward. This means that when you run these utilities from the command line, instead of using the QNX version, the PATH variable uses the Windows version. (Ref# 44457, J274938)

Workaround: If you want to use the QNX utilities for find, sort, and split from a command prompt or shell prompt, specify a fully qualified path to any of the QNX executables.

Known issues: Libraries and header files

<cfloat>
FLT_HAS_SUBNORM, DBL_HAS_SUBNORM, and LDBL_HAS_SUBNORM are defined in our implementation of C11, but not in our implementation of C++17. (Ref# J2878067)

Workaround: Wrap any references to them with the following:

#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L)
...
#endif
  
dlopen()
  • New: Note that the runtime linker gets the values of the following environment variables only when the process is loaded:
    • DL_DEBUG
    • LD_PRELOAD
    • LD_TRAP_ON_ERROR

    The dlopen() function examines LD_LIBRARY_PATH every time you call it. (Ref# J2874938)

  • An empty entry in LD_LIBRARY_PATH (i.e., a colon that isn't followed by a path) is interpreted as search the current directory, but a colon at the end of the string is currently ignored. (Ref# J2499532)

    Workaround: If you want the current directory to be searched at the end of LD_LIBRARY_PATH, end the value with a colon followed by a period (:.).

libc++
The default QNX C++ standard library (libc++) is missing the declaration for std::reinterpret_pointer_cast<>(). Use of this construct will result in a failure to compile. (Ref# J2878628)

Workaround: Use the alternative GNU C++ standard library (libstdc++) until a fix is shipped for QNX SDP 7.1.

libm
The documentation says that if you want only selected processes to run with the SVE version of this library, you can include both libraries in your OS image and link explicitly against the appropriate one, but this method isn't currently supported. (Ref# J2887064)
mallinfo()
New: Because the members of the mallinfo structure are of type int, they might overflow if you're working with allocations that are larger than 2 GB. Instead of using mallinfo(), call mallopt() with the MALLOC_STATS command. (Ref# J2896183)
memcpyv()
New: This function erroneously copies some data if dparts or sparts is zero or negative. (Ref# J2891101)

Workaround: Make sure that dparts and sparts are positive.

MsgKeyData(), MsgKeyData_r()
These kernel calls don't work properly over Qnet; if the client and server are on different nodes, the verification step fails, even if the data is correct. (Ref# J418418)
ncurses
The current version of this library has known vulnerabilities. (Ref# J2789930)
ostream
In libc++.so, the ostream class should be safe to call in a multithreaded process, but it isn't because of an error in setlocale(). (Ref# J2627096)
tc*()
Some tc*() (terminal interface) functions are implemented as having cancellation points when according to POSIX, they must not or should not have them. This issue is being fixed in a newer version of QNX SDP.

The terminal interface functions that incorrectly do have cancellation points include:

  • tcdrain()
  • tcgetsid()
  • tcsetsize()
  • tcgetsize()
  • tcinject()
  • tcischars()

In the documentation, the safety table for each listed function has a No value in the Cancellation point column. This should be used as a guideline in writing programs that use these functions; they should not be used as cancellation points. (Ref# J2711220)

Known issues: Graphics

General
  • New: Screen may crash if both of the following conditions are true in your system:
    • You're using the screen-gles2.so composition module (e.g., you've set the usage parameter to gles2 in your graphics configuration file).
    • You've set the SCREEN_PROPERTY_DEBUG property on a window of a Screen application that's running.
    (Ref# J2890617 )
  • If you're using the screen-gles1.so or screen-gles2.so composition modules, you may observe undefined behavior and Screen may crash when you move an application window from one display to another. (Ref# J2782774)

    Workaround: Instead of changing the display of the application window, destroy the window and recreate it on the second display.

  • YUV windows might not be displayed.

    A window that has all of the following characteristics might not be displayed if it's positioned at the limit of the displays upper scale range:

    1. Its SCREEN_PROPERTY_FORMAT property is of a YUV format
    2. Its SCREEN_PROPERTY_SOURCE_SIZE property has an odd-numbered width or height
    3. It's on its own pipeline

    (Ref# J1387630)

    Workaround: Set the window's SCREEN_PROPERTY_SOURCE_SIZE property so that both its width and height are even-numbered.

  • Not all Khronos GLES 3.0 conformance tests pass. (Ref# J2874387)
  • Screen may crash when you're moving windows between multiple displays. (Ref# J2876789)
  • You can't start screen as a non-root user. (Ref# J2875517)

    Workaround: To run screen as a non-root user, you can:

    Start screen as root with the -u option. For example, use something similar to the following:

    root # screen -u qnxuser -c graphics.conf
                
  • You can't simply run any io-hid client (e.g., screen, io-usb-otg, mtouch) as a non-root user if you have input devices that use io-hid. (Ref# J2804592)

    Workaround: To run screen as a non-root user, the specified user's user, group, or supplementary group id must match io-hid's group id. For example, the following are valid examples:

    •   # screen -c graphics.conf -u qnxuser,1001
        # on -u 0:1001 io-hid -U 1001:1001
                          
    •   # screen -c graphics.conf -U qnxuser
        # on -u 0:1000 io-hid -U qnxuser
                          
    where screen runs as uid:1000 (qnxuser) and io-hid runs as uid:1001.

Known issues: Adaptive partitioning

  • Threads in a zero-budget partition should run only when all other nonzero-budget partitions are idle. However, on SMP machines, zero-budget partitions may incorrectly run when some other partitions are demanding time. However, at all times, all partitions' minimum budgets are still guaranteed, and zero-budget partitions will not run if all nonzero-budget partitions are ready to run. (Ref# 29434, J166701)

Known issues: Audio

  • When you run an application that records (captures) audio on a virtual machine that runs QNX Neutrino, the captured audio is choppy and has skewed duration times. For example, it may take 7 seconds to capture 5 seconds of audio and when you play the captured audio, it has gaps and sounds choppy. This issue occurs because a guest system running in VMware emulates a separate timing scheme and an interrupt delivery mechanism that isnt accurate compared to running QNX Neutrino on hardware. (Ref# J1691239)

    Workaround: Capture audio directly on a hardware platform running QNX Neutrino instead of a virtual machine.

  • For the Intel HDA audio driver (from the pc_generic audio drivers package) with the Gigabyte B450M DS3H Micro ATX AM4 Motherboard, there are two known audio issues:
    • Audio capture does not work.
    • ALC887 Audio Codec playback volume controls are non-functional. (Ref# J2875947)

    Workaround: There is no workaround for the audio capture issue. For the ALC887 Audio Codec playback volume controls issue, use the software playback volume and mute controls instead.

  • New: Playback may be corrupted when you quickly stop and start the only active playback stream of the PCM software mixer device. (Ref# J2878540)

Known issues: Booting

  • If you install QNX Neutrino on a system that uses the Intel Express Q35 chipset, the OS won't boot. The ITE EIDE interface on this board isn't supported. (Ref# 61188)

    Workaround: Run the driver in PIO mode.

Known issues: Drivers

Block-oriented drivers (devb-*)

devb-eide
DMA modes don't work on these drives:
  • Hitachi-LG Data Storage DVD WRITABLE/CD-RW DRIVE, ROM VER.E111, May 2006
  • Toshiba Samsung Storage Technology TS-H352C/DELH, DE02, May 2006

(Ref# 41600)

devb-loopback
The devb-loopback driver fails if the filesystem blocksize is more than 4096 bytes (4 Kbytes). (Ref# J1575938)

Workaround: Pass the blocksize of 4096 bytes to the blksz option when you run the devb-loopback driver.

devb-umass
When you have more than one device connected and you don't specify to target only one of the connected devices, if you run the devb-umass with the scsipath option set and then slay devb-umass, a SIGSEGV occurs. The devb-umass driver runs normally otherwise. (Ref# J568106)
# devb-umass blk cache=2m cam cache umass scsipath=/dev/uscsi
Path=0 - QNX USB Storage
target=0 lun=0 Direct-Access(0) - Patriot Memory Rev: PMAP
Path=1 - QNX USB Storage
target=0 lun=0 Direct-Access(0) - Kingston DT Ultimate G3 Rev: PMAP

# ls /dev/uscsi
/dev/uscsi
# slay devb-umass
Process 90120 (devb-umass) terminated SIGSEGV code=1 fltno=11 ip=0804ce28(/proc/boot/devb-umass@main+0x2a8b) ref=000000f8

Human interface device drivers (devh-*)

devh-usb.so
  • Autorepeat doesn't currently work on ViewSonic 10191 USB keyboards. (Ref# 41118, J346419)
  • Pressing the space bar on a ViewSonic 10191 USB keyboard when the system displays the Press space bar to input boot options message doesn't work. You get the menu only after the EIDE enumeration is done.

    If you also have a Microsoft USB mouse connected, you get a devh-usb.so - Unable to attach to USB device 1 (10) message. (Ref# 41122, J346420)

Network drivers ( devnp-*)

devnp-*
When using the m_pkthdr_csum_data member in network driver code, make sure that you use only the bottom 16 bits. The top 16 bits may contain undefined data. (Ref# 44622, J473874)

USB server and drivers (devu-*)

  • Due to an issue with the hardware, if you use io-usb-otg on the Texas Instruments Jacinto 6 EVM, and you start the driver while a USB 3.0 stick is inserted, the stick isn't detected. (Ref# J1559910)

    Workaround: Start the driver before you insert the stick, or use a hub.

  • UHCI and OHCI aren't supported in this release; for more information, contact Technical Support.

Known issues: Filesystems

statvfs64()
On NTFS devices, the statvfs64() function incorrectly returns zero for the number of free files. (Ref# J1664079)
fs-qnx6.so
  • The io-blk.so manager permits you to mount only up to 125 Power-Safe filesystem partitions on a single drive. Instead, it's supposed to be 128 partitions. (Ref# J1685066)
  • The io-blk.so manager lets you mount a filesystem in a file. To do this, you basically create a normal file on a disk, and then format it (via mkqnx6fs, mkdosfs, etc.), as a filesystem. You can then run a command, such as:
    mount -tdos /home/myfs.img /fs/test
      

    and you'll get a mountpoint called /fs/test, which is the size of the file and is formatted as a DOS filesystem.

    If you used fs-qnx6.so as the real filesystem on the hardware, and then created a DOS filesystem inside a file residing on the Power-Safe filesystem, the host filesystem formerly could become damaged by the modifications to the hosted filesystem. We've fixed that, but the host filesystem might not be able to confer full power-loss safety to the (by design) not power-loss-safe DOS filesystem. (Ref# 74580, J169426)

io-blk.so
New:The description of the maxio option is incorrect in the documentation. (Ref# J2895283)

Workaround: This option specifies the maximum number of disk sectors in a single I/O operation generated by io-blk.so. The minimum value is 16, the maximum value is 8192, and the default is 128. Because the number is given in sectors, the actual byte size varies with disk geometry. An I/O operation consists of a single contiguous run of sectors, and associated memory addresses. Factors such as disk cache fragmentation and disk cache size may further limit the maximum I/O size submitted to the driver. See also the maxio options for libcam.so and cam-disk.so, which may further reduce the size of the I/O.

Known issues: Flash filesystems & embedding

  • In previous versions of this software, a program that called umount() without the _MOUNT_FORCE flag would behave as if the flag was provided (i.e., the flash filesystem would be unconditionally unmounted regardless of any operations either pending or in progress on the filesystem).

    In this release, umount() sets errno to EBUSY if any pending or in-progress flash filesystem operations exist on the filesystem unless you specify _MOUNT_FORCE. The same applies for scripts that call the umount utility without the -f option. This has implications for applications that expect _MOUNT_FORCE behavior but don't specify it.

  • libfs-flash3 loses blocks with ftruncate(). (Ref# 25132)
  • If you create a 255-character filename using the 1.1.0 flash library (libfs-flash3) and the flash filesystem is subsequently mounted using an earlier version of libfs-flash3, the filename won't appear in the filesystem, but it is still present (i.e., if the filesystem is subsequently mounted again with the 1.1.0 libfs-flash3, the filename will reappear). This behavior applies only to forward compatibility whereby an older flash filesystem library is used to mount a newer filesystem. Backward compatibility (the ability of the new filesystem library to mount older filesystems) isn't affected.
  • During a power failure, the flash filesystem can be corrupted if the NOR device's power supply is in the indeterminate state. The solution is to design the hardware so that the NOR flash device enters RESET the moment the power supply drops below the proper operating range. (Ref# 24679)

Known issues: I/O devices

io-usb-otg
In testing we've found a random memory leak when running the usb utility while a mass storage USB device is unplugged with devb-umass running. (Ref# J2812424)

Known issues: Networking

BIND 9 (lwresd, named)
The current version of this software has known vulnerabilities. (Ref# J2876762)
fs-cifs
  • If you try to remount a CIFS filesystem, either with:

    mount -u cifs_mountpoint

    or by calling mount() with the _MOUNT_REMOUNT flag, the filesystem is unmounted. (Ref# 77893, J169740)

  • If you unlink() a file on a CIFS mount point, any open file descriptors for that file become invalid. (Ref# 38574, J473683)
  • fs-cifs doesn't support POSIX file-locking functions. (Ref# 38570, J473679)
  • fs-cifs incorrectly sets an errno of EPERM instead of EBADF if you attempt to write to a file opened as O_RDONLY or O_ACCMODE. (Ref# 38565, J473675)
  • If a component of a pathname supplied to a function isn't a directory, fs-cifs should return ENOTDIR. It currently returns ENOENT. (Ref# 38564, J473674)
  • PATH_MAX for CIFS (and thus fs-cifs) isn't 1024 as in POSIX. This is set by both Windows and the CIFS specification. The pathname length can be up to 255 characters. (Ref# 38566, J274605)
fs-nfs3
  • The NFS clients don't distinguish between a pathname ending or not ending in / when passed as the argument to mkdir(). (Ref# 38484, J473667)
gns
A gns daemon can't act as both a client and server at the same time. If a local service is registered with a GNS client, the client can forward that information to redundant or backup servers; a server can't forward the information. (Ref# 21037, J473239)
ifconfig
The commands:
ifconfig iface_name up
ifconfig iface_name scan
  

don't work individually for Wi-Fi drivers. (Ref# 61246, J393284)

Workaround: Combine the commands:

ifconfig iface_name up scan

io-pkt*
  • We've observed some performance degradation when compared with QNX SDP 7.0, but only for very small packet sizes. (Ref# J2850175)
  • Accessing the resource manager of a remote io-pkt process via Qnet (SOCK=/net/xxxx) doesn't work if large (greater than 18 KB) message buffers are used. (Ref# J570218)
  • The stack might send zero-length mbufs to a driver for transmission. (Ref# 44621, J473873)

    Workaround: Drivers must accommodate for this by checking the length of the data in the mbuf and ignoring the mbuf if the length is zero.

  • If the default UDP socket receive-buffer size is set near its limit (for example sysctl -w net.inet.udp.recvspace=240000), UDP-based sockets become unreliable. (Ref# 27386, 159834, J473555, J181071)
lsm-qnet.so
  • The only supported bind= options for Qnet are bind=ethernet_interface and bind=ip. Other values for bind=X are still accepted (that is, no error is given), but Qnet may not work with them if the specified ethernet_interface doesn't appear. (Ref# 58234, J474325)
  • Qnet currently expects all packets to be received and sent as a single contiguous buffer. This can be a problem if you're using jumbo packets. (Ref# 47828, J473994)

    Workaround: When you're using Qnet with an Ethernet driver that's enabled to use jumbo packets, you should set the cluster size (the mclbytes option to io-pkt*) to be the same as the packet size (the ifconfig if_name mtu command for the driver). This ensures that the packet buffers that Qnet uses are contiguous in memory.

    If you specify a jumbo packet size larger than 4 KB (the default page size), you must additionally specify the pagesize=X option to io-pkt-v4-hc (io-pkt-v6-hc), with the same value as the mclbytes=X option. For example, to use 8100-byte packets with devnp-dm814x.so, do the following:

    io-pkt-v4-hc -d dm814x -p tcpip pagesize=8192,mclbytes=8192
    ifconfig wm0 mtu 8100
    mount -T io-pkt lsm-qnet.so
        

    Note: Be sure to mount Qnet after you change the MTU of the interface with ifconfig.

    If you now type:

    cat /proc/qnetstats
        

    you can see that the Qnet L4 has an MTU of 8096, which it learned from the driver (remember the 4 bytes for the trailing CRC).


    Note: All the Qnets on your LAN must have exactly the same MTU.

    You can specify a particular MTU to Qnet (which can be the same or less than the driver-advertised value) with the mtu_en=X option.

  • Qnet doesn't fully support communication between a big-endian machine and a little-endian machine. However, it does work between machines of different processor types (e.g., ARMLE, x86) that are of the same endian-ness. For more information, see the Advanced Qnet Topics chapter of the QNX Neutrino Programmer's Guide.
nfsd
  • If you use nfsd to connect to a Ubuntu 18.04 LTS client, you might encounter I/O errors when you try to create directories on the client. (Ref# J2873499)
  • nfsd lets you access files only up to 16 subdirectory levels deep within the directory exported in the /etc/exports file. Deeper directory levels and files aren't accessible. (Ref# 40104, J473747)
ntpd
The current version of this daemon has known vulnerabilities. (Ref# J2876523)
ssh-agent
This utility doesn't work if /tmp is mapped to /dev/shmem. (Ref# J2876523)

Workaround: Map /tmp to a real filesystem or to a devb-ram filesystem.

sshd
New: When you disconnect an SSH session, a syslogin_perform_logout: logout() returned an error message is sent to the log file if /var/log/utmp doesn't exist. (Ref# J2892028)

Workaround: You can safely ignore this message.

You could create /var/log/utmp, but you're unlikely to need it in an embedded system. If you create this file, it will continue to grow in size without limit.

Known issues: Persistent Publish/Subscribe

  • On 64-bit architectures, PPS uses slogger instead of slogger2, and if PPS encounters an error during startup, it might deadlock. On 32-bit architectures, PPS uses slogger2 directly, so this issue doesn't occur. (Ref# J1655746)

    Workaround: Use the slogger2 shim library to route slogger APIs to slogger2. To use the shim, assign its library name to the LD_PRELOAD environment variable when you start pps:

    LD_PRELOAD=libslog2shim.so pps pps_args
      

    This sets up a slogger2 buffer set with the following parameters:

    • buffer_set_name: pps
    • num_buffers: 1
    • verbosity level: SLOG2_DEBUG
    • num_pages: 8
    • buffer_name: SLOGGER_LEGACY

    You can control the behavior of the shim via the following environment variables:

    SLOG2_SHIM_PAGES
    The number of pages used for the SLOGGER_LEGACY buffer (the default is 8).
    SLOG2_DEFAULT_PAGES
    If this is nonzero and only one buffer set is used, the buffer is named SLOGGER_DEFAULT, and allocates the number of pages specified by this environment variable. In the case where 2 buffers are requested (SLOG2_ONE_BUFFER_SET isn't zero), this is the number of pages used by the second buffer (the default is 0).
    SLOG2_DEFAULT_VERBOSITY
    The default verbosity used by slogger2 (the default is SLOG2_DEBUG2).
    SLOG2_ONE_BUFFER_SET
    If this is zero, slogger2 is set up to use a single buffer (the default). If it's nonzero, slogger2 is configured to use two buffers: one named SLOGGER_LEGACY with the number of pages specified by SLOG2_SHIM_PAGES, and one named SLOGGER_DEFAULT with the number of pages specified by SLOG2_DEFAULT_PAGES.

    The two-buffer setting is meaningful only if SLOG2_DEFAULT_PAGES is also nonzero.

  • The ppsparse() function sets the attr_index member of the pps_attrib_t structure only when a line contains both an attribute name and a value. When you're reading in delta mode, PPS sends a message such as -attrn when an attribute is deleted. Since there's no value, the code sets attr_index to -1. (Ref# 77361, J169694)

Known issues: Platform-independent Publish Subscribe (PiPS)

  • PiPS might deadlock if you use global and per-publication new data handlers simultaneously. (Ref# J2877790)

Known issues: Startup

  • If you load an uncompressed OS image that's larger than 3 MB on an x86 target, some binaries (e.g., ftp) may crash. (Ref# 45838, J346829)

    Workaround: Specify this attribute in the mkifs buildfile:

    [image=0x700000]
      

Getting started with the documentation

After you've installed QNX SDP, you'll find an extensive set of HTML documentation in the Integrated Development Environment's help system. To start the IDE:

  • on Windows, choose QNX > QNX Momentics IDE from the Start menu, or use the desktop icon
  • on Linux, run IDE_base_directory/qde, where IDE_base_directory is where you installed the IDE package

    Note: This path is probably different from that for QNX SDP 7.0. In QNX SDP 7.0, the default path is ~/qnx/qnxmomentics/qde, but in SDP 7.1, it's ~/qnxmomenticside/qde.

  • on macOS, click the icon labelled QNX Momentics IDE from the launchpad

The roadmap page contains links to the various HTML booksets that accompany the OS. For a short tutorial that will help you get started, see the Quickstart Guide, then refer to the other documents (System Architecture, QNX Neutrino Programmer's Guide, C Library Reference, Utilities Reference, and so on).

You can install and work with multiple versions of QNX Neutrino. Whether you're using the command line or the IDE, you can choose which version of the OS to build programs for. For more information, see the IDE User's Guide or the QNX Neutrino Programmer's Guide. If you've written code for an earlier version of QNX Neutrino, see also Migrating to QNX SDP 7.1.

For the most up-to-date version of the release notes, start the QNX Software Center, right-click on the QNX SDP 7.1 package, choose Properties, and use the link provided.

Technical support

To obtain technical support for any QNX product, visit the Support area on our website (www.qnx.com). You'll find a wide range of support options, including community forums.

For questions about installing and using QNX SDP, see the Getting Started forum on our Foundry27 site, https://community.qnx.com. There are other forums for specific topics, including the QNX Neutrino RTOS, development tools, networking, Board Support Packages, and so on.