Home
Developer Resources
Technical Articles

QNX Technical Articles

QNX® Software Development Platform 7.0: Release Notes

Date of this edition: October 20, 2022


Note: Changes to these notes since March 13, 2017 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 and x86_64 targets running the QNX Neutrino RTOS 7.0. You can install QNX SDP on the following development hosts:

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

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

  • Renesas R-Car H3
  • NXP S32V EVB
  • NXP i.MX6 SABRE for Automotive Infotainment
  • NXP i.MX6 SABRE Platform for Smart Devices
  • Texas Instruments Jacinto 6 (DRA74x/DRA75x) EVM
  • Texas Instruments Sitara AM572x (also supports Beaglebone-X15)
  • Texas Instruments Sitara AM437x GP
  • Intel Gordon Ridge MRB
  • Intel Bay Trail
  • ADI RCC C2000 platform (code name: Rangeley)
  • Intel Denverton— we support Car Creek Module version: MD# H85725 Rev02, BIOS Revision: HAVLCRB0.X64.0009.D47.1512101003, Module Color: Blue
  • Intel Skylake
  • Intel Broadwell and Haswell

We’ve validated QNX wireless drivers on the following platform combinations:

  • Texas Instruments Jacinto 6 + TI Wilink8 (SDIO)
  • NXP i.MX6 + Broadcom BCM4359 (PCIe)
  • Intel Skylake + Marvell 8897 (PCIe)

Caution:
  • If you installed an alpha or beta version of this software, uninstall it before installing the production version.
  • If you're using the IDE, create a new workspace for this release. If you want to use anything from an existing workspace, copy it into your new workspace and use the copy. Anything that you open with this version of the IDE might not be compatible with previous releases.
  • Make sure that Plug and Play OS is disabled in the BIOS before you run QNX Neutrino on your target.
  • By default, QNX Software Center update policy is Ultraconservative. Updates are not installed during the initial installation, and for subsequent installations of a packge, the earliest version of each dependent package is installed. For more information on installation properties, see the myQNX License Manager and QNX Software Center User's Guide.

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.


Note: To access the most up-to-date version of these release notes, go to the QNX Software Center, right-click on the QNX SDP 7.0 package, choose Properties, and use the link provided.

In the QNX Software Center's Available tab you'll also find a virtual machine of the QNX Neutrino RTOS runtime system that you run on VMware Workstation, VMware Player, or VMware Fusion. For more information about the virtual machine, see the QNX Software Development Platform 7.0 x86_64 virtual machine for VMware release notes.

Contents

What's new in the QNX Neutrino RTOS?

The main new features in this release include the following:

64-bit CPU support
We now support the ARMv8 64-bit ARM architecture (AArch64) and x86 processors running in 64-bit mode.
ARMv7 support
The ARM v7 variant of QNX Neutrino supports the Large Physical Address Extension (LPAE), which allows the OS to support boards with more than 4 GB of RAM.
PCI server
We've provided a new PCI server, and moved its APIs out of libc and into its own library, libpci.
Synchronization objects
The OS now uses fewer sychronization objects, and we've increased the limits on them.
Filesystems
  • In order to use filesystem encryption, you must use the QNX Software Centry to install the Encrypted Filesystem package.
  • The Power-Safe (fs-qnx6.so) filesystem now runs on 64-bit CPUs.
New virtual memory manager
  • Most mappings use on-demand paging by default, so the first reference to any virtual page in a mapping results in a page fault. You might have to change some code to avoid page faults (e.g., latency-sensitive code, safety-critical code, any code running within an ISR).
  • The mem_offset() function fails on memory that hasn't been explicitly wired, as the underlying physical address is either non-existent or non-persistent.
  • We've reworked and rationalized the shm_ctl() API, extending its behavior and making it clearer and easier to understand. Most existing code should work unmodified, though some invalid combinations of flags now cause an immediate failure.
  • The pageout mechanism is very different from the one in the previous memory manager (which exists only in QNX SDP 6.6).

Note: You must recompile your programs. You can't run binaries from an earlier version of the OS on QNX Neutrino 7.0.

For information about other changes, see the following sections:

The documentation includes Migrating to QNX SDP 7, which describes how to update your code.

What's new: Kernel

  • New: We've corrected the handling of interrupts so as to eliminate a window where a lower-priority thread could hold a higher-priority one out of the kernel for an arbitrarily long time. (Ref# J833933)
  • New: We now support profiling sampling on multicore systems. This uses the new _NTO_TRACE_SYS_PROFILE trace event.
  • New: A single signal with multiple timer sources is now generated the correct number of times when more than one timer fires during an interval when one instance of the signal has already been generated, but not yet accepted by (for example) a signal-catching function. (Ref# J167001, J164766)
  • The kernel now supports high-resolution timers, timers whose resolution is less than the clock period.

    Note: This feature is experimental.

  • A single kernel variant for each architecture now supports running on single and multicore processors, in instrumented or non-instrumented mode.
  • The new MsgPause() kernel call prevents some single-threaded resource managers (such as io-pkt and QDB) from becoming WAITPAGE-deadlocked when the system uses lazy page faulting. (Ref# 29440, 30045, 62483, J166702, J382313)
  • User-specified band configurations in the standard memory allocator no longer corrupt your application's memory or cause the application to crash. (Ref# J169727)
  • The /proc filesystem includes a ctl file for each process that you should use instead of the as file for devctl() commands. This lets you restrict access to the as (address space) interface, to make your system more secure.

What's new: Filesystems

fs-dos.so
  • New: There's a new system=ignore|show option that lets you specify what to do with files that have the DOS system attribute:
    • ignore — ignore system files; they don't appear in the filesystem.
    • show — show system files in the filesystem as normal files.

    The default is show. (Ref# J508120)

  • New: This filesystem supports some additional code pages: cp932 (Japanese), cp936 (simplified Chinese), and cp950 ( traditional Chinese). These code pages aren't statically linked into fs-dos.so as the other code pages are; they're in a separate shared library, charset.so. If you need to use these code pages, make sure to include charset.so in your OS image.
fs-nfs2
New: This filesystem doesn't support files larger than 2 GB. This is a limitation of the NFS2 protocol, not of the implementation. (Ref# 39060, J473719)
fs-qnx6.so
The Power-Safe Filesystem now supports:
  • persistent access-control lists (ACLs)
  • encryption on block sizes greater than 4096 bytes
  • New: encryption using OpenSSL:

    crypto=enable|certicom|disable|openssl

    • certicom — a synonym for enabled; use the Certicom Security Builder libraries, libsbgse and libhuapi
    • openssl — use OpenSSL's libcrypt
io-blk
The default size cache size has changed. In previous releases, io-blk.so used 15% of system RAM to use as disk cache. This setting worked well as long as the memory was in the order of dozens of MBytes, but in modern targets where there's much more RAM available, this causes an over-allocation of memory that typically can have hundreds MBytes (or GBytes) of RAM allocated for the cache.

In this release, the default cache size has changed to 2 MB plus 2% of the free RAM available to a maximum of 512 MB. (Ref# J1625408)

What's new: Adaptive partitioning

We've made a number of changes to the adaptive partitioning scheduler (APS) in response to customer feedback and a review of the current architecture. Note that you can configure APS either programatically via SchedCtl() or by using the aps command line utility.

The changes include:

Allowing more partitions
The default partition limit used to be 8, and you could increase it to 16. The new limit is 32.
Increasing the resolution of partition budgets
You can now specify decimal places in percentage budgets with both the aps command and SchedCtl().
Removing extended (long) window reporting
In earlier releases, APS reported the last averaging window, window2 (10 × last averaging window), and window3 (10 × window2). This meant that the kernel code had to use 64-bit integer math, which is prone to overflows and adds overhead. For reasons of simplicity, reliability, and performance, the new implementation still reports the last averaging window, but not window2 or window3.
Allowing both partition names and IDs.
You can use either a name or ID with the aps modify and aps join commands. If you don't specify a name when you create a partition, its ID is used as the name.
Changing how threads are designated as critical
In earlier releases, a thread could be marked as critical either by using SchedCtl(SCHED_APS_MARK_CRITICAL, ...) or as a result of receiving a critical event, usually from an interrupt handler. At the same time there was a requirement that a critical thread be the highest-priority thread in the system and not share its priority with other threads.

We've replaced the concept of marked as critical by a new partition attribute: critical priority. Only threads at the critical priority and higher have access to the partition's critical budget. The aps create and aps modify commands have a new option that lets you specify the critical priority for a partition. As a result, we've removed the following:

  • the -c option for procnto
  • the SCHED_APS_MARK_CRITICAL and SCHED_APS_CLEAR_CRITICAL commands for SchedCtl()
  • the SIGEV_FLAG_CRITICAL bit and the SIGEV_MAKE_CRITICAL() and SIGEV_CLEAR_CRITICAL() macros for use with sigevent structures

Any source code using these will need to be updated.

Simplifying bankruptcy handling
You can now use procmgr_event_notify() to arrange to be notified when a bankruptcy occurs.

What's new: Audio

  • In the snd_mixer_element_volume1_range_t structure, there's a new a db_scale_factor member that permits applications to properly scale the min_db and max_db members in the structure. This scale factor permits you to take advantage of the updated decibel ranges available in recent audio drivers. (Ref # J1678388, J1689209)
  • In previous releases, by default, io-audio could save the mixer settings to a file allowing you to restore the audio driver’s state. In this release, io-audio doesn’t save the mixer settings to a file by default, but to enable state restoration, you can use the config_write_delay global option when you start io-audio. For more information, see the deva-util-restore.so entry in the QNX Neutrino Utilities Reference. (Ref # J1676600, J1689218)
  • The io-audio service has been updated:
    • You can now use the -m pool_name option to specify the name of a typed memory object to use. In this case, you must also specify the pool size.
    • You can now use the -c option to specify the name of a configuration file. This configuration controls various aspects of the audio service.
    • The PCM Software mixer no longer appears as a separate PCM device, so this impacts what you see when you run the ls command on the /dev/snd path.
    Previous to this release, the client fragment size was locked to the fragment size of the PCM software mixers. In this release, the client fragment size can be any multiple of the PCM software mixer fragment size.

What's new: Networking

We currently support OpenSSL 1.0.2i and OpenSSH 7.3.

fs-nfs3
When you use default buffer sizes, fs-nfs3 no longer corrupts files or crashes. (Ref# J1617416)
io-pkt-v4
This is now a symbolic link to io-pkt-v4-hc.
io-pkt-v4-hc, io-pkt-v6-hc
The following issues impact both io-pkt-v4-hc, io-pkt-v6-hc. We refer to both as simply io-pkt.
  • If random is running, io-pkt-v4-hc (io-pkt-v6-hc) uses /dev/random as the source of random data. Otherwise io-pkt uses its own (less sophisticated) builtin pseudo-random number generator. The random TCP/IP option is now ignored.
  • There are new num_tap_interface and num_tun_control_interface TCP/IP options that you can use to control the number of TAP and TUN interfaces.
  • The default for the TCP/IP stacksize option is now 4096 (4 KB) in 32-bit architectures, and 8192 (8 KB) in 64-bit architectures.
  • The stack no longer automatically maps enXX interface names to the actual interface names. Consequently, io-pkt no longer supports the enmap TCP/IP option.
  • There's a new aliasif option that you can use to specify the user and group IDs that io-pkt should use when the qnx.kern.droproot sysctl triggers it to do so.
lsm-qnet.so
New: Qnet no longer appends the domain name to entries under /net for nodes in the same domain. (Ref# 75539, J1346119, J474806)
named
This daemon now starts correctly with a configuration file for a forwarding DNS server. (Ref# J826519, J1550470)
wpa_supplicant
We support WiFi wpa_supplicant 2.5 for Marvell and Broadcom drivers. We've added a shim layer to assist with WiFi driver integration towards using the common wpa_supplicant 2.5. The common wpa_supplicant 2.5 enables easier integration of the Wireless Test Engine (WTE) required for WiFi alliance certification.

What's new: Libraries and header files


Note:
  • The version number of libc.so is now 4. This library is incompatible with the QNX SDP 6.6 version.
  • We've replaced the math library; the new version is based on FreeBSD's, with a few functions from NetBSD's. The version number of libm.so is now 3.

Some references to these libraries in the documentation haven't yet been updated. (Ref# J1627591)


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

acl_get_perm_np()
Test whether a given permission is present in an ACL permissions set
alignas(), __alignas_is_defined
Specify the alignment of an object
aligned_alloc()
Allocate aligned memory
alignof(), __alignof_is_defined
Get the alignment of a type
at_quick_exit()
Register functions to be called during program termination via quick_exit()
ATOMIC_*_LOCK_FREE
Macros that indicate whether an atomic type is lock-free
atomic_*
Data types for atomic operations
atomic_compare_exchange_*()
Compare and potentially exchange the value of an atomic object
atomic_exchange(), atomic_exchange_explicit()
Atomically change the value of an atomic object
atomic_fetch_add(), atomic_fetch_add_explicit()
Atomically add to the value of an atomic object
atomic_fetch_and(), atomic_fetch_and_explicit()
Atomically AND a value into an atomic object
atomic_fetch_or(), atomic_fetch_or_explicit()
Atomically OR a value into an atomic object
atomic_fetch_sub(), atomic_fetch_sub_explicit()
Atomically subtract from the value of an atomic object
atomic_fetch_xor(), atomic_fetch_xor_explicit()
Atomically OR a value into an atomic object
atomic_flag_clear(), atomic_flag_clear_explicit()
Atomically clear a flag
atomic_flag_test_and_set(), atomic_flag_test_and_set_explicit()
Atomically set a flag
atomic_init()
Initialize an atomic object
atomic_is_lock_free()
Determine whether atomic operations on an object are lock-free
atomic_load(), atomic_load_explicit()
Atomically read the value of an atomic object
atomic_signal_fence()
Fence between a thread and a signal handler executed in the same thread
atomic_store(), atomic_store_explicit()
Atomically set the value of an atomic object
atomic_thread_fence()
Generic memory order-dependent fence synchronization primitive
c16rtomb(), c32rtomb()
Convert a wide character into a multibyte character
call_once()
Dynamic package initialization
CMPLX(), CMPLXF(), CMPLXL()
Compute the value of a complex number from its real and imaginary parts
cnd_broadcast()
Unblock threads waiting on a condition
cnd_destroy()
Destroy a condition variable
cnd_init()
Initialize a condition variable
cnd_signal()
Unblock a thread that's waiting on a condition variable
cnd_timedwait()
Wait on a condition variable, with a time limit
cnd_wait()
Wait on a condition variable
exp2(), exp2f(), exp2l()
Compute the base-2 exponential function of a number
feclearexcept()
Clear the specified floating-point status flags
fedisableexcept()
Mask the specified floating-point exceptions
feenableexcept()
Unmask the specified floating-point exceptions
fegetenv()
Get the current floating-point environment
fegetexceptflag()
Get the states of the specified floating-point status flags
fegetprec()
Get the current floating-point precision
fegetround()
Get the current floating-point rounding direction
feholdexcept()
Save the floating-point environment, clear all flags, and ignore future errors
feraiseexcept()
Raise the specified floating-point exceptions
fesetenv()
Set the current floating-point environment
fesetexceptflag()
Set the states of the specified floating-point status flags
fesetprec()
Set the floating-point precision
fesetround()
Set the floating-point rounding direction
fetestexcept()
Determine which of the specified floating-point status flags are set
feupdateenv()
Restore the floating-point environment and raise any previously raised exceptions
fdim(), fdimf(), fdiml()
Compute the positive different between two floating-point numbers
fma(), fmaf(), fmal()
Multiply two floating-point numbers and then add a third number
fmax(), fmaxf(), fmaxl()
Determine the maximum of two floating-point numbers
fmin(), fminf(), fminl()
Determine the minimum of two floating-point numbers
_fnmatchv()
Check to see if a file or path name, given as an I/O vector, matches a pattern
fpclassify()
Categorize a floating-point number
fs_crypto_domain_add_dynamic() (deprecated)
Create a dynamic encryption domain and unlock it if requested
fs_crypto_domain_add_flags()
Create an encryption domain and unlock it if requested
fs_crypto_domain_hard_lock()
Lock a domain
fs_crypto_domain_lock_dynamic() (deprecated)
Lock a dynamic domain
fs_crypto_domain_remove_dynamic() (deprecated)
Destroy a dynamic domain
fs_crypto_domain_unlock_dynamic() (deprecated)
Unlock a dynamic domain
fs_crypto_domain_whitelist_configure()
Perform whitelist configuration for a domain whitelist
fs_crypto_domain_whitelist_ctrl()
Perform a control action for a domain whitelist
fs_crypto_domain_whitelist_ctrl_access_grant()
Grant a client access to a domain
fs_crypto_domain_whitelist_ctrl_access_revoke()
Revoke a client's access to a domain
fs_crypto_domain_whitelist_get_flags()
Get the flags for a domain whitelist
fs_crypto_domain_whitelist_set_flags()
Set the flags for a domain whitelist
fstatat()
Get information about a file or directory
futimens()
Set the access and modification times for a file
hwi_find_compatible()
Find a specific instance of an item
InterruptAttachArray()
Attach an interrupt handler (that returns an array of sigevents) to an interrupt source
_IO_READ_GET_NBYTES()
Calculate the number of bytes specified in a io_read_t message; see iofunc_read_verify()
_IO_WRITE_GET_NBYTES()
Calculate the number of bytes specified in a io_write_t message; see iofunc_write_verify()
iofunc_attr_init_sized()
Initialize the per-name attribute structure associated with a device
iofunc_mount_fini()
Clean up the iofunc_mount_t structure
iofunc_mount_init()
Initialize the iofunc_mount_t structure
iofunc_mount_set_time()
Set the timestamp resolution for iofunc functions and structures
iofunc_stat_format()
Populate a stat structure, specifying the form
isgreater()
Determine whether one floating-point number is greater than another
isgreaterequal()
Determine whether one floating-point number is greater than or equal to another
isless()
Determine whether one floating-point number is less than another
islessequal()
Determine whether one floating-point number is less than or equal to another
islessgreater()
Determine whether one floating-point number is less than or greater than another
isnormal()
Determine whether a floating-point number is normal
isunordered()
Determine whether a floating-point number is unordered
log2(), log2f(), log2l()
Compute the base-2 logarithm of a number
llrint(), llrintf(), llrintl()
Round a floating-point number to the nearest integer value, using the current rounding direction
llround(), llroundf(), llroundl()
Round a floating-point number to the nearest integer value
lrint(), lrintf(), lrintl()
Round a floating-point number to the nearest integer value, using the current rounding direction
lround(), lroundf(), lroundl()
Round a floating-point number to the nearest integer value
max_align_t
A type whose alignment requirement is at least as strict as that of every scalar type
mbrtoc16(), mbrtoc32()
Convert a wide character into a multibyte character
memory_order
Enumerated type for how regular, non-atomic memory accesses are to be ordered around an atomic operation
mkdtemp()
Make a unique temporary directory name
mkostemp(), mkostemps()
Make a unique temporary filename and open the file, specifying some flags
mkstemps()
Make a unique temporary filename that includes a suffix, and then open the file
MsgSendPulsePtr(), MsgSendPulsePtr_r()
Send a pulse (containing a pointer) to a process
mtx_destroy()
Destroy a mutex
mtx_init()
Initialize a mutex
mtx_lock()
Lock a mutex
mtx_timedlock()
Lock a mutex, with a time limit
mtx_trylock()
Attempt to lock a mutex
mtx_unlock()
Unlock a mutex
nan(), nanf(), nanl()
Return a quiet NaN
nearbyint(), nearbyintf(), nearbyintl()
Return a rounded integer value
nexttoward(), nexttowardf(), nexttowardl()
Compute the next representable floating-point number
procmgr_set_type_id()
Allows a function to change its own type identifier
posix_spawn_file_actions_addopen()
Add an open a file action to a spawn file action object. This function is now fully implemented.
posix_spawnattr_gettypeid()
Get the type identifier of a spawn attributes object
posix_spawnattr_settypeid()
Set the type identifier of a spawn attributes object
pthread_mutex_consistent()
Mark as consistent the state that's protected by a mutex
pthread_mutexattr_getrobust()
Get the robust attribute from a mutex attribute object
pthread_mutexattr_setrobust()
Set the robust attribute in a mutex attribute object
pthread_rwlockattr_getclock()
Get the clock attribute from a read-write lock attribute object
pthread_rwlockattr_setclock()
Set the clock attribute in a read-write lock attribute object
quick_exit()
Exit the calling program without completely cleaning up resources
_readdir64_r()
Read a directory and get stat information
readdir64_r()
Read a directory (reentrant)
recvmmsg()
Receive multiple messages from a socket
remquo(), remquof(), remquol()
Compute the floating point remainder
resmgr_detach_ctp()
Remove a pathname from the pathname space
scalbln(), scalblnf(), scalblnl()
Load the exponent of a radix-independent floating point number
SchedGetCpuNum()
Get the index of the CPU that a thread is currently running on
sendmmsg()
Send multiple messages to a socket
shutdown_system_with_reason()
Shut down the system, after saving a string that explains why.
signbit()
Determine whether a floating-point number is negative
slog2_find_buffer()
Find the handle for a buffer with a given name
static_assert()
Display a diagnostic message at compile time
stpcpy()
Copy a string and return a pointer to the end of the result
stpncpy()
Copy a fixed-length string and return a pointer to the end of the result
strcasestr()
Find one string inside another, ignoring case
shutdown_system_with_reason()
Shut down the system, after saving a string that explains why.
SignalKillSigval(), SignalKillSigval_r()
Send a signal to a process group, process, or thread
slog2_hash()
Convert an input string into an obfuscated non-reversible hash string
slog2_obfuscate()
Obfuscate file and directory names by replacing some characters
SysSrandom(), SysSrandom_r()
Install a source of entropy for the kernel's pseudorandom number generator
tgamma(), tgammaf(), tgammal()
Compute the gamma function of a number
thrd_create()
Create a thread
thrd_current()
Get the calling thread's ID
thrd_detach()
Detach a thread from a process
thrd_equal()
Compare two thread IDs
thrd_exit()
Terminate a thread
thrd_join()
Join thread
thrd_sleep()
Make a thread sleep
thrd_yield()
Yield to other ready threads at the same priority
ThreadCtlExt(), ThreadCtlExt_r()
Control a thread, specifying the process and thread IDs.
timespec_get()
Get the number of seconds and nanoseconds since a given epoch
trunc(), truncf(), truncl()
Round to a truncated integer value
tss_create()
Create a thread-specific storage key
tss_delete()
Delete thread-specific storage
tss_get()
Get a thread-specific data value
tss_set()
Set a thread-specific data value
utimensat()
Set the access and modification times for a file
vslog2fa()
Log a printf-style string in a slog2 buffer (varargs)

We've removed the following:

Instead of using: Use:
atoh(string) strtoul(string, NULL, 16)
chsize() ftruncate()
_cmdfd()
DCMD_PROC_FREEZETHREAD, DCMD_PROC_THAWTHREAD
ds_clear(), ds_create(), ds_deregister(), ds_flags(), ds_get(), ds_register(), ds_set()
eof() Check the result of read()
fgetchar() fgetc(stdin)
flushall() fflush(NULL)
fp_exception_mask() fedisableexcept(), feenableexcept()
fp_exception_value() fetestexcept()
fp_precision() fegetprec(), fesetprec()
fp_rounding() fegetround(), fesetround()
fputchar() fputc(c, stdout)
gamma() lgamma()
getprio() pthread_getschedparam() or SchedGet()
input_line()
mphys() mem_offset()
pccard_*()
pci_*() See the PCI Server User's Guide
posix_spawnattr_addpartid(), posix_spawnattr_addpartition(), posix_spawnattr_getpartid()
setprio() pthread_setschedparam() or SchedSet()
strcmpi(), stricmp() strcasecmp()
strnicmp() strncasecmp()
strnset(), strset() memset()
tell(), tell64() lseek(fd, 0, SEEK_CUR)

Other changes include:

64-bit architecture
The prototypes for the following have changed:
  • mallopt()
  • memcpyv()
  • MsgRead(), MsgRead_r()
  • MsgReadv(), MsgReadv_r()
  • MsgReceive(), MsgReceive_r()
  • MsgReceivePulse(), MsgReceivePulse_r()
  • MsgReceivePulsev(), MsgReceivePulsev_r()
  • MsgReceivev(), MsgReceivev_r()
  • MsgReply(), MsgReply_r()
  • MsgReplyv(), MsgReplyv_r()
  • MsgSend(), MsgSend_r()
  • MsgSendnc(), MsgSendnc_r()
  • MsgSendsv(), MsgSendsv_r()
  • MsgSendsvnc(), MsgSendsvnc_r()
  • MsgSendv(), MsgSendv_r()
  • MsgSendvnc(), MsgSendvnc_r()
  • MsgSendvs(), MsgSendvs_r()
  • MsgSendvsnc(), MsgSendvsnc_r()
  • MsgWrite(), MsgWrite_r()
  • MsgWritev(), MsgWritev_r()
  • resmgr_msgread()
  • resmgr_msgreadv()
  • resmgr_msgreply()
  • resmgr_msgwrite()
  • resmgr_msgwritev()

The data types have changed for some members of the following:

  • _clockperiod — see ClockPeriod()
  • inheritance — see spawn()
  • iofunc_notify_event_t — see iofunc_notify()
  • message_attr_t
  • _msg_info
  • resmgr_attr_t
  • resmgr_context_t

For more information, see Migrating to QNX SDP 7.0 and the QNX Neutrino C Library Reference.

*64()
The large-file support functions and data types now appear in the name space only if you define _LARGEFILE64_SOURCE when you compile your code. In earlier versions of the OS, these functions appeared in the default name space, but not in others such as POSIX_C_SOURCE.

These functions and data types support 64-bit file offsets. They're stopgap measures that you might need to use until the default file offsets are 64 bits long:

  • If you want to use 64-bit file offsets everywhere, set _FILE_OFFSET_BITS=64 when you compile, and then use off_t and the normal functions (e.g., open() instead of open64()). Use fseeko() and ftello() instead of fseek() and ftell().
  • If you need to use both 32- and 64-bit file offsets in a program, set _FILE_OFFSET_BITS=32 and define _LARGEFILE64_SOURCE when you compile, and then use the large-file support functions when you need to use 64-bit offsets.
  • If you're porting source that uses the large-file support functions, define _LARGEFILE64_SOURCE when you compile.

In header files and code, don't refer directly to _FILE_OFFSET_BITS or _LARGEFILE64_SOURCE; use __OFF_BITS__ and __EXT_LF64SRC instead.

dispatch_create_channel()
New: This function can now set errno to the following:
  • EBUSY — you specified DISPATCH_FLAG_CHANNEL_COIDDEATH in the flags, and a dispatch framework with that flag already exists.
  • EINVAL — the flags argument is invalid.

(Ref# J1593102)

errno
POSIX requires that the error numbers in <errno.h> have unique values. In order to satisfy this requirement, we earlier changed EALREADY so that it no longer had the same value as EBUSY. To smooth the transition to the new value of EALREADY, we defined EALREADY_OLD, EALREADY_NEW, and EALREADY_DYNAMIC. In this release, we've set the value of EALREADY to 237 and removed the transitional versions.
exec*()
New: These functions now correctly enforce the limit (ARG_MAX bytes) on the size of arguments for processes. (Ref# J1561281)
flock()
We've corrected the behavior of this function: if you open the same file multiple times in a process, an flock() on one file descriptor referring to a file now locks out an flock() on a different fd. (Ref# J736874)
ham_attach()
This function now sets errno to ENOENT if there isn't a process with the specified process ID.
ioctl()
The SIOCDARP, SIOCGARP, and SIOCSARP commands aren't implemented, so we've removed their definitions. (Ref# J1589096)
iofunc_lock()
There's a new F_FLOCK bit that's ORed into the l_type member of the flock structure to indicate that the _IO_LOCK message originated as a call to flock() instead of a call to fcntl(). Your resource manager can check this bit and behave appropriately; see the entry for iofunc_lock() in the C Library Reference. (Ref# J736874)
j0(), j1(), jn(), y0(), y1(), yn()
These functions are now in libm instead of libbessel (which we no longer ship).
libm
We've replaced the math library, resulting in changes to the following:
  • acos(), acosf(), acosl()
  • acosh(), acoshf(), acoshl()
  • asin(), asinf(), asinl()
  • asinh(), asinhf(), asinhl()
  • atan(), atanf(), atanl()
  • atan2(), atan2f(), atan2l()
  • atanh(), atanhf(), atanhl()
  • cabs(), cabsf()
  • cbrt(), cbrtf(), cbrtl()
  • ceil(), ceilf(), ceill()
  • copysign(), copysignf(), copysignl()
  • cos(), cosf(), cosl()
  • cosh(), coshf(), coshl()
  • erf(), erff(), erfl()
  • erfc(), erfcf(), erfcl()
  • exp(), expf(), expl()
  • expm1(), expm1f(), expm1l()
  • fabs(), fabsf(), fabsl()
  • floor(), floorf(), floorl()
  • fmod(), fmodf(), fmodl()
  • frexp(), frexpf(), frexpl()
  • hypot(), hypotf(), hypotl()
  • ilogb(), ilogbf(), ilogbl()
  • j0(), j0f()
  • j1(), j1f()
  • jn(), jnf()
  • ldexp(), ldexpf(), ldexpl()
  • lgamma(), lgamma_r(), lgammaf(), lgammaf_r(), lgammal(), lgammal_r()
  • log10(), log10f(), log10l()
  • log1p(), log1pf(), log1pl()
  • logb(), logbf(), logbl()
  • log(), logf(), logl()
  • modf(), modff(), modfl()
  • nextafter(), nextafterf(), nextafterl()
  • pow(), powf(), powl()
  • remainder(), remainderf(), remainderl()
  • rint(), rintf(), rintl()
  • round(), roundf(), roundl()
  • scalbn(), scalbnf(), scalbnl()
  • scalb()
  • sin(), sinf(), sinl()
  • sinh(), sinhf(), sinhl()
  • sqrt(), sqrtf(), sqrtl()
  • tan(), tanf(), tanl()
  • tanh(), tanhf(), tanhl()
  • y0(), y0f()
  • y1(), y1f()
  • yn(), ynf()
libxml2.so.2
New: We now ship the libxml2.so.2 XML parser library instead of libxml2.so.1.
localtime()
New: This function now sets errno to EOVERFLOW if the result can't be represented, as required by POSIX. (Ref# J1649373)
mmap()
This function now enforces the POSIX requirement that you specify either MAP_PRIVATE or MAP_SHARED.

Note: If you specify neither, mmap() returns MAP_FAILED and sets errno to EINVAL; if you try to use the mapped-in object, you'll get a SIGSEGV.

We've also deleted the long-deprecated MAP_PRIVATEANON flag. Use MAP_PRIVATE | MAP_ANON instead.

msync()
New: The MS_ASYNC flag is now handled in the same way as MS_SYNC. (Ref# J1685317, J1685476)
posix_fallocate()
This function now correctly returns 0 or an error code, instead of returning 0 or -1 and setting errno if an error occurs. (Ref# J1279909)
posix_spawn(), posix_spawnp()
New: These functions now correctly enforce the limit (ARG_MAX bytes) on the size of arguments for processes. (Ref# J1561281)
posix_spawn_file_actions_addopen()
This function is now fully implemented. (Ref# J701207)
slog2*()
We no longer ship <slog2.h>, which simply included <sys/slog2.h>. You should include <sys/slog2.h> directly. (Ref# J1698918)
spawn*()
New: These functions now correctly enforce the limit (ARG_MAX bytes) on the size of arguments for processes. (Ref# J1561281)
speed_t
In order to conform to POSIX, this type is now an unsigned 32-bit integer. (Ref# J1469366)
ThreadCreate()
This function now correctly checks the priority range when PTHREAD_EXPLICIT_SCHED is set. (Ref# 28763, J166539)
ThreadCtl()
There are new flags that govern how and if a process shares its mutexes:
  • _NTO_TF_SHR_MUTEX — place no restrictions on which threads to share mutexes with.
  • _NTO_TF_SHR_MUTEX_EUID — share mutexes only with threads that have the same effective user ID as this thread.

If neither flag is set, the thread doesn't share mutexes with any threads outside its process. This is the default for procnto's threads; the default for threads in other processes is _NTO_TF_SHR_MUTEX. You can use the new _NTO_TCTL_SHR_MUTEX command for ThreadCtl() to change this setting. For example, if your thread doesn't intend to share any of its mutexes with threads in other processes, you can improve security by calling:

unsigned int value = 0;
ThreadCtl( _NTO_TCTL_SHR_MUTEX, (void *)&value);
  

What's new: Board Support Packages

If you have a BSP for an earlier version of QNX SDP, and you need to update that BSP to QNX SDP 7.0, we recommend that you do so as follows:

  1. Find a QNX SDP 7.0 BSP that uses the same (or similar) SoC or CPU as your BSP.
  2. Create a copy of the version 7.0 BSP, and then incorporate any custom code from your BSP into it (in particular, board startup code, IPL code, and any device driver code that you may have modified).

QNX SDP 7.0 includes the latest, up-to-date versions of various startup library code, other support libraries, device drivers, and utilities; even if you manually update an older BSP so that it compiles in a QNX SDP 7.0 environment, you won't necessarily incorporate all of these changes and updates into your own updated BSP, and may wind up with something that isn't equivalent to an SDP 7.0 BSP. Therefore, we recommend incorporating your board-specific code deltas into an existing QNX SDP 7.0 BSP, rather than attempt to manually bring a QNX SDP 6.x BSP forward to SDP 7.0.

What's new: Drivers

Block-oriented drivers (devb-*)

We now support disks that are 2 TB or larger. Full testing was performed on 4 TB hard drives and basic validation tests were run on 10 TB hard drives.

devb-ram
This driver no longer formats the RAM disk by default, so the nodinit option is no longer supported.

Network drivers (devnp-*)

The new drivers include:

devnp-smsc9500.so
Driver for the SMSC9500 USB Ethernet dongle (replaces devn-smsc9500.so)
devnp-usbnet.so
Class driver for USB host network devices (CDC network modules and RNDIS)
devnp-virtio.so
Driver for Virtio networking
devnp-vmxnet3.so
Driver for the VMware VMXNET3 network interface

Other changes include:

devnp-asix.so, devnp-ecm.so, devnp-ecmplus.so, devnp-ncm.so
These drivers now correctly wait the default time of 60 seconds before giving up when trying to connect to the USB host stack. (Ref# J583790)

What's new: Documentation

The new documents include:

Migrating to QNX SDP 7
Describes how to update your code from QNX SDP 6.5 or 6.6 to run in QNX Neutrino 7.0.
Boot Optimization Guide
Describes the stages of booting a board, and ways to optimize the time it takes to boot into QNX Neutrino.
Customizing a BSP
Describes how to modify a QNX Board Support Package or develop your own.
PAM Reference
Describes the set of configurable and pluggable authentication modules that are included as part of QNX Neutrino.
PCI Server User's Guide
Describes how to connect to and configure Peripheral Component Interconnect (PCI) devices.
Security Developer's Guide
Describes best practices and provides examples on how to design and protect systems that minimize damage in case of an attack.

We've updated the existing documentation too, including major updates to Building Embedded Systems, the IDE User's Guide, and the QNX Neutrino Programmer's Guide. Other changes include:

  • The entries in the Utilities Reference identify which abilities (see procmgr_ability()) a utility needs in order to function properly without having to run as root. This work is ongoing, but you can use secpolmonitor to determine these abilities for a utility or application.
  • The QNX Neutrino User's Guide now correctly says that the limit on system RAM on 32-bit x86 targets is 32 GB. (Ref# J1564595)

C Library Reference

The C Library Reference includes the following updates:

aio_read()
The asynchronous operation now gives an error of EISDIR if the given file descriptor is for a directory.
cache_init()
If you specify NULL for the DLL name, this function now uses the library specified by the LIBCACHE_DLL_PATH environment variable, instead of constructing a name and searching the library paths for it.
chroot()
  • The ability to change the root directory is now controlled by the PROCMGR_AID_CHROOT ability, which you can set by calling procmgr_ability().
  • This function now changes the current working directory to the given path.
ConnectAttach(), ConnectFlags()
There's a new _NTO_COF_NOEVENT flag that prevents the server from sending sigevents over the channel to the client. This is a security measure that you should typically use when a higher-privileged process is connecting to a lower-privileged process's channel. Only the client can clear this bit.
ConnectClientInfo(), ConnectClientInfoAble(), ConnectClientInfoExt()
  • The flags member of the _client_info structure can now include these bits:
    • _NTO_CI_BITS_64 — the sender is using a 64-bit architecture.
    • _NTO_CI_CHROOTchroot() has been applied to the client process.
    • _NTO_CI_SANDBOX — the client process has been constrained to a sandbox.
  • If an ability ID is a temporary one (i.e., it has PROCMGR_AID_UNCREATED ORed into it), ConnectClientInfoAble() looks it up again. If the ability has been created, ConnectClientInfoAble() replaces the temporary ID with the permanent one; otherwise it marks the ability as denied.
ConnectFlags()
  • The ability to request information about another process is now controlled by the PROCMGR_AID_XPROCESS_QUERY ability enabled, which you can set by calling procmgr_ability().
  • Only the kernel can clear the _NTO_COF_INSECURE flag.
errno
  • We've set the value of EALREADY to 237, and removed EALREADY_OLD, EALREADY_NEW, and EALREADY_DYNAMIC, which we added to smooth the transition to the new value of EALREADY.
  • We've added ENOTRECOVERABLE.
fcntl()
We've implemented the F_DUPFD_CLOEXEC command, which is similar to F_DUPFD but also sets FD_CLOEXEC.
flock()
We've corrected the behavior of this function: if you open the same file multiple times in a process, an flock() on one file descriptor referring to a file now locks out an flock() on a different fd.
fnmatch()
The flags can now include FNM_CASEFOLD (a BSD extension) and FNM_LEADING_DIR (a GNU extension).
fopen()
You can now add x to the w and w+ specifiers to prevent this function from overwriting the file if it already exists.
fpathconf()
The configurable limits now include _PC_CASE_PRESERVING and _PC_CASE_SENSITIVE.
ioctl()
We've deleted the unimplemented SIOCDARP, SIOCGARP, and SIOCSARP commands.
iofunc_attr_t
This structure now includes mtime_ns, atime_ns, and ctime_ns fields that hold the nanosecond values for the POSIX time members, mtime, atime, and ctime.
iofunc_lock()
As a QNX Neutrino extension, F_FLOCK is ORed into the l_type member of the flock structure to indicate that the message originated as a call to flock() instead of a call to fcntl(). Your resource manager can check this bit and behave appropriately.
iofunc_lseek()
We've changed the zero member of _io_lseek to flags. The only flag is currently _IO_LSEEK_IGNORE_NON_SEEKABLE.
iofunc_notify()
  • There's a new _NOTIFY_ACTION_EDGEARM action that considers input conditions as met only if new data has arrived since the last call to ionotify() with this action.
  • This function now also handles _IO_NOTIFY64 messages.
iofunc_ocb_t
The flags member can now include the IOFUNC_OCB_MMAP_UNIQUE bit, a hint for the mmap() handler to provide a unique mapping.
iofunc_read_verify()
  • This function now also handles _IO_READ64 messages.
  • The xtype can now include _IO_XTYPE_READDIR.
  • The xtype can now include a flag (_IO_XFLAG_DIR_STAT_FORM_*) that specifies the type of stat structure to return when reading from a directory.
iofunc_stat_default()
The _io_stat structure now includes a format member, and iofunc_stat_default() fills in the corresponding form of struct stat.
iofunc_utime()
This function now also handles _IO_UTIME64 messages.
iofunc_write_verify()
This function now also handles _IO_WRITE64 messages.
ionotify()
There's a new _NOTIFY_ACTION_EDGEARM action that considers input conditions as met only if new data has arrived since the last call to ionotify() with this action.
j0(), j1(), jn()
These functions are now in libm.
lio_listio()
The number of entries in the list array is now limited only by memory. You can use any type of sigevent if the mode is LIO_NOWAIT.
mallopt_flags()
Because the virtual memory manager doesn't support MAP_NOINIT, this function no longer refers to the MALLOC_MMAP_NOZERO environment variable.
mem_offset(), mem_offset64()
These functions now succeed only if the memory in question is locked; they set errno to EAGAIN if the memory is unlocked.
mktemp()
We've adopted the OpenBSD implementation of this function, which generates file names that are less predictable. As a result, the template must now include at least six X wildcard characters, and the error codes have changed. Note that POSIX 2008.1 removed the specification for this function.
mmap(), mmap_device_memory(), mprotect()
  • The mmap() function now enforces the POSIX requirement that you specify either MAP_SHARED or MAP_PRIVATE.
  • In order to simultaneously set PROT_EXEC and PROT_WRITE, your process must have the PROCMGR_AID_PROT_WRITE_AND_EXEC ability enabled (in addition to PROCMGR_AID_PROT_EXEC).
  • The new virtual memory manager doesn't support MAP_NOINIT, MAP_BELOW16M, or MAP_NOX64K. You can use typed memory instead of MAP_BELOW16M.
  • We've deleted the long-deprecated MAP_PRIVATEANON flag. Use MAP_PRIVATE | MAP_ANON instead.
_msg_info
The flags field can now include the following:
  • _NTO_MI_BITS_64 — the sender is using a 64-bit architecture.
  • _NTO_MI_BITS_DIFF — the sender and receiver are using different word-size architectures.
  • _NTO_MI_CHROOTchroot() has been applied to the client process.
  • _NTO_MI_SANDBOX — the client process has been constrained to a sandbox.
MsgKeyData()
There's a new _NTO_KEYDATA_CALCULATE_REUSE flag that lets you reuse a previously generated key.
msync()
There's a new MS_CLEAN_ONLY flag that makes the function operate only on clean pages.
munmap_flags()
Because the virtual memory manager doesn't support MAP_NOINIT, this function no longer supports UNMAP_INIT_OPTIONAL or UNMAP_INIT_REQUIRED. There are currently no flags defined for this function.
open()
O_CLOEXEC and O_NOFOLLOW are now defined by POSIX.
pathconf()
The configurable limits now include _PC_CASE_PRESERVING and _PC_CASE_SENSITIVE.
posix_madvise()
There's a new POSIX_MADV_DISCARD_NP flag that makes the virtual memory manager discard the backing store for lazy private mappings (similar to madvise(MADV_DONTNEED) in Linux).
posix_spawn()
  • You can now pass a relative path to this function.
  • The POSIX_SPAWN_PADDR64_SAFE extended flag is no longer supported. Use typed memory for specific allocations.
pread()
This function now gives an error of EISDIR if the given file descriptor is for a directory.
procmgr_ability()
The new abilities include:
  • PROCMGR_AID_CHANNEL_CONNECT
  • PROCMGR_AID_CHROOT
  • PROCMGR_AID_MAC_POLICY
  • PROCMGR_AID_POWER
  • PROCMGR_AID_PROT_WRITE_AND_EXEC
  • PROCMGR_AID_RLIMIT_PEER
  • PROCMGR_AID_SANDBOX
  • PROCMGR_AID_SETTYPEID
  • PROCMGR_AID_SRANDOM
  • PROCMGR_AID_XPROCESS_QUERY
  • PROCMGR_AID_XTHREAD_THREADCTL

This function now gives an error of ENXIO if the process indicated by pid is no longer valid.

procmgr_ability_lookup()
If you look up an ability that hasn't yet been created, the identifier that this function returns includes the PROCMGR_AID_UNCREATED bit. You can use the temporary identifier with ConnectClientInfoAble() (which will see if the ability has been created and give you a permanent identifier), but not with procmgr_ability().
procmgr_event_notify(), procmgr_event_notify_add(), procmgr_event_trigger()
  • The new flags include:
    • PROCMGR_EVENT_PROCESS_DEATH — be notified of every process that dies.
    • PROCMGR_EVENT_APS_BANKRUPTCY — be notified when an adaptive partition goes bankrupt.
  • We've updated the examples to use /proc/pid/ctl instead of /proc/pid/as.
pthread_mutex_init()
This function now returns EOK instead of EBUSY if you initialize a mutex that's already been initialized.
pthread_mutex_lock(), pthread_mutex_timedlock(), pthread_mutex_trylock(), pthread_mutex_unlock()
The behavior of these functions now depends on whether or not you're using a robust mutex; see pthread_mutexattr_settype().
read(), readblock(), readv()
These functions now give an error of EISDIR if the given file descriptor is for a directory.
resmgr_attach()
There's a new _RESMGR_FLAG_DETACH_CTP flag that indicates that the manager will use resmgr_detach_ctp() on the path.
ROUTE protocol
We've updated the data structures and the list of flags.
SchedCtl()
  • The following control commands are new:
    • SCHED_CONT_APP — make an app continue
    • SCHED_STOP_APP — stop an app
  • The following commands are no longer supported:
    • SCHED_APS_MARK_CRITICAL
    • SCHED_APS_CLEAR_CRITICAL
    • SCHED_APS_ATTACH_EVENTS — use procmgr_event_notify() or procmgr_event_notify_add() with a flag of PROCMGR_EVENT_APS_BANKRUPTCY instead
  • The SCHED_APS_SCHEDPOL_NO_LONG_REPORTING scheduling policy is no longer supported.
  • For SCHED_APS_CREATE_PARTITION:
    • If you don't specify a name for the partition, it's set to the partition's ID. If you provide a name, it must be no longer than APS_PARTITION_NAME_LENGTH, not including the trailing null character, can't start with a digit, and can't include any slashes (/).
    • You can use the new budget_percent_scale member of the sched_aps_create_parms structure to specify the number of digits to the right of the decimal point in budget_percent.
  • The SCHED_APS_BNKR_LOG and SCHED_APS_BNKR_RECOMMENDED responses for bankruptcy are no longer supported.
setrlimit()
There's a new RLIMIT_NOCONN_NP limit that specifies the maximum number of connections that a process can create.
shm_ctl(), shm_ctl_special()
  • We've clarified the circumstances in which you can call these functions.
  • Memory defragmentation isn't currently supported, so the SHMCTL_NODEFRAG flag has no effect.
  • The meanings of the bits in the special argument for shm_ctl_special() for ARM processors have changed.
  • We've discontinued SHMCTL_ISADMA; use typed memory instead.
  • We've discontinued SHMCTL_NOX64K; manually align the memory instead.
shm_open()
You can now create an anonymous shared memory object by specifying SHM_ANON for the name.
shutdown_system()
The shutdown type now includes SHUTDOWN_SHELFMODE.
sigevent
  • There are now 32- and 64-bit versions of this structure, along with several new macros for initializing it:
    • SIGEV_PULSE_INT_INIT()
    • SIGEV_PULSE_PTR_INIT()
    • SIGEV_SIGNAL_CODE_INT_INIT()
    • SIGEV_SIGNAL_CODE_PTR_INIT()
    • SIGEV_SIGNAL_VALUE_INT_INIT()
    • SIGEV_SIGNAL_VALUE_PTR_INIT()
  • You can no longer use a sigevent to make a thread run as critical when you're using adaptive partitioning. As a result, we've removed the following:
    • the SIGEV_FLAG_CRITICAL bit
    • the SIGEV_MAKE_CRITICAL() and SIGEV_CLEAR_CRITICAL() macros
slog2*()
We've discontinued the <slog2.h> file, which simply included <sys/slog2.h>. You should include <sys/slog2.h> instead.
slog2_register()
  • We've documented the SLOG2_DISCARD_NEWLINE and SLOG2_TRY_REUSE_BUFFER_SET flags.
  • The flags can now include SLOG2_HINT_SKIP_BUFFER_0, SLOG2_HINT_SKIP_BUFFER_1, SLOG2_HINT_SKIP_BUFFER_2, and SLOG2_HINT_SKIP_BUFFER_3. They're hints to ignore buffer 0 through 3, respectively, when parsing. To force the parsing of these hidden/skipped buffers, invoke slog2info with the -v option.
socket()
There's a new SOCK_CLOEXEC bit that you can OR into the type to make the socket close if the program calls one of the exec*(), posix_spawn*(), or spawn*() functions.
spawn()
  • The SPAWN_PADDR64_SAFE extended flag is no longer supported. Use typed memory for specific allocations.
  • You no longer need to set the SPAWN_SEARCH_PATH flag, although it's still used internally.
stat
There are now several different versions of this structure, depending on the architecture (32- or 64-bit) and the version of POSIX.
SyncMutexLock()
This function now indicates an error of EOWNERDEAD if the owner of the lock died while holding it.
ThreadCtl()
  • There's a new _NTO_TCTL_SHR_MUTEX command that sets the new _NTO_TF_SHR_MUTEX and _NTO_TF_SHR_MUTEX_EUID flags that control if and how a thread shares mutexes. If you don't set either flag, the thread doesn't share mutexes with any threads outside its process. This is the default setting for procnto's threads; for threads in other processes, the default is _NTO_TF_SHR_MUTEX.
  • There's a new _NTO_TCTL_LOW_LATENCY flag that hints to the scheduler that it should schedule the thread on the same CPU as the one that the kernel is currently on.
timer_settime(), timer_timeout(), TimerSettime(), TimerTimeout()
You can now use the timer tolerance to specify a high-resolution timer. For more information, see Tolerant and high-resolution timers in the Understanding the Microkernel's Concept of Time chapter of the QNX Neutrino Programmer's Guide.
TimerInfo()
The ability to request information about another process is now controlled by the PROCMGR_AID_XPROCESS_QUERY ability, which you can set by calling procmgr_ability().
y0(), y1(), yn()
These functions are now in libm.

Utilities Reference

The Utilities Reference includes the following new entries:

autoipd
AutoIP negotiation utility for link-local addresses
devnp-smsc9500.so
Driver for the SMSC9500 USB Ethernet dongle (replaces devn-smsc9500.so)
devnp-usbnet.so
Class driver for USB host network devices (CDC network modules and RNDIS)
devnp-virtio.so
Driver for Virtio networking
devnp-vmxnet3.so
Driver for the VMware VMXNET3 network interface
diskimage
Create an image for a partitioned medium, such as a hard drive, SD card, or MMC
diskimage configuration file
Configuration file for diskimage
dns-sd
Multicast DNS (mDNS) and DNS Service Discovery (DNS-SD) test tool
elfnote
Display or modify the contents of an ELF note (QNX)
hostapd_cli
Query the hostapd daemon from a command-line client
iperf2
Perform network throughput tests
iperf3
Perform network throughput tests
io-usb-otg
On-The-Go (OTG) server for universal serial bus (USB)
lsm-llmcast.so
Low-latency multicast module
lzmadec
Small .lzma decompressor
lzmainfo
Show information stored in the .lzma file header
lzcat, lzma
Compress or decompress .lzma files
mdnsd
Multicast and Unicast DNS daemon
mkmerklefs
Make Merkle filesystem.
mktemp
Create a unique temporary file or directory
pci-server
Resource manager process that manages the PCI hierarchy
pci-tool
Display PCI information
pted
Partition table editor
ptpd
Precision Time Protocol daemon
qad
QNX anomaly detector
resvanonport
Add ports to the anonportalgo.reserve sysctl mask
rsrcdb_query
Display database entries for PCI-related resources
startup-uefi
Startup for x86 systems
startup-x86
Startup for x86 systems
unxz, unlzma
Decompress .xz and .lzma files
xzcat
Decompress .xz files
xzdec, lzmadec
Small .xz and .lzma decompressors
xz
Compress or decompress .xz and .lzma files

Other changes include the following:

aps
  • The create command now has a -P option that lets you specify the critical priority for the partition. Only threads at the critical priority or higher can use the critical budget.
  • You can now specify a partition ID or name when you use the modify command.
  • You can specify decimal places for the value of the -b and -m options for the create and modify commands.
  • The list of scheduling policies for the -S option no longer includes no_long_reporting.
  • There's a new join command that you can use to make a process or thread join a partition.
  • The list of bankruptcy policies for the -y option no longer includes log or recommended.
chkqnx6fs
There's a new -p option that causes the utility to proceed, even if one superblock is damaged.
cmp
We now ship the GNU version of this utility.
coreinfo
We now ship this utility for development hosts.
dd
There's a new ext option that lets you apply some QNX Neutrino extensions to this utility. The currently defined extensions control how the seek and skip options behave.
devb-ram
This driver no longer formats the RAM disk by default, so the nodinit is no longer supported.
devb-umass
The umass options include a new maxmerror option.
devnp-ncm.so
  • You can now use an additional argument to the ext_name option if you want to specify an explicit name for the interface.
  • New options:
    • cache=num — use a cacheable buffer for the bulk endpoint point
    • prio=priority — specify the priority of the USB callback thread.
dhclient
The following options are new:
  • -vs
  • -xf
  • -R — we've changed the old -R option (a QNX Neutrino extension) to --no-def-route, in order to avoid a conflict with this option.
dumper
The following options are new:
  • -E — specify the maximum size for the list of the names of the most recent dump files.
  • -H — suppress the dumping of memory if the memory usage is greater than the given size.
  • -I — include the process ID in the core file's name.

We've removed the -D option; use -d instead.

esh
The default type of filesystem for the emount command is now qnx6 (Power-Safe filesystem).
fdisk
The default partition type for the add command is now 178 (Power-Safe filesystem).
fs-cifs
  • The new options include:
    • -g — don't accept a guest session.
    • -s — set the SMB-signature support mode
  • The -b option has been discontinued.
fs-qnx6.so
  • You can now specify an amount in blocks or bytes for the alimit option.
  • The following options are new:
    • acl — enable or disable persistent ACL support (enabled by default)
    • dirgest — create directory digests
    • fs-alloc-strategy — set the allocation strategy
    • hold-eagain — control whether snapshots with hold or -snapshot returns EAGAIN
    • lnk — how to handle symbolic links
    • trim-limit — set trim/discard constraints
getconf
The configurable limits now include _PC_CASE_PRESERVING and _PC_CASE_SENSITIVE.
hostapd
There are new parameters for entropy file, output file, global control interface (and group), and PID file.
ifconfig
There's a new aliasif parameter that you can use to configure the alias interface.
if_up
There's a new -m option that lets you specify in milliseconds the interval to use before rewalking the interface list.
io-audio
  • You can now use the -m pool_name option to specify the name of a typed memory object to use. In this case, you must also specify the pool_size.
  • You can now use the -c option to specify the name of a configuration file. This configuration controls various aspects of the audio service.
  • You can now use the policy_conf=path_to_file to specify the location of the configuration file for audio policies, such as audio ducking, volume ramping, and auto-pausing on the system.
  • The PCM Software mixer no longer shows as a separate PCM device, so this impacts what you see when you run the ls command on the /dev/snd path.
  • Previous to this release, the client fragment size was locked to the fragment size of the PCM software mixers. In this release, the client fragment size can be any multiple of the PCM software mixer fragment size.
io-blk.so
  • The default cache size is now 2 MB plus 2% of system RAM.
  • There's a new rapolicy option that lets you specify the read-ahead policy.
io-pkt-*
  • If random is running, io-pkt uses /dev/random as the source of random data. Otherwise io-pkt uses its own (less sophisticated) builtin pseudo-random number generator. The random TCP/IP option is now ignored.
  • There are new num_tap_interface and num_tun_control_interface TCP/IP options that you can use to control the number of TAP and TUN interfaces.
  • The default for the TCP/IP stacksize option is now 4096 (4 KB) in 32-bit architectures, and 8192 (8 KB) in 64-bit architectures.
  • The stack no longer automatically maps enXX interface names to the actual interface names. Consequently, io-pkt no longer supports the enmap TCP/IP option.
  • There's a new aliasif option that you can use to specify the user and group IDs that io-pkt-* should use when the qnx.kern.droproot sysctl triggers it to do so.
login
We've discontinued the -c and -u options.
mkefs
You can no longer generate version 2 flash filesystem (FFS2) images.
mkifs
  • We've added more details about the mkifsf_* image filters and added mkifsf_uefi.
  • We've updated the list of bootfiles (see the virtual attribute).
mkqnx6fs
  • The -e is no longer supported.
  • Support for file data encryption is always enabled, so the -E option is now ignored.
  • The default blocksize is now 4096 bytes.
  • There's a new -d option that makes the filesystem use a B-tree structure for the root and .boot directories.
mkqnx6fsimg
  • There's a new dflt_boot attribute that you can use to specify the boot image to use by default at system startup.
  • We've discontinued the alloc_bnd attribute.
mount
If mount can't figure out which filesystem to use, it uses the Power-Safe filesystem (fs-qnx6.so).
mount_ifs
There's a new -C option for specifying the chunk size.
netstat
  • We've updated the list of flags that indicate the state of the route.
  • The -T option is now implemented, and we've documented the -t option.
nicinfo
The -r option and the device argument (both for compatibility with io-net drivers) are no longer supported.
on
The memory manager no longer supports the SPAWN_PADDR64_SAFE flag, so the -P has been removed.

The following options are new:

  • -S path — specify the path to the security policy file.
  • -T type — specify the security type for the process.

New: We've discontinued the -l option.

passwd
  • You must now specify the width of the salt (the -w option) in multiples of 4 bytes. The minimum is now 4, but the default is still 16.
  • MD5 and DES can no longer be used as a password hash. As a result, the -d and -m options are longer supported.
pidin
  • There are new _NTO_TF_SHR_MUTEX and _NTO_TF_SHR_MUTEX_EUID flags that indicate if and how threads share mutexes. If neither of these is set, the thread doesn't share mutexes with any threads outside its process.
  • There's a new _ (underscore) format character that makes pidin display the process's type ID.
  • There's a new _NTO_TF_LOW_LATENCY flag that indicates that the thread should be scheduled to run on the same CPU as the one the kernel is currently running on.
  • We've documented the new _DEBUG_FLAG_64BIT process debug flag.
  • We've documented the new _NTO_PF_APP_STOPPED and _NTO_PF_64BIT process flags.
  • The output from the Q format character now includes an N if _NTO_INTR_FLAGS_NO_UNMASK is set, and an A if the interrupt handler was attached using InterruptAttachArray().
  • There's a new -v option that requests verbose output. The additional information depends on the format code or shorthand used.
pps

The following options are new:

  • -a — the maximum number of open file handles allowed for the .all objects.
  • -D — the directory to put core files in.
  • -g — enable debugging output.

We've documented the +/-pktcheck option.

procnto*
  • Opening /proc/pid/as for read-only access now fails if the process whose entry is being opened has any process-manager abilities that the process trying to open the entry doesn't have.
  • We've set the value of EALREADY to 237, and removed EALREADY_OLD, EALREADY_NEW, and EALREADY_DYNAMIC, which we added to smooth the transition to the new value of EALREADY. As a result, we're removed the -e n|o option, which was used to specify which value to use for EALREADY.
  • The -ad option isn't supported on any currently supported platform.
  • We no longer ship single-processor or non-instrumented versions of procnto.
  • Because of the changes to adaptive partitioning, the -c option is no longer supported.
  • Note that the -p option doesn't interfere with adaptive partitioning because preemption checks are independent of adaptive partitioning and are based strictly on priority.
  • The new virtual memory manager doesn't support defragmenting memory, the associated automarking of unmovable memory variable page sizes, or the MAP_NOINIT flag. As a result, the associated memory configuration options (-md, -ma, -mv, and -mi) are no longer supported.
  • The P memory configuration option is no longer supported.
q++, qcc
  • There's a new -stdlib option that lets you specify the C++ library type to use. This option maps to the -Y option.
  • We've renamed QCC to be q++.
  • The LLVM C++ library (-Y_cxx) is now the default C++ library.
  • There's a new -nodefaultlibs option that makes qcc not use the ld_stdlib section.
random
  • This service now uses the Fortuna pseudo-random number generator.
  • The default permissions on /dev/random and /dev/urandom are now 0666, to allow non-root users to contribute entropy.
  • If you use the -s option, the state is saved whenever you write to the /dev/random resource manager, or after 8192 reseedings.
restart
There's a new -x option that prevents this utility from restarting the program if it exits normally.
setfacl
ACLs now persist across reboots if the acl option for the Power-Safe filesystem (fs-qnx6.so) is set to enable (the default).
slog2info
  • We've documented the -a, -n, and -t options.
  • There's a new -v option that makes slog2info parse buffers that were registered with the series of SLOG2_HINT_SKIP_BUFFER_* flags for slog2_register().
slogger2
The following options are new:
  • -C dev_console_buffer_size
  • -c out_buffer_size,error_buffer_size
  • -D slogger2_asinfo_name[:dump_file]
  • -d slogger2_asinfo_name[:dump_file]
  • -g gid1,gid2,...
  • -l log_save_path
  • -P pps_path
  • -S
  • -s size
uesh
The default type of filesystem for the emount command is now qnx6 (Power-Safe filesystem).
usemsg
Now that ldrel has been discontinued, usemsg always uses objcopy, so the -l and -o options are no longer supported.
wpa_cli
Updated to version 2.5.
wpa_supplicant
Updated to version 2.5.

What's new: Graphics

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

Feature New since Screen in QNX SDP 6.6 New since Screen for QNX SDP 6.5 SP1
When calling either screen_post_window() or screen_post_stream(), applications can now indicate that the entire rendering buffer is dirty.
The screencmd utility now supports all valid properties for each Screen API object type. It also now accepts case-insensitive property names without requiring them to be necessarily prefixed with "SCREEN_PROPERTY_".
Support of input sessions to capture data from both on-screen and off-screen events is now available. Sessions allow applications to control who gets what types of input events and how these input events are delivered.
Support of streams for rendering into is now available. Streams are off-screen multi-buffered targets that applications can render into. Streams are generally used when the content is intended to be consumed by other applications rather than being shown on the display.
The stack-size parameter in the globals and display sections of your graphics configuration file (graphics.conf) is now in units of bytes (rather than units of 1024 bytes).
When you change the following characteristics of an application window, Screen sends an event to notify the window manager in the system of the change:
  • window's clip size and position
  • display
  • pipeline
  • window's size and position
  • visibility
  • z-order
The background parameter in the display section of your graphics configuration file (graphics.conf) is now a 24-bit value.
Screen no longer supports configuration of touch drivers. Refer to your BSP User's Guide for details on how to configure the touch drivers for your platform.
Screen supports versioning. Screen version 2.0.0 is associated with the release of QNX SDP 7.0.

Which platforms does Screen Graphics subsystem support?

Board Supplier Board Name CPU GPU GPU Stack Display Controller Display Interface Number of Displays Display Resolution Monitor Name Touch Video Capture Interface Video Decoder
nVidia CX Parker ARM Quad Cortex-A57 2 SMM Maxwell 256 CUDA cores nVidia nVidia CX Parker DC HDMI, DP 2

DP: 4K

HDMI: 4K

Lilliput 10.1" FA1012 (HDMI)

N/A N/A N/A
Renesas R-CAR H3 ARM Quad Cortex-A57 GX6650 ImgTech PowerVR R-CAR H3 DC HDMI (3) 3 1024x768

Lilliput 10.1" FA1012 (HDMI)

N/A N/A N/A
Texas Instrument

Jacinto 6 EVM

Revision G, H

ARM Dual Cortex A15

SGX544MP2

ImgTech DDK-1.13 DSS

HDMI, LCD

2
  • Revision G:

    HDMI: 1280x720

    LCD: 1280x800

  • Revision H:

    HDMI: 1280x720

    LCD: 1920x1200

Lilliput 10.1" FA1012 (HDMI)

Attached (LCD)

LG (I2C Controller)

Parallel tvp5158
Texas Instruments Sitara AM572x ARM Dual Cortex A15 SGX544MP2 ImgTech DDK-1.13 DSS

HDMI, LCD

2

HDMI: 1920x1080

LCD: 800x480

Lilliput 10.1" FA1012 (HDMI)

Attached (LCD)

LG (I2C Controller)

Parallel tvp5158
Texas Instruments Sitara AM437x ARM Cortex A9 SGX530 ImgTech DDK-1.13 DSS HDMI (currently not supported), LCD 2 LCD: 800x480

Lilliput 10.1" FA1012 (HDMI)

Attached (LCD)

LG (I2C Controller)

Parallel tvp5158
Texas Instruments AM335x ARM Cortex A8 SGX530 ImgTech DDK-1.13 DSS LCD 1 LCD: 800x480 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
NXP SabreSmart ARM Quad Cortex A9 (IMX6Q)

GC2000

GC320

GC355

Vivante 5.x

IPU3 LVDS, HDMI 2

LVDS: 1024x600

HDMI: 1280x720, 1920x1080

Lilliput 10.1 FA1012 (HDMI)

Hannstar

eGalax

MIPI-CSI-2, Parallel

OV5640

NXP SABRE for Automotive Infotainment (AI) - previously SABRE ARD ARM Quad Cortex A9 (IMX6DQP)

GC2000

GC320

GC355

Vivante 5.x

IPU3 LVDS, HDMI 3

LVDS: 1024x600

HDMI: 1024x768

Lilliput 10.1 FA1012 (HDMI)

Hannstar

eGalax

MIPI-CSI-2, Parallel

OV5640

Intel Skylake i5 Intel HD 6000 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD DP, HDMI 2 1920x1080 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel IvyBridge i5 Intel HD 4000 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD HDMI 1 1280x720 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel Broadwell i5 Intel HD 5500 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD DP, HDMI 2 1280x720 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel Gordon Ridge MRB i6 Intel HD 6000 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD HDMI 2 1920x1080 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel Haswell i3/i5/i7 Intel HD 4400 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD HDMI 1 1280x720 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
Intel Baytrail (Valleyview) Atom Intel HD 4000 Intel DRM 3.12.2, Mesa 10.2.3 IntelHD HDMI 1 1280x720 Lilliput 10.1" FA1012 (HDMI) N/A N/A N/A
VMware VMware N/A Tunneling N/A N/A N/A N/A N/A N/A N/A N/A N/A

What's new: QDB

New: The icu_get() function now reports the locale in use instead of the requested locale. (Ref# J1649026)

What's new: Security

This release of QNX SDP introduces security policy (mandatory access control) as well as other security features such as anomaly detection (the qad utility), sandboxing, the Merkle filesystem, and support for the PAM (pluggable authentication modules) framework. For more information, see the Security Developer's Guide and the PAM Reference. The framework for integrity measurement (QFIM) is experimental.

What's new: Services

QNX SDP 7.0 provides an integration of D-Bus version 1.10.8. D-Bus is a simple system for interprocess communication and coordination. We've validated the D-Bus integration using dbus-test-tool (which comes with the D-Bus package) and C language and Qt version 5.6 bindings. For more information, see D-Bus in the Utilities Reference and http://www.freedesktop.org/software/dbus/.

What's new: Startup

  • On ARM targets, the cpu_intr_stride member of the intrinfo section of the system page must now be 0 to indicate that the interrupt system doesn't use autovectoring. This wasn't enforced in previous releases.
  • On x86 and x86_64 targets, Unified Extensible Firmware Interface (UEFI) systems are now supported.

What's new in the QNX Momentics tool suite?

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

  • GCC 5.4 tool chain
  • GDB 7.12
  • Binutils 2.25

For details about what's new in GCC 5, see https://gcc.gnu.org/gcc-5/changes.html. Some of the main changes include:

  • The default C language level has switched to C11; with that comes the default of C99 inline semantics, instead of the gnu89 inline semantics.
  • The ABI has changed on ARMv7 because of a switch to hard float, so you need to rebuild your programs.

We now support C++14. We've discontinued libcpp (the Dinkumware C++ library); the LLVM C++ library (qcc -Y_cxx) is now the default C++ library. The current version of this library is 3.7.1.

For information about other changes to the compiler, tools, and utilities, see the following sections:

What's new: Compiler, tools, and utilities

diskimage
We now ship this utility with QNX SDP instead of with the QNX SDK for Apps and Media. Note that the minimum number of primary partitions on a GPT disk is 128.
if_up
You can now use the -m option with the if_up utility. (Ref# J624167)
make
A make install no longer fails if you use precompiled headers on a macOS host. (Ref# J1567579)
ld
  • New: QNX SDP 7.0 includes the gold and BFD versions of the linker. The default ld is a copy of the BFD version; the gold version is experimental. To use the gold version, you can overwrite ld with it or use a symbolic link. For more information about the two versions, see https://en.wikipedia.org/wiki/Gold_(linker).
  • New: In order to improve security, the default type of binding for the -z option has changed from lazy to now.
mkfatfsimg
If the specified number of sectors and the number of sectors per cluster result in an inappropriate FAT type, this utility now dynamically determines a valid FAT type, when possible. (Ref# J616361)
mkifs
The macOS-hosted version of QNX SDP now includes the mkifsf_uefi image filter. (Ref# 1568221)
mkqnx6fs
The default blocksize is now 4096 bytes. This utility now enables extended inode data by default. Filesystems that are formatted with this version of the tool are compatible only with systems that are QNX Neutrino 6.6.0 and later.
mkxfs
New: There's a new -h option that makes mkxfs import hard links from the host filesystem as hard links. The default behavior is to create copies of the linked files.
on
You can now use the -f and -n options when you specify the name of the local node. (Ref# J635472)
pted
A partition table editor that runs on QNX Neutrino.
pidin
When the first page of a memory-mapped object is written to, this command now correctly shows the object's name.(Ref# 43050, J382175)
qcc
By default, when you're compiling any supported architecture, we use PIE, non-lazy binding, and read-only relocations. The supported architectures are x86 and x86_64 (32- and 64-bit x86) and armv7 and Aarch64 (32- and 64-bit ARM).
qcc
When you use the -p option, code profiling with PIE now compiles.
q++
We've renamed QCC to be q++. QCC remains as a symbolic link to q++ in this release, but is deprecated.
shutdown
This utility is now in /sbin instead of /bin.
su
When your root account has a password and you use this command to switch to another user ID, you no longer core dump with a message *** stack smashing detected ***: su terminated.

What's new: Integrated Development Environment

For more information about changes to the IDE, see the What's New in the IDE? appendix in the QNX Momentics IDE User's Guide. In this release, the IDE now uses Eclipse CDT (C/C++ Development Tooling) version 9.2. The update site for the IDE is https://www.qnx.com/swcenter/p2/ide.

The website for updates and maintenance releases—which you access via Help > Check for Updates in the IDE—is https://www.qnx.com/account/updates/ide/5.0/.

In addition to the new features, this version of the IDE includes the following fixes:

  • New: The IDE no longer includes SVN. You can get it from one of the following websites:
  • New: The System Profiler can now export large traces to CSV format. (Ref# J2164423)
  • New: The debugger correctly stops when a watchpoint is hit. (Ref# J1436572)
  • New: The System Profiler correctly displays the contents of security-related events. (Ref# J1674585)
  • New: The System Profiler properly aligns IPC lines with processes. (Ref# J1691417)
  • New: The Memory Information view no longer shows Thread 0 for all threads. (Ref# J2141998)
  • New: The System Profiler now handles traces from systems with more than 16 CPUs. (Ref# J2157485)
  • When you're debugging, the IDE now shows the backtrace correctly. (Ref# J745518)
  • In the System Information perspective, if you add or remove columns in the Thread Details pane, you no longer get an extra Process column in the table. (Ref# J484552)
  • In the Memory Information view, Copy to Clipboard now works when the Categorize option is turned off. (Ref# J485578)
  • Editing a file that's located (mapped) via PPS or other resource managers no longer fails when done via the filesystem navigator. (Ref# J528053)
  • Shortcut keys now work as expected in the IDE. (Ref# 255722, J393830, 438387)
  • The sample projects are set up to compile for all supported targets. (Ref# J438386)
  • If you go to Windows > Preferences > QNX > Application Profiler, select Sampling and Call Count Instrumentation in Profiling Method, and then press Restore Defaults, all the defaults are now restored. (Ref# J548281)
  • Using the default KEV log configuration results in a log that contains Running events that now correctly include scheduling/priority information. (Ref# J393921)
  • The System Profiler > Display > Switch Pane item is now initially active when you execute the SystemProfilerMissedDeadlines example's Timeline step. (Ref# J438387)
  • If you have a lot of projects in your workspace, the Target File System Navigator correctly displays the directories on your target and all the files contained in the directories. (Ref# 729298)
  • If you create a new QNX Image Build File for a project, select a template, create a new build file again with the same name, and choose a different template, you no longer get a null-pointer exception. (Ref# J541393)
  • The IDE now correctly parses makefiles that repeatedly use same macro (such as appending to CCFLAGS with different values), specifically when one of the values has a complex structure (such as quotes and escaped spaces). (Ref# J817499)
  • If you right-click on a core file and choose Debug, the IDE now correctly creates a Debug Launch configuration for postmortem debugging. (Ref# J527718)
  • Breakpoints set in .gdbinit now show up in the user interface. (Ref# 55810, J393602)
  • The Code Coverage perspective no longer gets stuck on Calculating coverage. (Ref# J470814)

The IDE User's Guide includes the following fixes:

  • New: The explanation for imposed time given in the Isolating client and server CPU loads section has been fixed. The description now reads:

    "We use the term self time to mean that a thread is directly executing (i.e., doing something for itself). This applies to clients and servers. Imposed time means that a thread is indirectly executing (i.e., another thread is doing something for it). This applies only to clients, because servers sometimes execute on their behalf."

    (Ref# J2157222)

  • New: The GCC version is no longer referenced in the guide. Specifically, the following places refer readers to the QNX SDP release notes instead of naming exact versions:
    • In the Code Coverage section, the Code Coverage data format field description now reads:

      "The version of gcc code coverage (gcov) metrics to collect.

      You must select a metrics version based on the SDK you're using to build your program. You can switch between SDKs to build your program based on a different installed SDP version. See the QNX SDP release notes for the GCC version number supported by a particular SDP release."

    • In the "Importing Code Coverage results" instructions, the "Select the protocol type" step (Step 4) now says:

      "Different GCC versions use different protocols (formats) for outputting coverage data. See the QNX SDP release notes for the GCC version number supported by a particular SDP release."

    (Ref# J1376022, J1690013, J1690706)

Debugging information for shipped binaries

We generate the QNX SDP binaries with debugging information (-g) and map files. With few exceptions, all binaries are available with debugging information, but we strip this data and the .ident information and store it in a separate binaryName.sym file. The target binaries don't have any SRCVERSION information in them (i.e., use -s won't work). The binaries and their .sym file files are linked, so gdb understands where to find the symbol data. There's no need for a separate debugging version of all the binaries.

In order to install debugging symbols, make sure that your installation is configured to show the available debug symbols package. 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.

You can install debug symbols the same way that you install other packages. From the Available tab, browse through the tree of available packages. Debug symbol packages are denoted by the Debug Symbols text at the end of their names. Select the debug symbol packages that you want to install, click Install, and then follow the instructions on your screen.

In order to get a list of the source files used to build a binary (e.g., to determine the associated licensing), use the .sym file instead of the binary. For example, to get a list of the source files used in building ls, type:

use -s $QNX_TARGET/x86/bin/ls.sym

Discontinued items

We've discontinued the following:

  • New: System Information Logging in the IDE
  • New: show_vesa
  • New: support for C standards before C99. The -ansi option for qcc now has no effect.
  • support for PC Card, including devp-pccard, libpccard, pccard-launch, and pin
  • support for floppies, including devb-fdc, fdformat
  • fs-qnx4.so and related utilities: chkfsys, dinit, and zap — use the Power-Safe (fs-qnx6.so) filesystem and its utilities instead.

    Note: To help prevent the loss of data due to power loss, the Power-Safe filesystem probes the hardware at mount time, to see if the hardware supports the SYNC operation. If it doesn't, the filesystem can't promise that data is safely stored on the media, and so it refuses to mount the media in read-write mode. You might see an error like this:
          Mount: Can’t mount mountpoint (type qnx6)
          Mount: Possible reason: Read-only file system
          

    To get around this, use mount -t qnx6 -o sync=optional ..., which tells the Power-Safe filesystem that the SYNC support is optional, rather than mandatory. USB sticks, SD cards, and devb-loopback typically require the sync=optional option.


  • Mudflap
  • noninstrumented and single-processor versions of procnto
  • support for Intel 486 systems
  • <slog2.h> — this file simply included <sys/slog2.h>. You should include <sys/slog2.h> directly.
Instead of using: Use:
CC, cc q++, qcc
devn-i82544.so devnp-e1000.so
devn-smsc9500.so devnp-smsc9500.so
devu-ehci.so, devu-ohci.so, devu-uhci.so, devu-xhci.so devu-hcd-ehci.so, devu-hcd-ohci.so, devu-hcd-uhci.so, devu-hcd-xhci.so
fs-cd.so fs-udf.so

Note that you need to use mount -t udf, not mount -t cd when mounting a CD.

io-pkt-v4 io-pkt-v4-hc or io-pkt-v6-hc

Note that io-pkt-v4 is now a symbolic link to io-pkt-v4-hc.

io-usb, io-usb-dcd io-usb-otg for both host and device mode
ldrel elfnote
lsm-autoip.so autoipd
pci pci-tool
pci-bios pci-server
slogger slogger2

Anything that you send to slogger is relayed to slogger2.

sloginfo slog2info
startup-apic, startup-bios startup-x86
usblauncher usblauncher_otg

The following have no direct replacement:

  • applypatch
  • asa
  • ctags
  • deva-ctrl-4dwave.so
  • deva-ctrl-cs4281.so
  • deva-ctrl-ess1938.so
  • deva-ctrl-geode.so
  • deva-ctrl-i8x0.so
  • deva-ctrl-nmg6.so
  • deva-ctrl-sb.so
  • deva-ctrl-via686.so
  • deva-ctrl-via8233.so
  • deva-ctrl-vortex.so
  • deva-ctrl-ymfds1.so
  • devb-adpu320
  • devb-aha8
  • devb-btmm
  • devb-mvSata
  • devc-par
  • devc-serzscc — now included in the BSPs that need it
  • devn-crys8900.so
  • devn-dm9102.so
  • devn-el509.so
  • devn-el900.so
  • devn-epic.so
  • devn-fd.so
  • devn-micrel8841.so
  • devn-ne2000.so
  • devn-pcnet.so
  • devn-pegasus.so
  • devn-rtl8150.so
  • devn-rtl.so
  • devn-sis9.so
  • devn-smc9000.so
  • devn-tigon3.so
  • devn-tulip.so
  • devn-via-rhine.so
  • devnp-axe.so
  • devnp-bce.so
  • devnp-bge.so
  • devnp-i80579.so
  • devnp-i82544.so
  • devnp-msk.so
  • devnp-shim.so
  • New: devu-kbd
  • New: devu-mouse
  • devu-prn
  • dprepresize
  • dresize
  • ds
  • /etc/printcap
  • fs-ext2.so
  • fs-rcfs.so
  • ldbootstrap
  • libaudio_manager.so (audio manager)
  • libbessel — the j0(), j1(), jn(), y0(), y1(), and yn() functions are now in libm
  • libcpp (the Dinkumware C++ library)
  • lpd
  • lpr
  • lprc
  • lprq
  • lprrm
  • lx
  • mcd
  • mcs
  • mkrcfs
  • mkrcfsimg
  • mksbp
  • showlicense — the QNX Software Center includes license management
  • slinger
  • showmem
  • spooler
  • wiconfig

Deprecation notices

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

  • New: the -ansi option for qcc. This option now has no effect.
  • New: Transparent Distributed Processing (Qnet) connectivity to QNX Neutrino 6.x targets
  • New: lsm-slip.so, slattach
  • New: the copy and data attributes for mkifs. These attributes no longer do anything.
  • Persistent Publish/Subscribe
  • New: Networking Middleware
  • New: RIP6 routing daemon (route6d)
  • New: QNX anomaly detector (qad)
  • New: 32-bit x86 architectures
  • New: rcp, rlogin, rlogind, rsh, rshd, ruptime, rwho, rwhod
  • New: pathtrust (utility will be replaced by a different pathtrust feature in a forthcoming release)
  • New: qconfig
  • New: seedres
  • New: the VFS (virtual filesystem) hooks functionality in io-blk.so
Instead of: Use:
New: avbmonitor, deva-ctrl-avb.so, lsm-avb.so A third-party AVB product
New: bcmp() memcmp()
New: bcopy() memmove()
New: bootpd, /etc/bootptab dhcpd
New: bzero() memset()
New: devnp-ecm.so, devnp-ecmplus.so, devnp-ncm.so devnp-usbnet.so
dhcp.client dhclient
New: Dynamic encryption domains Regular encryption domains
New: fs-nfs2 fs-nfs3
New: in32, out32 io
New: index() strchr()
New: InterruptCharacteristic(), InterruptCharacteristic_r(), lazy interrupts, and interrupt latency
New: ioctl_socket() ioctl()
New: libpng 1.4 libpng 1.6
New: libsocks
New: lsm-nraw.so
New: Merkle filesystem QNX Trusted Disk (QTD)
New: ntpdc ntpq
New: pcnfsd
New: Python 2 Python 3
QCC q++
New: qcc -w[0-9] gcc-style -W* options
New: qnx_crypt() crypt()
New: resvanonport
New: rindex() strrchr()
New: snd_pcm_capture_flush(), snd_pcm_channel_flush(), snd_pcm_playback_drain(), snd_pcm_playback_flush(), snd_pcm_plugin_flush(), snd_pcm_plugin_playback_drain() (QNX Sound Architecture API functions)
New: vfork() posix_spawn()
New: wlanctl
New: wlconfig WPA supplicant library

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:

  • New: *-ld.gold, the gold version of the linker
  • high-resolution timers
  • QNX framework for integrity measurement (QFIM)
  • New: Trusted Platform Module (TPM)

    Note: The version of TPM that shipped with SDP 7.0 is deprecated and will be replaced with a different TPM service in a future release.

The memory manager's backward-compatibility mode

New:

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 has changed in QNX Neutrino 7.0, and is now 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).

Known issues

QNX SDP 7.0 contains known issues in the following areas:

Known issues: Kernel

  • New: The procnto image filesystem doesn't support combined seeks and reads. (Ref# J2686437)
  • New: The L memory configuration option is a superset of the l option. You can combine them, but they're processed in the order that you specify them, resulting in different combinations of locking and superlocking. The L~l combination is invalid because memory is superlocked but not locked; don't use it. (Ref# J2746113)
  • New: If you disable the Execute Disable Bit in the BIOS, the x86_64 kernel crashes. The 32-bit x86 kernel runs, but we recommend you leave this bit enabled because disabling it can cause security problems. (Ref# J2379902)
  • 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.

  • If there's a continuously running, regular, high-frequency hardware interrupt, it's possible for a kernel call to be continually interrupted and restarted. The precise definitions of continuously running and high-frequency are application-specific, but any regular interrupt with an interval less than the clock interrupt interval, that persists for an extended period should be carefully analysed to ensure that it doesn't affect the operation of the application. One case where this continual restart can occur is when very large (e.g., 100 MB) messages are passed on slow processors. (Ref# 56741, 62212, 75921, J167989, J168503, J169537)
  • The kernel services at most 50 timers on every clock tick. If a periodic timer that fires on a certain clock tick doesn't get handled as a result of this limit, its renewal time gets slightly shorter and is deferred until the next clock tick. If the periodic timer is deferred multiple times, it will be subject to increasing timing errors, which could lead to unexpected timer behavior. (Ref# J835502)

    Workarounds: You can arrange your periodic timers so that no more than 50 expire on the same tick or use CLOCK_SOFTTIME instead of CLOCK_MONOTONIC. When you use CLOCK_SOFTTIME, we have robustness built into the our kernel to check if the rearm time is in the past. If the next activation time is in the past, the next activation time is corrected to be the current time + interval time.

Known issues: Libraries and header files

libc.so and libm.so version numbers
As noted above, the version numbers for these shared objects are now 4 and 3, respectively. We haven't yet updated the version numbers in all the documentation. (Ref# J1627591)
acl_*()
New: These functions generally don't set errno to EINVAL if input pointers don't point to valid objects, contrary to what the documentation states. The acl_init() function should set errno to EINVAL if the value of the count argument is less than zero. The acl_set_file() function should set errno to EINVAL if the value of the type argument isn't ACL_TYPE_ACCESS. (Ref# J2763532, J2782102)
atexit()
It isn't safe to call atexit() from a shared object that's meant to be dynamically opened using dlopen().

If you call atexit() from such a shared object, your application may receive an abort() when you call dlclose(), and the handler registered with atexit() won't get called when the shared object is unloaded.

Under certain circumstances, the abort() won't happen when (for example) the shared object calls atexit() and passes a function that's defined in another object that doesn't get unloaded with a subsequent dlclose(). In this case, the handler isn't called until the application exits. (Ref# J521222)

cacosh()
New: The C11 standard says that cacosh (0 + NaNi) should return NaN±(π/2)i, where the sign of the imaginary part is unspecified. Our implementation returns NaN + NaNi. (Ref# J2621656)
clog()
New: The C11 standard says that clog (±Inf + NaNi) should return Inf + NaNi. Our implementation returns NaN + NaNi. (Ref# J2621656)
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)

  • New: 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 (:.).

fork()
New: This function returns a misleading error code (ENOMEM) if the calling process's priority is outside the allowable range. (Ref# J1601362)
<limits.h>
New: The definition of USHRT_MAX is incorrect; it should be as follows:
#if __INT_BITS__-0 <= 16
#define USHRT_MAX   65535U       /*  maximum value of an unsigned short  */
#else
#define USHRT_MAX   65535      /*  maximum value of an unsigned short  */
#endif
  

(Ref# J2753844, J2753845)

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)
pci_*()
New: Some of the pci_*() functions require that the calling thread have I/O privileges, which you can get by calling ThreadCtl( _NTO_TCTL_IO, 0). If your program crashes because it doesn't have I/O privileges, the PCI server might be in an inconsistent state. (Ref# J2238270)

Workaround: Delete /dev/shmem/pci_db and /dev/shmem/pci_hw. They'll be automatically recreated as needed.

pci_device_read_ba()
New: If you want to determine how many valid base addresses the device uses, 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_typed_mem_open()
New: If you don't specify a leading slash in the name and you aren't in the root directory, this function fails to open the typed memory object. (Ref# J1035253)

Workaround: Start the name with a slash.

sem_timedwait(), sem_wait()
New: If you use these functions with named semaphores, calls to sem_timedwait() might not be unblocked when the timer expires, and calls to either of these functions might not be unblocked by signals. (Ref# 2811281)

Workaround: Use unnamed semaphores with timeouts. For sharing, use unnamed semaphores in memory that's shared between processes.

shm_ctl_special()
New: Specifying the ARM_SHMCTL_SO bit in the special argument should result in strongly ordered mappings but currently doesn't. (Ref# J2740401)

Workaround: Also set ARM_SHMCTL_SH. Adding this bit results in strongly ordered mappings and doesn't remove functionality because non-cacheable mappings are always outer-shareable (i.e., you can't get a non-shareable non-cacheable mapping anyway).

<sys/shutdown.h>
The ProcessInfo_t structure includes a field called class, so you can't use this header in a C++ program because class is a C++ keyword. (Ref# J175563)
tc*()
New: 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)

<time.h>
New: There's a macro named timespec2nsec(), which gets called instead of the C Library function with the same name and method signature. In this release, the macro implementation has unexpected behavior sometimes because it evaluates its argument twice. So, code that would be valid for calling the C function is not valid for calling the macro. (Ref# J2642295)

Workaround: For the argument, avoid using code that may have a different meaning or become undefined when evaluated for the second time. An example would be using increment or decrement operators in an array index that references a timespec structure, as in the following statement:

timespec2nsec((struct timespec*)attribList[i++]);

Known issues: Filesystems

You can't use devctl() commands for filesystem events (DCMD_FSEVMGR_*)
You won't be able to use any of the DCMD_FSEVMGR_* devctl() commands or get statistics about the filesystem event manager because the dcmd_fsevmgr.h header file isn't available in this release. (Ref# J1695731)

New: Workaround: Install the QNX SDP 7.0 Filesystems Update (Build ID 762).

The statvfs64() function incorrectly returns zero free files
On NTFS devices, the statvfs64() function incorrectly returns zero for the number of free files. (Ref# J1664079)
fsysinfo incorrectly shows SLAB section statistics
The fsysinfo utility incorrectly reports zero for the SLAB map and unmap statistics. (Ref# J1670533)
Incorrect user events are generated in the System Profiler and kernel trace events
The io-blk manager and Power-Safe Filesystem incorrectly generate user events (type 100) in the System Profiler in the QNX Momentics IDE and kernel trace events. The type-100 debug events are benign. (Ref# J1679559)

New: This issue has been addressed in the QNX SDP 7.0 Filesystems Update (Build ID 762).

Incorrect errno value returned on failed open() call
When a filesystem is mounted as read-only and you try to open one of its files in read-write mode, open() doesn't set errno to the expected EROFS. Instead, errno is set to some other value. (Ref# J1683771)
Can't mount UDF or NTFS-formatted CD
When you have a USB CD/USB drive connected to the target, you can't mount a UDF or NTFS-formatted CD. When you try to use the mount command, the following occurs:
# mount -vvvv -tudf /dev/cd0 /myDataCD
Parsed: mount from [/dev/cd0] mount on [/myDataCD] type [udf]
exec: mount_udf -o rw /dev/cd0 /myDataCD
Using internal mount (mount_udf not found)
Type    [udf] Flags 0x00000000
Device  [/dev/cd0] Directory [/myDataCD]
Options [NULL]
mount: Can't mount /myDataCD (type udf)
mount: Possible reason: No such file or directory

(Ref# J1679662)

Workaround: Specify the -r option to mount your CD. For example:

# mount -tudf -r /dev/cd0 /myDataCD
# ls /myDataCD/
Track 01 to 15     Track 16 to 25
fs-qnx6.so
  • The io-blk 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 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)

  • New: When you run the fs-qnx6.so driver with the alimit option and specify a hexadecimal value with b as the suffix, it's incorrectly interpreted as blocks instead of bytes. (Ref# J1599061, J1693330)

    Here are examples of incorrect behavior when you run the fs-qnx6.so command (or use the mount utility) with the alimit option and hexadecimal values:

    • fs-qnx6.so -alimit=0x200b
      Feb 28 15:34:53.536 devb_umass.8202 slog 1000 fs-qnx6: Alimit set to 8203 blocks
    • mount -t qnx6 -o alimit=0x200b /dev/usb0t179 /mnt/usbdisk
      slog2info
      [...]
      Feb 28 15:34:53.536 devb_umass.8202 slog 1000 fs-qnx6: Alimit set to 8203 blocks

    Workaround: Use only decimal values with the alimit option.

  • New: There’s a race condition that can occur between updating the inode for an encrypted file or directory and locking the domain that it’s in. If the race affects a directory, you get an error of EINVAL, but the operation succeeds. If the race affects a regular file, you get an error of EACCES, and the file can’t be decrypted. (Ref# J2597876)

    Workaround: Don’t lock an encryption domain while you’re actively updating files or directories that are members of the domain.

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: 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]
      

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

Incorrect mute and unmute events received for subchannels with no preemption
Incorrect mute and unmute events received for subchannels with no preemption. (Ref# J1680676)
Audio skips during volume ramp down
For volume ramping, if you configured a duration time for the pause_resume type that’s larger than your buffer size (application-specific), and then call snd_pcm_*_pause(), you may hear what seems like skipping of the same sample as the volume level decreases, until the volume level is zero. (Ref# J1681547)

Workaround: Avoid configuring a long duration time for the pause_resume type.

Incorrect receive ENOTSUP when calling select()
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 results in an ENOTSUP error. (Ref# J1679037)

Workaround: Your application code must parameterize the handle using snd_pcm_plugin_params() before calling select() or poll().

Captured audio is choppy and has gaps
New: 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 isn’t 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.

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.

  • Some Sony VAIO laptops don't assign an interrupt to a USB device; when you're booting QNX Neutrino, you'll see some InterruptAttachEvent failed messages. (Ref# 41237)

    Workaround: Contact Technical Support to get a customized utility that enables the interrupts.

  • On some Intel 3.2GHz D945G systems, the USB bus is reset by the host after rebooting, while the host is addressing the device. (Ref# 51935)

    Workaround: Disable legacy USB support in the BIOS.

  • The Dell Latitude D830 fails to boot QNX Neutrino from USB mass-storage devices. (Ref# 61688, J348144)

Known issues: Compiler, tools, and utilities

Binutils
New: GNU Binutils 2.25 has known security vulnerabilities. (Ref# J2876213, J2872696)
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
  • New: 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# J2877688)

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

  • New: Due to unclear wording in ISO/IEC 14882:2011(E), GCC 5.4 chooses an appropriate constructor to satisfy an empty initializer list of a class or struct, even if that constructor is marked as explicit. The resolution of Defect Reports 1518 and 1630 against the standard clarify this as incorrect behavior: a constructor marked as explicit shouldn't be considered in the overload resolution set. (Ref# J2636749)

    Workaround: For consistency with later releases of the compiler and with other compilers, avoid using empty initializer lists where explicit constructors with default-valued parameters are available, or else incorrect code might be executed.

  • New: 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# 2608081)

    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
The gdb debugger doesn't support disconnecting from the target when the connection was made via the IDE or pdebug. (Ref# J382754)
gzip
The gzip utility version 1.3.12 has known security vulnerabilities. (Ref# J2752791)
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 )
mkmerklefs
New: This utility doesn't work on Windows host environments. (Ref# J2167184)
mkbuild
The mkbuild utility fails with a not found error on Linux, macOS, and Windows host environments. (Ref# J1683331)

Workaround: Open the mkbuild script and change this line:

QDE=${QDE:-$QNX_HOST/usr/qde}

To one of the following (presuming you installed in the default location):

For Linux hosts:

QDE=${QDE:-~/qnx/qnxmomentics/qde}

For macOS hosts:

QDE=${QDE:-/Applications/Momentics.app/Contents/MacOS/qde}

For Windows hosts:

QDE=${QDE:-C:/QNX/QNX Momentics/qde}
pci-server
New: Note that you don't need to run seedres before starting pci_server. (Ref# J2891692)
q++, qcc
New: 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# 2813708)
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.

smmuman
New: SMMUMAN doesn't parse textual substitutions on the command line, just in its configuration file. (Ref# J2718602)
User Account Control (UAC)
Windows 7 includes an account policy, called User Account Control (UAC), that impacts various administrative features, such as being able to create and store files in a temporary directory (tmp). This directory is used by various applications, such as CVS and the split command. To successfully run these applications on a computer running Windows 7, you must have administrator privileges and disable UAC. (Ref# 44027, J328756)

Workaround: To disable UAC:

  1. Launch MSCONFIG from the Run menu. (When you click on the launch button—the one with the Windows logo commonly in the bottom left corner—the Run menu is an editable text bar with the initial string Start Search. Type msconfig and then press Enter.)
  2. Click on the Tools tab. Scroll down until you find Disable UAC, and then click that line.
  3. Press the Launch button.
  4. A cmd window will open. When the command is done, you can close the window.
  5. Close msconfig, and then restart your computer.

You can reenable User Account Control by selecting the Enable UAC line and then clicking the Launch button.


Caution: Disabling UAC bypasses some security features.

usblauncher_otg
The usblauncher_otg utility can't be used to manipulate the USB port power on the system. (Ref# J1611624)
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: 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 stack 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.

Wireless drivers (devnp-driver_name.so)

We tested the wireless drivers using the WiFi Alliance test suite (http://www.wi-fi.org/certification/programs). Test coverage includes a subset of these test suites:

  • Connectivity: Station Mode Interoperable Connectivity (802.11 a/b/g) and Advanced Wi-Fi Certified n (802.11n)
  • Connectivity: Access Point Mode Interoperable Connectivity (802.11 a/b/g) and Advanced Wi-Fi Certified n (802.11n)
  • 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
  • TI Jacinto 6 + TI Wilink8 (SDIO):
    • With the TI Wilink8 driver, a few AP mode test case failures are observed. Generally, STA and AP and P2P modes are operational.
    • AP Mode Test cases 4.2.37, 4.2.43 relating to support of 2x2 spatial streams (Ref# J1617541) and test case 4.2.40 where driver fails to send the Block Ack. (Ref# J1617543)
  • NXP i.MX6 + Broadcom BCM4359 (PCIe):
    • With the Broadcom BCM4359 driver, a couple of STA and a couple of P2P test case failures. Generally, STA and AP and P2P modes are operational.
  • Intel Skylake + Marvell 8897 (PCIe):
    • With the Marvell 8897 driver, AP mode isn't functional at the moment. Also a few failures were noted for P2P mode.
    • AP mode failures: test cases 4.2.5, 4.2.9 where device failed to associate (Ref# J1628447, J1628478)
    • P2P mode test cases 4.1.1, 4.2.2, 6.1.1, 6.1.3, 6.1.11, 5.1.4, 7.1.4 failed. (Ref# J1626237, J1626242, J1626251, J1626256)

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: Documentation

Audio Developer's Guide

  • In the description of the sndpcm_channel_audio_ducking() function, the last sentence for the -EINVAL error is incorrect for the sndpcm_channel_audio_ducking() function. The sentence incorrectly states the following:

    This error also occurs if you are in any other state other than the SND_PCM_STATUS_NOTREADY state.

    Instead, the text should read:

    An error can also occur if you are in the SND_PCM_STATUS_NOTREADY state.

    (Ref# J1687846)

Boot Optimization Guide

  • In the Generic techniques to reduce the size of the IFS section in Optimize the Loading and Launching of the OS chapter, there's a subsection called Use the system optimizer to remove unreferenced libraries and functions that should have been removed because it's no longer relevant in this release. (Ref# J776457)
  • New: In the Measuring Boot Time chapter, The boot_metrics.log file section isn't valid because the timestamp utility isn't available. (Ref# J1700680)

Building Embedded Systems

  • In the Buildfile structure and contents section of the OS Image Buildfiles chapter, the example incorrectly references libm.so.2. It should be libm.so.3. (Ref# J1688990)

Licensing information

  • New: The Licensing information section in the offline help in the IDE is incorrect. For the correct information, see the Licensing information section on the QNX SDP 7.0 Documentation website. (Ref# J2168085)

QNX Neutrino C Library Reference

dispatch_create_channel()
New: This function is documented as having a reserved argument that you should pass 0 for, but this argument is now for passing flags to the function. You can pass a flag of DISPATCH_FLAG_CHANNEL_COIDDEATH if you want to use pulse_attach() to add a handler function for _PULSE_CODE_COIDDEATH pulses to the dispatch handle. (Ref# J1624579)
mq_open()
New: The location where the traditional (mqueue) implementation of message queues creates entries in the pathname space has changed, but the entry for mq_open() still describes the old location. (Ref# J1593956)

Here's the updated information:

  • With the traditional (mqueue) implementation, message queues are created under /dev/mqueue.
  • With the alternate (mq) implementation, message queues are created under /dev/mq (or the path specified with the -N option to mq).

The mq_open() function interprets its name argument as follows:

  • If the name argument starts with a slash, the queue is given that name.
  • If the name argument doesn't begin with a slash character, the queue is given that name, prepended with the current working directory.

In either case, slash characters other than the leading slash character aren't interpreted, and the specified name, including these slash characters, is used to identify the message queue. In other words, additional slashes don't create a directory structure under /dev/mqueue or /dev/mq.

For example, if your current directory is /tmp:

name Entry with mqueue Entry with mq
/entry /dev/mqueue/entry /dev/mq/entry
entry /dev/mqueue/tmp/entry /dev/mq/tmp/entry
posix_spawnattr_setcred()
The function description incorrectly states that the setuid/setgid mode of the spawned image takes precedence over the effective uid/gid of the spawned process. In fact, the uid/gid specified in the call to posix_spawnattr_setcred() takes precedence. (Ref# J1625777)
slog2_hash(), slog2_obfuscate()
The entries for these functions should note that the random service must be running when starting slogger2 since the implementation depends on /dev/random. (Ref# J1674473)

QNX Neutrino System Architecture

  • The Linux Extended Filesystem (EXT2) support has been discontinued, therefore these parts of the guide aren't valid in the Filesystem chapter:
    • the "Linux Ext2 filesystem" section
    • the reference to EXT2 in the table of the "Filesystem limitations" section

    (Ref# J1690722)

  • This guide should explain that when you use an encrypted filesystem, read/write throughput rates and performance are lower and CPU usage is higher than when you use a nonencrypted filesystem. (Ref# J1693408)
  • New: In the "Apple Macintosh HFS and HFS Plus" section, the listing of the recognized variants includes HFSJ (HFS Plus with journal) but no longer mentions the limitation that only HSFJ filesystems with clean journals can be accessed. In fact, this limitation still applies to this release.

    It's expected that a future release will remove this limitation.

    (Ref# J2649850)

QNX Neutrino User's Guide

  • The Linux Extended Filesystem (EXT2) support has been discontinued, therefore these parts of the guide aren't valid:
    • the "Linux EXT2 fileystem" section in the Working with Filesystems chapter
    • the"Ext2 filesystem" section in the Understanding Filesystem limits chapter

    (Ref# J1690722)

  • New: In the "Apple Macintosh HFS and HFS Plus" section, the listing of the recognized variants includes HFSJ (HFS Plus with journal) but no longer mentions the limitation that only HSFJ filesystems with clean journals can be accessed. In fact, this limitation still applies to this release.

    It's expected that a future release will remove this limitation.

    (Ref# J2649850)

QNX Neutrino Utilities Reference

date
The touch and QNX4 formats have been removed from the date utility. The remaining valid date format is POSIX/System V. The syntax for this format is correctly described in the Utilities Reference, but the examples given in the reference incorrectly illustrate all of these formats. (Ref # J1685409, J1687126)

The following examples illustrate the valid date format:

Set the system date to 22 February 1997:

date 0222000097

Set the system date and time to 16 May 1997, 4:30 pm:

date 051616301997
devb-ustor

New The devb-ustor utility is documented in QNX SDP 7.0 but is only supported in QNX SDP 7.1. (Ref# J2910380)

fs-ext.so
The Linux Extended Filesystem (EXT2) support has been discontinued, therefore these parts of the guide aren't valid:
  • the fs-ext2.so entry
  • references to EXT2 and fs-ext2.so in the io-blk.so entry
  • references to EXT2 and fs-ext2.so in the fdisk entry

(Ref# J1690722)

gcc, g++
This section incorrectly references the gcc version in the Description subsection, by stating:

"For detailed documentation about gcc, see https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/."

The text instead should read:

"For detailed information about gcc, see the GCC online documentation. Choose the GCC version number used by the SDP release you've installed; this version number is given in the QNX SDP release notes."

(Ref# J1376022, J1690706)

hostapd, hostapd_cli, wpa_cli, wpa_passphrase, wpa_supplicant
The names of these utilties are all appended with the WPA version that they support. For example, wpa_supplicant-2.5. Currently, the only supported WPA version is 2.5.

(Ref# J1679752)

ldd
The "Example" section incorrectly references libm.so.2. It should be libm.so.3.

(Ref# J1688990)

mkqnx6fsimg
The description of the blksize attribute provides incorrect information about the valid values. You can specify any power-of-two block size from 512 to 32768 bytes. In addition, K is the only valid value that can follow the integer. (Ref# J1637793)
passwd
The options for passwd utility listed in the Utilities References are outdated. (Ref# J1690534)

The correct syntax and options are as follows:

Syntax
passwd [-delSu] [-i inactive] [-n mindays] [-s hash] [-t iterations] [-W width] [-w warndays] [-x maxdays] [username]
d
Delete a user's password.
e
Expire an account's password. Force a password change on the next login.
i inactive
Disable an account after password has been expired for inactive days. After an account is disabled, the user can't log in.
l
Lock the password for the specified account.
n mindays
Set the minimum number of days between password changes to mindays. Use a value of 0 to indicate that the password may be changed at any time.
S
Display account status information as follows: username status date mindays maxdays warndays inactive, where status is one of NP (no password), L (locked password), P (usable password) and date is formatted according to ISO-8601.
s hash
The algorithm to use for password hashing. The default hash is sha512. (The other choice for hash is sha256.)
t iterations
The number of times to iterate the hash. The default is 4096.
u
Unlock the password for the specified account.
W width
The width of the salt, in multiples of 4 bytes. The minimum is 4, and the default is 16.
w warndays
Warn users for this many days before a password change is required. A value of 0 in this field indicates that the user is never warned that a password change is required.
x maxdays
The maximum number of days that a password remains valid. A value of 0 in this field indicates that the password remains valid indefinitely.
username
The username whose password is to be changed or for whom an account is to be created (root only).
pppd
The +/-pktcheck option isn't documented.

The terminal/serial driver can be configured to only send data up to PPP whenever it detects a specific framing character. PPP does its own packet frame checking as part of its processing, so by default this frame checking occurs twice (once in the serial driver and once in PPP).

This frame checking at the serial driver level reduces the number of message passes between the terminal driver and PPP because data is passed to PPP on PPP frame boundaries rather then whenever bytes are available.

The +/-pktcheck option tells PPP to not configure the terminal/serial driver to do this packet frame checking and to simply pass data up to PPP when it is available.

With USB modems, because data comes in chunks rather than byte by byte, the terminal/serial driver generally gets full PPP packets anyway and frame checking in the serial driver does not reduce the number of message passes. In a real-hardware, UART case, because the data streams is byte-by-byte (rather than USB block transfers), the frame checking at the serial driver level is more helpful.

(Ref# J202991)

q++, qcc
This section incorrectly references the gcc version in the Options subsection, by stating:
"-std=language

Specify the language standard. For more information, see https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/C-Dialect-Options.html#C-Dialect-Options in the GNU documentation."

The text instead should read:

"-std=language

Specify the language standard. For more information, see the GCC online documentation. Choose the GCC version number, and search for C Dialect Options in the GCC Command Options section of the GCC manual. See the QNX SDP release notes for which GCC version number."

(Ref# J1376022, J1690706)

restart
The options for restart utility listed in the Utilities References are outdated. These are the updates:
  • New: There's a new -e option that you can use to specify a value to multiply the time interval by whenever the restart limit is reached.
  • the -m option is no longer supported.
  • the -x option can be used to indicate how many seconds must elapse since the last restart before the time interval reverts to its original value.

For more information, see the usage message. (Ref# J1692800)

slogger2
The slogger2 utility runs on all supported targets. The -p pid option is no longer used. (Ref# J1674473)

Known issues: IDE


Note:

New The IDE known issues listed here apply to the QNX Momentics IDE 7.0 release. There's a newer IDE version available in the QNX Momentics IDE 7.0.4 patch. To install this patch, launch the IDE and select Help > Check for Updates. In the Available Updates wizard, ensure that the Momentics update with version number 7.0.4.v201905030143 is checked, then click Next and follow the steps in the wizard to perform the installation.

To access the release notes for the QNX Momentics IDE 7.0.4 patch, access the QNX website, log in to your myQNX account, then navigate to the QNX SDP 7.0 documentation folder in the Download center: www.qnx.com/download/group.html?programid=29184. You'll find a table entry containing a link to the IDE 7.0.4 release notes.


Known issues (IDE): General

  • On Linux, many undefined symbol: menu_proxy_module_load messages might be displayed when you start the IDE from the command line. (Ref# J337353)

    Workaround: Execute this command:

    sudo apt-get install appmenu-gtk:i386
  • On Windows, if the IDE window spans two monitors, and you lock and then unlock your computer, the window is restored to be the size of one monitor. This is a general problem on Windows. (Ref# 28653)
  • When you do a build on a Windows host, stdout and stderr sometimes overlap, resulting in misleading error and warning messages. This is a general problem on Windows. (Ref# 15106)
  • Sometimes the IDE becomes unresponsive during indexing operations.

    Workaround: Restart the IDE.

  • If you use Set Priority/Scheduling Algorithm in the Target Navigator to change a process's priority and scheduling algorithm, and then select this item again for the same process, the default settings might be displayed instead of the current ones. But, if you press OK, the process's settings aren't changed back to the defaults. (Ref# J537153)
  • The IDE no longer includes an Subversion plugin. You can install one such as Subversive or Subclipse.
  • The text in the IDE hover help is sometimes truncated or formatted incorrectly. (Ref# 259496, J393841)

    Workaround: Look up the function in the QNX Neutrino C Library Reference.

  • We pre-index our documentation, but the first time you search for anything in the IDE's Help system, it has to combine the indexes (and index any Eclipse documents that haven't been indexed). This should take less than a minute.
  • You might see a message like this when you start the IDE:
    Subscription License Expired -
      Your QNX License could not be obtained, some QNX functionality will be
      disabled.

    This message appears only if QNX Software Systems has a contract with you to support server-based licenses. It indicates one of the following:

    • You need to configure your license server.
    • More users are trying to use the IDE at the same time than there are available licenses for.

    (Ref# 51688, J236666)

  • The Eclipse editor doesn't behave correctly on very long lines (more than 4500 characters). At the end of a long line, the cursor doesn't position itself properly between characters, selections and changes are very slow, and the column number is reported incorrectly. (Ref# 29586, 21053; Eclipse-CDT PR 68116)
  • If the IDE can't open the browser to display the documentation, it may give you an error message of:
    An exception occurred while launching help. Refer to the log for more details.

    The problem could be that the IDE couldn't find your default browser. Check the web browser listed in your preferences (see Window > Preferences > General > Web browser) to make sure it's a browser that's installed on your system.

    If this doesn't fix the problem, check the log file; see Help > About QNX Momentics IDE > Configuration Details > View Error Log. If you've installed the Eclipse SDK, use the Error Log view. (Ref# 29971)

  • Context-sensitive help doesn't work. If press F1, you should get a list of relevant topics in the IDE Help. When you click on a link, it incorrectly goes to a topic called Editors. (Ref# J393737)

    Workaround: Select Help > Help Contents and use that dialog box in the Help landing page to search and read information in the Help.

  • New: If your development host has an installation of a previous SDK version supported by the IDE 7.0 (i.e., QNX SDP 6.6 or 6.5.0 SP1), parts of the legacy help are incorrectly shown alongside the new help in the IDE. For example, if you've installed QNX SDP 6.5.0 SP1, under Help > Help Contents, you'll see the entire QNX SDP 7.0 help but also parts of the 6.5.0 SP1 help, such as the QNX Momentics Phindows Connectivity Tool User's Guide. (Ref# J2160532)

    Workaround: To view the offline help for a previous QNX SDP version, use the IDE shipped with that platform version.

Known issues (IDE): Application Profiler

  • The Application Profiler can allocate CPU time to the wrong line if you're profiling code that has profiling and debugging information, and if you linked against a static library that doesn't have profiling and debugging information. (Ref# 21024)

    Workaround: Build everything with debugging information, or use -gdwarf-2 instead of -gstabs.

Known issues (IDE): System Information

  • New: If you open the Memory Information view, select a process, and then expand the Stack item, all threads are listed with an ID of 0. (Ref# J2141998)
  • New: If you access the Connection Information view and select a server process in the Target Navigator, you may get unpredictable behavior if the server doesn't properly handle IO messages. Specifically, if the server doesn't return an error for these messages or otherwise ignores them, this may cause qconn to stay reply-blocked and in turn cause refresh failures in the IDE or other unexpected results.

    Many other QNX system information tools, for example, the command line pidin fd, send query messages to servers on the target system. Your server processes must handle all expected and unexpected messages gracefully to avoid causing unpredictable behavior with these tools.

    (Ref# J1689419)

Known issues (IDE): System Profiler

  • The System Profiler requires a minimum color depth of 16 bits; otherwise, the timelines might appear to be blank. (Ref# 23763)

Known issues (IDE): Memory Analysis

  • On Windows, in the Advanced Settings part of the Memory Analysis controls (which are found under the Tools tab of the launch configuration), the default path name might start with a backslash. (Ref# J500345)

    Workaround: Change the leading backslash to a forward slash.

  • If you check Enable check on realloc()/free() arguments in the Memory Errors part of Window > Preferences > QNX > Memory Analysis > Memory Errors, click Apply, close the window and then open it again, this setting is no longer enabled. (Ref# J510803)

    Workaround: You should change this setting through the Tools tab in the launch configuration, under the Memory Errors panel within the Memory Analysis controls.

  • If you make the period for performing memory snapshots too short, the Memory Events view might not show all allocations and deallocations. (Ref# J577315)

    Workaround: Do the following:

    1. Run the program through the IDE with the Memory Analysis tool enabled in the launch configuration.
    2. When the program finishes, use the Target File System Navigator view to copy the /tmp/traces.rmat file from the target to the IDE workspace.
    3. In the QNX Analysis perspective, select File > Import > QNX > Memory Analysis Data to run the import wizard and import the traces.rmat file into a new Memory Analysis session.
  • If you use the Memory Analysis tool with the control thread enabled, no information is returned for bins, bands, or usage. (Ref# 252156, J393820)

    Workaround: Disable the control thread under the Advanced Settings of the Memory Analysis controls.

  • When you request the termination of the Memory Analysis service, it might take longer than expected. (Ref# 46228)
  • In the QNX Analysis perspective, if a function causes a buffer overflow, memory leaks aren't detected correctly. (Ref# 42312)
  • You might see some allocations take place before your application's main() function starts. This is normal; some of the system libraries allocate space as they're initialized. (Ref# 29698)
  • The Memory Analysis tool changes the behavior of a program that uses fork. (Ref# 29032)

    Workaround: If your program uses fork, you must disable the control thread (from the Launch Configuration, select Tools > Memory Analysis > Advanced Settings and disable Create control thread). Note that it's not possible to attach to this type of process because Memory Analysis needs to run a control thread to support process attachment.

  • In the Settings tab of the Memory Analysis editor, the dropdown panels for adjusting configuration fields (Memory Errors, Memory Tracing, and Memory Snapshots) don't work. Even when the process is running, if you click the arrow to expand a panel, the arrow icon changes but no controls appear. (Ref# J1258690)

    Workaround: Adjust the Memory Analysis settings through the launch configuration before starting the session. If you need to see the effects of different settings, run multiple sessions.

  • The first time that you right-click an error listing in Memory Problems and choose Show Backtrace, if you then double-click a stack trace entry in Memory Backtrace, the IDE doesn't open the source code to the corresponding line. This problem is seen if you do these actions for the first time since starting the IDE (even if Memory Backtrace is open but not in focus within its display area) or since explicitly closing the view. (Ref# J443141)

    Note that if you click the Memory Backtrace view tab to switch focus to that view, the double-click navigation feature works the first time you select an error in Memory Problems (and Memory Backtrace is refreshed with the related stack traces).

    Workaround: Double-click the error in the Memory Problems view to open the related source code.

Known issues (IDE): C/C++ development

  • If you start a new IDE session with a new workspace, go to the C/C++ Projects perspective, add a target navigator, and then add a valid target, the target is shown as available and its name is as expected, but you don't get the expansion button to display the list of processes on the target. (Ref# J572145)

    Workaround: Click in another view, or switch to another perspective. When you return to the target navigator, the expansion button appears.

  • If the makefile for a regular C++ make project uses implicit rules such as the following:
    all : cc2
    cc2 : cc2.o
    cc2.o : cc2.cpp

    then the link stage doesn't work properly. (Ref# 62006)

    Workaround: Use an explicit rule for linking:

    cc2 : cc2.o
            $(CXX) -o cc2 cc2.o -lang-c++
  • The IDE sometimes ignores an explicit build request for a project, such as those invoked by using the Build Project action in the C/C++ Project view's right-click menu, if the project uses an externally built library. (Ref# 20966)

    Workaround: Use an explicit target in the make command.

  • If you import a non-IDE project that uses managed recursive makefiles, the IDE incorrectly modifies the makefiles. The project won't compile and you'll see errors about variables not being resolved. (Ref# J1685684)

    Workaround: Modify common.mk to include .qnx_internal.mk after all variable assignments. For example:

    INSTALLDIR=$(firstword $(INSTALLDIR_$(OS)) usr/bin)
    
    LIBS += EGL GLESv2 screen m
    
    include $(MKFILES_ROOT)/qmacros.mk
    ifndef QNX_INTERNAL
    QNX_INTERNAL=$(PROJECT_ROOT)/.qnx_internal.mk
    endif
    include $(QNX_INTERNAL)
    
    include $(MKFILES_ROOT)/qtargets.mk
    

    Note: This issue does not apply to projects that use managed recursive makefiles but are created in the IDE.

Known issues (IDE): Debugging

  • Watchpoints aren't supported for ARM. Although the IDE lets you create a watchpoint, it won't work correctly and could cause instability with your debugging session. (Ref# 12136, 259564, J463656, J545820)
  • The Modules view might not show the most recent state of your loaded libraries during debugging. (Ref# J393844)

    Workaround: To force it to update to the latest state, refresh the view by using File > Refresh.

  • The Modules view doesn't show information for the executable being debugged. (Ref# 259524, J393842)
  • Disconnecting from an executable while it's being debugged causes it to terminate. (Ref# 259773, J393846)

    Workaround: Select Window > Preferences > C/C++ > Debug > GDB. Under Termination, clear the checkbox labeled Terminate GDB when last process exits.

Known issues: Networking

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-nfs2
  • fs-nfs2 doesn't correctly implement the options -w size=n and -w number=n as described in the fs-nfs2 usage message. Don't use them. (Ref# 39031, J473717)
  • fs-nfs2 doesn't support a -B option greater than 8096. (Ref# 39022, J473716)
  • fs-nfs2 lets you modify the on-disk binary file of an executable that is executing. It should return an error with errno set to EBUSY. (Ref# 38563, J473673)
  • The NFS clients don't distinguish between a pathname ending or not ending in / when passed as the argument to mkdir(). (Ref# 38484, J473667)
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*
  • 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 treats the _CS_DOMAIN configuration string differently if it's undefined or set to a NULL string. If it's undefined, Qnet uses a domain of .net.intra; if it's set to a NULL string, Qnet applies that as the domain (for example hostname.). (Ref# 19676, J473190)
  • 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
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)
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: Graphics

General
  • 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 display’s 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.

  • When screen_create_window_group() is called early in the system's bootup sequence, the window group that's generated by Screen may not be unique. (Ref# J1525054)

    Workaround: If you're calling screen_create_window_group() early in your system's bootup sequence, use a unique static name in the name argument instead of setting it to NULL.

  • On some target systems (e.g., NXP SABRE Lite i.MX6Q) , you may encounter a timing issue that's related to framebuffer access. Screen may crash because it's attempting to access a framebuffer that's not available. (Ref# J1653526)

    Workaround: In your framebuffer's class subsection of your configuration file, graphics.conf, set the buffer-count to a minimum of 3.

    ...
    begin class framebuffer
        display = 1
        ...
        buffer-count = 3
    	...
    end class
    ...
    			

    For more information on how to set configuration parameters, see the "Configuring Screen" chapter in the Screen Developer's Guide.

  • On some target systems, the screen_post_window() function may return unsuccessful with an errno code of EDEADLK (45). (Ref# J1648080)

    When your application posts a window whose SCREEN_PROPERTY_STATUS property is SCREEN_STATUS_COVERED after composition, your call to screen_post_window() function may return unsuccessfully.

    Workaround: Do one of the following:

    • In your application windows' class subsection of your configuration file, graphics.conf, set the buffer-count to a minimum of 3.

      ...
      begin class my_app_window_properties
          ...
          buffer-count = 3
      	...
      end class
      ...
      					

      For more information on how to set configuration parameters, see the "Configuring Screen" chapter in the Screen Developer's Guide.

    • In your application, call screen_create_window_buffers() with a minimum of 3 as the count parameter.

      ...
      rc = screen_create_window_buffers(my_app_window, 3);
      ...
      					
  • If you're using the Fontconfig library (i.e.,libfontconfig.so ) to configure and customize fonts, you need to provide a font configuration file (/etc/fontconfig/fonts.conf) on your target system. (Ref# J1687221, J1687021)

    See www.fontconfig.org for examples of font configuration files and more information on the Fontconfig software library.

  • New:The units of the SCREEN_PROPERTY_IDLE_TIMEOUT property are incorrectly documented in the Screen Library Reference. They're nanoseconds, not seconds.(Ref# J2202679)
  • If you're specifying multiple framebuffer classes in your graphics configuration file, and you use the "usage" parameter to specify a user-provided composition module (e.g., pvr2d), Screen will use the last user-provided composition module that's configured for all framebuffer classes that specified a user-provided composition module. For example, take the following configuration:

    …
    begin class framebuffer1
      …
      usage = pvr2d
      …
    end class
    
    begin class framebuffer2
      …
      usage = gles2
      …
    end class
    
    
    begin class framebuffer3
      …
      usage = gles2blt
      …
    end class
    …
    				
    In this example, Screen will use screen-gles2blt.so as the composition module for classes framebuffer1, framebuffer2 and framebuffer3.

    (Ref# J2704977)

NXP
  • Display may momentarily go blue, then black when starting, or slaying, an application on the i.MX6 SabreSmart platform. This is expected behavior when the format of a single window, that's on the display, changes between a 16-bit and 32-bit RGB (e.g., when one application uses RGB565, while another uses RGBA8888). (Ref# J1312155)

    Workaround: Avoid using a mix of windows in 16-bit RGB format (e.g., RGB565) with other formats (e.g., RGBA8888, NV12, etc.), or ensure that multiple windows are visible at all times.

  • LVDS clock setup doesn't follow NXP recommendations on the i.MX6 SabreSmart platform. (Ref# J1338327)

    No workaround is available. However, displays that don't use the iMX6 on-chip LVDS bridge (e.g., HDMI, parallel, or an off-chip external LVDS bridge on a custom board) are not affected.

  • When screen terminates, the GPU may be in a unknown state on the i.MX6 SABRE for Automotive Infotainment (AI) platform. If you restart screen, you may eventually encounter a GPU lockup. When this happens, reboot your board. (Ref# J1641466)
  • Not all Khronos GLES 3.0 conformance tests pass. (Ref# J1517912)
Intel
  • QNX SDP 7.0 includes the Intel Beta DRM because the Gold DRM wasn't available in time to be integrated and tested. We plan to include the Gold DRM in a future update.

  • Some issues with GPU rendering may be observed on the Intel Skylake platform. These issues are expected to be resolved once the Intel Gold DRM is available. (Ref# J1669361)

  • You can't launch Screen applications as a non-root user. (Ref# J1682025)

    Workaround: Start procnto with the -mL option. For example:

    procnto-smp-instr -mL
    				
  • When you specify a display that you didn't configure in your configuration file (graphics.conf) in the -display option of gles2-gears, the gles2-gears application crashes. (Ref# J1628227)

Texas Instruments
  • You may see PVR_K* error messages in sloginfo logs on the Sitara 437x platform. These are only warnings. You're safe to disregard these errors. (Ref# J1587196)
  • When you run multiple applications simultaneously that rely heavily on GPU resources on the Sitara 437x and AM335x platforms, your board may reset. For example, running GLES 2.0 conformance and GLBenchmark 2.5.1 tests will trigger a reset on these boards. (Ref# J1685675, J1685667, J1643220)
VMware
  • If you're using VMware Workstation or Player 12, you may see the error: "3D acceleration is not supported in this guest operating system" when you select "Accelerate 3D graphics" from your Hardware tab in your virtual machine settings. (Ref# J1553085)

    Workaround: You can downgrade the virtual hardware from VMware Workstation 12 to 10:

    1. Right-click your virtual machine and select "Manage".
    2. Select "Change Hardware Compatibility..." option.
    3. Continue with the "Change Hardware Compatibility" wizard.
    4. Select "Workstation 10.0" from the dropdown menu for "Hardware compatibility:".
    5. Select "Next >".
    6. Select your choice between creating a new clone of or altering this virtual machine.
    7. Select "Next >".
    8. Select "Finish".
  • If you are using VMware Workstation or Player 12 and the GPU fails to start, screen remains running. (Ref# J1587218)

  • OpenGL applications may crash while performing functions that are related to texture compression; support for texture compression is very limited when you're using VMware as the target. (Ref# J1672201)

  • When you specify a display that you didn't configure in your configuration file (graphics.conf) in the -display option of gles2-gears, the gles2-gears application crashes. (Ref# J1628227)

Known issues: Persistent Publish/Subscribe

  • 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)

Verification issues

These are the known verification issues that you may encounter when verifying your installation with SDP 7.0 updates:

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 base_directory/qnxmomentics/qde, where base_directory is where you installed the software
  • 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.0.

For the most up-to-date version of the release notes, start the QNX Software Center, right-click on the QNX SDP 7.0 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, http://community.qnx.com. There are other forums for specific topics, including the QNX Neutrino RTOS, development tools, networking, Board Support Packages, and so on.