Date of this edition: November 14, 2008
![]() |
Changes to these notes since June 7, 2004 are highlighted below
with this icon:
|
Target OS: QNX® Neutrino® 6.3.0
Host OS: Microsoft Windows XP SP1 or 2000 SP4; Sun Solaris 7/8; QNX® Neutrino® 6.3.0; Linux (Red Hat 8/9)
![]() |
|
![]() |
Make sure that Plug and Play OS is disabled in the BIOS before you run QNX Neutrino self-hosted. |
![]() |
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. |
![]() |
For up-to-date information on what's compatible between the latest two versions, see 6.3.0 and 6.2.1 Compatibility, available on our website. |
Here are the main new features in the 6.3 release:
![]() |
For more details, please refer to the “what's new” sections in the docs. |
![]() |
For 6.3 and beyond, BSPs are available only from our website. |
The base QNX Momentics suite includes the operating system and services required for most embedded systems (e.g. filesystems, GUI, IP networking technologies). The value-added TDKs, which are available from your myQNX account center, help you control costs and achieve overall lower TCO for QNX Momentics-based systems.
The TDKs include:
For more details, please contact your QNX sales representative.
![]() |
With the release of 6.3.0, some networking utilities and
services have been moved from the base product to the
Extended Networking TDK:
Managers
Utilities
Libraries
|
![]() |
The Photon Application Builder (PhAB) is available only for
Windows and QNX Neutrino hosts.
If you're using a Linux or Solaris host, but you still want to use PhAB, consider installing a QNX Neutrino host to a second partition or an X86 simulator (e.g. VMware). |
The QNX Momentics 6.3.0 development suite lets you install and work with multiple versions of Neutrino (from 6.2.1 and later). Whether you're using the command line or the IDE, you can choose which version of the OS to build programs for.
When you install QNX Momentics, you get a set of configuration files that indicate where you've installed the software. The QNX_CONFIGURATION environment variable stores the location of the configuration files for the installed versions of Neutrino; on a self-hosted Neutrino machine, the default is /etc/qnx.
On Windows hosts, you'll find a configuration program (QWinCfg) for switching between versions of QNX Momentics.
You launch QWinCfg via the start menu (e.g. ).
For details on using QWinCfg, see its entry in the Utilities Reference.
If you're using the command-line tools, use the qconfig utility to configure your machine to use a specific version of Neutrino:
eval `qconfig -n "QNX 6.3.0 Install" -e`
![]() |
In the above command, you must use the “back tick” character (`), not the single quote character ('). |
When you start the IDE, it uses your current qconfig choice as the default version of the OS; if you haven't chosen a version, the IDE chooses an entry from the directory identified by QNX_CONFIGURATION. If you want to override the IDE's choice, you can choose the appropriate build target. (For more information, see the section “Version coexistence” in the Concepts chapter of the IDE User's Guide.)
![]() |
Coexistence of 6.3.0 and 6.2.1 is supported only on Windows and Solaris hosts. |
Neutrino uses these environment variables to locate files on the host machine:
The qconfig utility sets these variables according to the version of QNX Momentics that you specified.
Here are the main changes in 6.3 (in alphabetical order):
![]() |
For more details on changes in 6.3, including references to our Change Request Database, see the “What's Included” section of the online Welcome Message that gets installed along with the software. |
![]() |
You can use this import facility only for 6.3 (and later) BSPs. |
![]() |
For more information on BSPs and DDKs, see the installation notes and release notes (under /etc/readme/bsp|ddk/*.html). |
or:
The SDK now requires that QNX_HOST, QNX_TARGET, QNX_CONFIGURATION, and MAKEFLAGS be set. On Windows and QNX Neutrino hosts, these are set automatically; on Solaris and Linux, they're set interactively.
In previous releases of the SDK, make knew where to find included *.mk files, but no longer. You must set MAKEFLAGS to:
MAKEFLAGS=-I${QNX_TARGET}/usr/include
QNX_HOST and QNX_TARGET used to have default values if they weren't set, but no longer. You must set these to wherever the SDK host and target files are located. For example:
QNX_HOST=C:/QNX630/host/win32/x86 QNX_TARGET=C:/QNX630/target/qnx6
QNX_CONFIGURATION gives the location of the qconfig configuration files. The default is /etc/qnx.
![]() |
Please remember to use forward slashes (/) when setting environment variables on all hosts, because many of the tools in the SDK will interpret a backward slash (\) as an escape character and will simply remove it. |
nto$CPU-gcc
or:
qcc -Vgcc_nto$CPU
To get a specific version, run:
nto$CPU-gcc-$version
or:
qcc -V$version,gcc_nto$CPU
Examples:
| Command | Compiler version |
|---|---|
| ntoarm-gcc | 2.95.3 |
| ntoarm-gcc-2.95.3 | 2.95.3 |
| ntoarm-gcc-3.3.1 | 3.3.1 |
| qcc -Vgcc_ntomipsle | 2.95.3 |
| qcc -V2.95.3,gcc_ntomipsle | 2.95.3 |
| qcc -V3.3.1,gcc_ntomipsle | 3.3.1 |
![]() |
To change the default compiler in the IDE, use the Compiler Tab in the project Properties dialog. |
If you're using the QNX recursive makefile hierarchy, make needs to be able to find the makefile fragments (.mk files) with the rules for building QNX projects. These are stored in $QNX_TARGET/usr/include.
The environment variable MAKEFLAGS gives extra command-line flags to make; by setting it to -I$QNX_TARGET/usr/include, these .mk files will be found.
![]() |
Microsoft's nmake also uses MAKEFLAGS, so if there's a mixed environment, you can use GNUMAKEFLAGS, which is an extension to standard make and exists only in the QNX-supplied version. |
Starting with 6.3.0, mkifs keeps the following ELF sections by default, even without the +raw attribute:
You can use the new -s command-line option to name sections that you want mkifs to keep.
![]() |
If you specify -s, only the sections that you specify are kept. You need to explicitly specify the above names if you want to keep them as well. |
This behavior is being deprecated; it will be removed post 6.3.0. The correct method is to use the -rpath-link option.
![]() |
Asynchronous messaging is an experimental feature in 6.3.0; its implementation may change. |
Asynchronous messaging is a communication model that relies on a store-and-forward technique. Compared to regular reply-based communication in client-server systems, the messaging infrastructure ensures delivery, even if a participant is temporarily offline, busy, or unobtainable. In this technique, the sender doesn't need a response from the recipient. This provides more flexibility and scalability as the senders and receivers are de-coupled and are no longer required to execute in lockstep.
More and more customers are demanding such fast, nonblocking message-passing mechanisms. In some real-world scenarios, the client doesn't have to wait in a blocking state for the server to finish servicing its requests; rather, it can improve its performance by carrying out some tasks while waiting. Multiple asynchronous messages can also be sent out within a short period of time. Buffering those messages and sending them out as a bunch can reduce the frequency of entering the kernel and thus improve system performance.
Asynchronous messaging in Neutrino provides an event-driven system model that complements our traditional message-passing architecture of synchronous messaging. Its main feature is high throughput and nonblocking message passing. You can now design systems where the OS can react in a timely way to asynchronous events generated externally or internally. Asynchronous messaging also provides a convenient and efficient mechanism to deliver asynchronous events and their associated data among system components.
We provide several asyncmsg_*() APIs and encourage you to use these interfaces to implement your own application using asynchronous messaging:
| To: | Use this function: |
|---|---|
| Create an asynchronous message channel | asyncmsg_channel_create() |
| Destroy an asynchronous message channel | asyncmsg_channel_destroy() |
| Establish a connection between a calling process and a channel | asyncmsg_connect_attach() |
| Detach the connection | asyncmsg_connect_detach() |
| Flush all the messages | asyncmsg_flush() |
| Return the original connection attributes | asyncmsg_connect_attr() |
| Take message(s) from a buffer or an array of buffers | asyncmsg_put()/asyncmsg_putv() |
| Receive an asynchronous message from the channel | asyncmsg_get() |
| Free a message buffer | asyncmsg_free() |
| Allocate a message buffer for sending | asyncmsg_malloc() |
Some class definitions are stricter in 6.3.0.
For example, the set class requires unique keys;
you can no longer modify keys that you've already added to the set,
because you could create duplicates.
This change could cause code that compiled on 6.2.1 not to compile on 6.3.0.
(Ref# 21773)
In 6.3, dinit now creates long filenames by default. You can disable support for long filenames by specifying the -N option. (Ref# 17642)
![]() |
This is the reverse of the behavior of 6.2.1; the -N option formerly enabled support for long filenames. |
We fixed problems with side-channel connections and errnos reported. (Ref#s 16959; 16960)
![]() |
The OS now prevents _NTO_SIDE_CHANNEL connections from being
dup'd (via dup(), dup2(), or fcntl(F_DUPFD)). This is to
maintain consistency with the concept of side-channels forming
a separate file-descriptor space that isn't subject to normal
process-inheritance rules.
If you are dup()ing side-channels, then they must now be attached as normal file descriptors. Note also that the low-level ConnectAttach() doesn't allow the specification of a specific side-channel index, which is required by dup2(). |
The value of FD_SETSIZE has changed from 32 to 256. This affects the size of the fd_set objects that you pass to select().
This means that by default the highest allowable fd number for FD_SET(fd, &set) is 255.
Any use of fd_set within data structures will therefore cause a change in structure size, so you should do a global recompile.
![]() |
The global recompile should include all application code, as well as library code that would be referencing fd_set or structures containing fd_set. If you don't recompile, you may see random corruption and crashes. |
To make the value higher, #define FD_SETSIZE before including <sys/select.h>. But make sure this is done consistently throughout your modules.
If you don't want to cause a global compile, you can #define FD_SETSIZE 32 before including <sys/select.h> (or -DFD_SETSIZE=32 on the command line) to set it back to the old size, but make sure this setting is consistently applied to all your code.
The instrumented kernel (procnto-instr) is now the default kernel for QNX Neutrino self-hosted systems.
For security reasons, the path(s) specified by LD_LIBRARY_PATH for setuid/setgid binaries will no longer be searched when loading shared objects.
Instead, only the path(s) defined by the _CS_LIBPATH configuration string will be used. You can examine or modify the value of _CS_LIBPATH using the getconf and setconf utilities.
![]() |
In a buildfile, you can set the initial value of
_CS_LIBPATH via the
LD_LIBRARY_PATH= part of the
“procnto” line. For example:
PATH=/proc/boot:/bin:/usr/bin LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll procnto |
The pidin utility now has a format code (l) to show the last CPU a thread was run on.
The poll() function has been added. Initial support is limited to the first three event types: POLLRDNORM, POLLWRNORM, and POLLRDBAND.
The 6.3.0 release ships with an optional alternate implementation of POSIX message queues. This implementation uses the new asynchronous messaging facility of the kernel to buffer the messages within the kernel itself, and eliminates the (context-switching) overheads of using an external server (mqueue) in each message-queue operation, thus greatly improving the performance of POSIX message queues.
![]() |
By default, the implementation of the mq_*() routines in libc is the old style, using the mqueue server to broker each transaction. To use the new-style implementation, the application(s) must be linked against the libmq library. In a manual build, specify the -l mq option; in automatic/recursive builds, use this setting in your common.mk file:
LIBS += mq
Since both variants adhere to the POSIX 1003.1 Message Passing API, no code-level changes are required in conforming applications.
The new server /sbin/mq must also be started. Although this server is not involved in each mq_send()/mq_receive()/mq_notify() operation, the server is necessary in order to maintain the queue names and create the corresponding kernel message queues. The server also presents all created queues in the /dev/mq/ directory, allowing the use of ls and rm for administration purposes (although the queue contents can't be manipulated via shell utilities). This directory could be changed to union over the directory exported by the old mqueue server by using the mq -N/dev/mqueue option, but this isn't recommended, because it may cause some user-namespace confusion.
The two POSIX message queue implementations may coexist but are disjoint. Queues created with mq_open() from libc aren't accessible to mq_open() from libmq and vice versa. When relinking applications to use the new implementation, be sure to change all affected components. We require such explicit intervention to use the alternate implementation because of potential incompatibilities if your code isn't strictly POSIX conforming.
Message queue descriptors (mqd_t) are no longer file descriptors in the alternate implementation. The POSIX 1003.1 standard makes no claim as to the underlying type of an mqd_t, and provides a specific set of functions to manipulate a message queue and its attributes based on an abstract mqd_t type.
For example, the following code modifies the nonblocking attribute of an open message queue:
mq_getattr(mq, &attr); attr.mq_flags |= O_NONBLOCK; mq_setattr(mq, &attr, NULL);
And this example attempts to obtain the count of messages in a queue:
mq_getattr(mq, &attr); nmsg = attr.mq_curmsgs;
Other examples include the historic interchangeability of mq_send() with write() and of mq_receive() with read(). There's no direct counterpart to select() when used on a mixed set of queues and file descriptors or for the transition from a full queue, although mq_notify() may be used to register an event against a message queue on transition from empty.
![]() |
The alternate implementation doesn't support the DCMD_MISC_MQSETCLOSEMSG QNX extension to inject a canned message when a queue descriptor is closed. |
The default configuration of a message queue created by mq_open(O_CREAT) with a NULL mq_attr structure has been changed, because kernel buffers for the messages are now created up-front rather than on-demand. To create a queue with a specific configuration, simply provide a non-NULL mq_attr. To force the NULL default to match that of the old implementation, use the mq -m1024 -s4096 options (which isn't recommended, because this will consume 4MB of system memory for each such queue!).
Since the kernel primitives supporting the asynchronous message-queue facilities are non-orthogonal with respect to native QNET networking, the alternate implementation allows for message queues to be manipulated only from the local machine. Of course, distributed access and the network-qualified naming of message queues is undefined by POSIX.
The following table summarizes the main differences between the alternate implementations:
| Style | Server | Library | Pathname | mqd_t implementation | Qnet |
|---|---|---|---|---|---|
| Old (6.x) | mqueue | libc | /dev/mqueue/ | int (file descriptor) | Yes |
| New (6.3.0) | mq | libmq | /dev/mq/ | int (internal index) | No |
With the new design, the following routines are now deprecated (and they spit out a message to that effect if you call them):
They're handled automatically by the library now.
Instead of ppc7450_init_l2_cache(), use ppc700_init_l2_cache().
The startup library now enables instruction and data translation very early on for PPC 600-series chips. It also enables the data cache as well. Doing this speeds up the startup, removes code from the kernel (eventually), and lets us avoid duplicating the same routine over and over again in the startup/boards tree.
However, basically all the board startups for PPC 600 chips have to be tweaked. Since the MMU is now enabled while startup is running, you can't just in8/out8 or dereference a physical address. Instead, you must use the startup_io_map/startup_memory_map|unmap functions to gain access to the storage.
Also, callout routines should have a patcher that uses callout_[io/memory]_map[_indirect] calls to map the given physical addresses to a virtual address that the callout code can use. The kernel no longer looks for a “kernel_device” entry in the asinfo section and provides the mapping for you.
For more information, see the section “PPC chips support” in the Customizing Image Startup Programs chapter of Building Embedded Systems.
![]() |
The MIPS startup library also uses the same style of code as with the PPC to deal with chip variations. |
With Book E processors, interrupts (and all other exceptions as well) no longer start at fixed locations in low memory. Instead, there's a set of IVORs (Interrupt Vector Offset Register). There's a different IVOR for each exception class. Book E describes 16 of them and reserves another 48 for future expansion and implementation use.
Accordingly, when specifying the interrupt layout to startup you don't use the PPC_EXC_? constants on a Book E CPU. Instead, you identify the particular IVOR register that the processor will use when the interrupt goes off. For example, PPCBKE_SPR_IVOR4 is used for normal external interrupts, PPCBKE_SPR_IVOR10 for decrementor interrupts. See startup/boards/440rb/init_intrinfo.c for an example of what to do on Book E CPUs.
The OS now supports 256 priority levels.
Note that non-root processes can use only priority levels 1 to 63. Only root processes (i.e. those whose effective uid is 0) are allowed to set priorities above 63.
You can change the allowed priority range for non-root processes with the procnto -P option:
procnto -P priority
Here's a summary of the ranges:
| Priority level | Owner |
|---|---|
| 0 | idle thread |
| 1 through priority − 1 | non-root or root |
| priority through 255 | root |
This is a new function that you can use to tune some of the parameters used internally by the resource manager layer when performing the client fd - ocb mapping. For more information, see the Neutrino Library Reference.
The select() function used to make use of the functions _select_event() and _select_block(). The latter two functions weren't doc'd (other than being prototyped in /usr/include/sys/select.h.)
As of 6.3, these two functions are no longer used internally. However, they've been left in libc for the time being, but may be removed altogether in a future release. For reference, here is the old implementation of select():
/*
Copyright 2001, QNX Software Systems Ltd. All Rights Reserved
This source code has been published by QNX Software Systems
Ltd. (QSSL). However, any use, reproduction, modification,
distribution or transfer of this software, or any software
which includes or is based upon any of this code, is only
permitted under the terms of the QNX Realtime Platform End
User License Agreement (see licensing.qnx.com for details)
or as otherwise expressly authorized by a written license
agreement from QSSL. For more information, please email
licensing@qnx.com.
*/
#include
#include
#include
#include
#include
#include
#include
/* The routine implements the Unix select call. When
semantics differ the BSD
semantics defined in APUE (pg. 396-400) are followed.
*/
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *tvptr)
{
struct sigevent event;
struct timespec ts;
if(tvptr)
{
if (tvptr->tv_sec < 0 || /* don't bother
checking upper ends, roll over will catch really bad overflows */
tvptr->tv_usec < 0)
return errno= EINVAL, -1;
ts.tv_sec= tvptr->tv_sec ;
ts.tv_nsec= tvptr->tv_usec * 1000L ;
}
event.sigev_notify = SIGEV_SIGNAL_THREAD;
event.sigev_signo = SIGSELECT; /* This signal is
always SIGBLOCKed */
/* event.sigev_value will be modified as needed by
select_sigevent() */
event.sigev_code = SI_NOTIFY;
event.sigev_priority = -1;
return _select_event(nfds, readfds, writefds, exceptfds, tvptr ? &ts : 0, &event, _select_block, 0);
}
The behavior of the SHMCTL_GLOBAL and SHMCTL_PHYS
flags has changed for ARM processors.
On ARM, you can use shm_ctl() to create shared memory objects that can be mapped outside the regular process address space to overcome the 32MB address-space limitation.
In 6.2.1, these objects, when mapped, weren't protected and were potentially accessible via their global virtual addresses from any suitably privileged process. This access was restricted to processes that had performed ThreadCtl(_NTO_TCTL_IO), so in general, this was restricted to drivers or other system processes. The SHMCTL_LOWERPROT flag lowered this restriction so that any user process could potentially access these mappings without having to use ThreadCtl(_NTO_TCTL_IO) first.
In 6.3.0, these global mappings are protected, so that only the process that performed the mmap() of the shared memory object can access it. If you have any code written for 6.2.1 that relies on the implicit access allowed by these global mappings, you must modify it to use the flags to explicitly remove the per-process protection:
In addition to the per-process protection, 6.3.0 changes the alignment of the virtual addresses where these global mappings are placed:
In 6.2.1, mmap() mapped separate objects similar to the following:
In 6.3.0, mmap() maps these objects as:
If you have any code written for 6.2.1 that makes assumptions about the alignment of mappings or uses MAP_FIXED with non-1MB alignment, you must modify it to comply with the new behavior.
QNX Neutrino 6.3 now implements the X/Open Largefile Support extensions. For details, see the 6.3.0 and 6.2.1 Compatibility note posted on our website.
The startup library now supports 64-bit physical addresses for the MIPS, PPC, and X86 architectures. Two versions of the libstartup.a are built:
By default, startup programs will compile and link with the 32-bit version. If a board needs 64-bit physical addresses, add the make macro PADDR_SIZE=64 to the board's pinfo.mk file (see startup/boards/440rb/pinfo.mk for an example).
Support for swapping (experimental on x86) has been removed with the 6.3.0 release. It was introduced to help compile and link large projects on memory-constrained hosts, but is no longer required using current PC configurations.
Here's replacement code for SYSTEM_ENTRY(system_private)->ramsize:
uint64_t
get_total_mem(void) {
char *str = SYSPAGE_ENTRY(strings)->data;
struct asinfo_entry *as = SYSPAGE_ENTRY(asinfo);
uint64_t total = 0;
unsigned num;
for(num = _syspage_ptr->asinfo.entry_size / sizeof(*as); num > 0; --num) {
if(strcmp(&str[as->name], "ram") == 0) {
total += as->end - as->start + 1;
}
++as;
}
return total;
}
For code that scans meminfo, replace the check of the type field with a strcmp() of the appropriate asinfo entry name (as above) and scan asinfo.
We've developed a Neutrino User's Guide covering a broad range of topics to help users as well as system administrators work with a Neutrino system.
We've corrected the behavior of the _NTO_CHF_COID_DISCONNECT
and _NTO_CHF_THREAD_DEATH flags for ChannelCreate().
For descriptions of the new behavior, see the entry for
ChannelCreate() in the Neutrino Library Reference.
(Ref# 15480)
The following math functions are deprecated:
| Instead of: | Use: |
|---|---|
| drem() | remainder() |
| dremf() | remainder() |
| finite() | isfinite() |
| finitef() | isfinite() |
| isinff() | isinf() |
| isnanf() | isnan() |
| significand() | scalbn( x, -ilogb( x )) |
| significandf() | scalbnf( x, -ilogbf( x )) |
| scalbf() | scalbn() |
New drivers:
| Driver | Controller | Target CPU |
|---|---|---|
| devg-chips.so (replaces devg-chip_hiqv.so) | Chips & Technologies 65550 and greater | MIPSLE, PPCBE, SHLE, X86 |
| devg-coral.so | Fujitsu Coral B & Coral P | ARMLE, PPCBE, SHLE, X86 |
| devg-i830.so | Intel 82830, 82845, 82865 | X86 |
| devg-orchid.so | Fujitsu Orchid | PPCBE, SHLE, X86 |
| devg-ravin.so | NEC RavinE | MIPSLE, PPCBE, X86 |
| devg-sis630.so | SiS 300 & 630 | X86 |
| devg-smi7xx.so | Silicon Motion 712, 722 & 731 | ARMLE, MIPSLE, PPCBE, SHLE, X86 |
| devg-smi5xx.so | Silicon Motion 501 | ARMLE, MIPSLE, PPCBE, SHLE, X86 |
| devg-tvia.so (replaces devg-igs5300.so) | TVIA 52xx and 53xx | MIPSLE, SHLE, X86 |
A new version of the NOR flash filesystem library offers significantly improved resistance to power-loss corruption. However, this improvement isn't backwards-compatible with the older version of the library.
The older library (libfs-flash.a) has been removed from this release. All flash drivers (devf-generic, devf-ram, etc.) now link against the version 3 library, i.e. libfs-flash3.a.
If your existing code links against libfs-flash.a, you must now use the version 3 library. For more information, please refer to the documentation on the new version 3 flash filesystem as well as the migration technote.
![]() |
If you're using the IDE, you might want to set your preferences for QNX projects to build only for the specific target platforms you want. See: . |
The new API has been reworked to lift some of the restrictions of the old API. The old API can hold only one config file open at a time, seriously limiting its practicality (particularly for use in a library).
All existing PxConfig* calls (from pre-6.3) continue to be supported in the form of macro wrappers around the new API.
![]() |
You need to recompile your applications if you're moving to 6.3 — we encourage you to migrate to the new API, particularly for new projects. But apps that worked with the old API should continue to work with the new. |
For details on the new API, see the PxConfig* entries in the Photon Library Reference.
If your connection configuration includes a proxy server, remember to add the following in the Proxy Overrides field in the Connection tab ():
127.0.0.1, localhost
This will allow the IDE's help system to locate the files it needs.
The design architecture has evolved from 6.2.x. Under 6.2.x, io-graphics was able to load the font server into its own data segment in order to speed up rendering services. This interface has been taken to a new level, through libfont, by allowing several system configurations:
Client applications may also load a private client font instance, resulting in maximum speed when making font requests. Please read the new documentation for phfont, fontadmin, and libfont (Font Library Functions, specifically Pf*Dll() API calls).
Under the 6.3 architecture, rendering plugins are utilized by phfont. These DLLs are located in /lib/dll/font. Each rendering DLL has an embedded use message; just type use dllname.
The following binaries are no longer required:
Please read the documentation on phfont for further details. Options for the DLLs are set via the fontopts file; see the docs on fontadmin for further details.
Due to the new library (libfont), when linking against a static libph you must also link against libfont.
This script can be used to copy all the font system binaries and libraries to a target build image. Usage is simple:
embed_font target_root_directory
The fontopt configuration file is now deprecated and no longer used. Use the fontopts file instead. See the docs for phfont and fontadmin for further details.
The fontview program is a font-viewer application that can display glyphs from any font format supported by phfont, without having to install the font file. For more information, see the usage message (type use fontview from a pterm).
The fontview utility uses the same rendering plugins as phfont.
This utility now uses the same rendering plugins as phfont to process index files.
Now has a new command-line format; supports configuration file, and multi-headed display.
Fixed a problem where PhAB for Windows wouldn't recognize and render user-supplied TrueType fonts. (Ref# 19865)
To install a TrueType font:
%QNX_TARGET%\usr\photon\font_repository directory
Most Pg*() functions have Cx* versions, which are context-specific.
![]() |
Since the Pg*() versions are implemented as
macros based on their *Cx() counterparts, they no
longer have symbols in the new libraries; you'll need to
recompile your code if you use these functions.
The macros are defined in the <PhProto.h> public header file. |
The window frames have been updated with a new look and new decorations. You can revert to the 6.2-style window frames by moving or removing /usr/photon/dll/winframe_updated.so.
You can have the new window frames on the desktop and have the old window frames in PhAB by launching PhAB with the -D option (ab -D) or with any other style of window frame by using the -F framestyle option.
You can pull in and execute a block of user code during the initialization of Photon applications. For details, see the widget styles section of the Managing Widgets in Application Code chapter of the Photon Programmer's Guide.
The Photon clipboard has been enhanced with added security. You can no longer get access to another user's clipboard files, unless you're running as root. Clipboard files are no longer compatible between 6.3.0 and previous releases. This also means that Photon applications built against libph.so.2 can't share the clipboard with Photon applications built against libph.so.3.
Note also that in 6.3, you're no longer limited to 64K when you cut-and-paste text. The limit is now your system RAM.
Starting in 6.3.0, clipboard changes cause a new event to be emitted. The event will be a Ph_EV_INFO, with a subtype of Ph_CLIPBOARD_CHANGED. The data associated with the event will contain the input group number and the “clip type” string, so that the listener can call PhClipboardRead() to paste the data just copied. The old region changed event has been deprecated, but for now will still be emitted when the clipboard changes.
The default login application is now phlogin2, which provides a user icon that you can select to log in. If you remove phlogin2 from the path, phlogin (the original GUI login from 6.2) is used automatically.
The PtExit() function no longer causes individual threads to exit. See the docs for details.
If the PtNumericInteger and PtNumericFloat widgets have the Pt_CALLBACKS_ACTIVE bit set in the Pt_ARG_FLAGS resource, these callbacks are also invoked when your application changes the Pt_ARG_NUMERIC_VALUE with a call to PtSetResource() or PtSetResources(), or if the Pt_ARG_NUMERIC_VALUE is changed indirectly by a change to Pt_ARG_NUMERIC_MIN or Pt_ARG_NUMERIC_MAX.
For 6.3, we're shipping two versions of Qnet:
![]() |
The new Qnet (npm-qnet-l4_lite.so) is not compatible with the pre-6.3 versions. |
The default version is the new lightweight Qnet (npm-qnet.so is a link to npm-qnet-l4_lite.so). If you wish to use the older version of Qnet, have npm-qnet.so link to npm-qnet-compat.so and restart io-net.
![]() |
|
IPFilter (lsm-ipfilter-[v4|v6] can be used only with the matching TCP/IP stack (i.e. lsm-ipfilter-v4.so with npm-tcpip-v4.so; lsm-ipfilter-v6.so with npm-tcpip-v6.so).
![]() |
Although our Tiny TCP/IP stack (npm-ttcpip.so) hasn't been updated to address the TCP vulnerabilities, we anticipate that embedded devices using our tiny stack have applications that use short-lived TCP connections and are therefore not as vulnerable. |
![]() |
IPv6 is now part of the Extended Networking TDK. |
By default, rpcbind executes in “secure” mode and uses Unix Domain Sockets for local communication.
If you wish to use an older RPC application with rpcbind or to use rpcbind in combination with the Tiny TCP/IP stack, you'll need to refer to the -L and -i options to rpcbind.
![]() |
The service rpcbind must be defined for
both UDP and TCP in the /etc/services file.
While the default /etc/services provided has
these modifications, if you choose to use the current
/etc/services file at installation time,
these definitions will be missing and rpcbind
will fail to function. The required lines are:
sunrpc 111/tcp rpcbind portmap
sunrpc 111/udp rpcbind portmap
|
Timeouts for clnt_broadcast() have changed. In 6.2 and earlier, timeout and retransmission occurs at 4 seconds and increases by 2 seconds for every timeout after that to a max of 14-second timeouts, resulting in 6 retransmissions.
In 6.3, timeout and retransmission occurs at 4 seconds and doubles after that to a max of 8 seconds, resulting in 2 retransmissions. You can alter timeout values by calling the lower-level call rpc_broadcast_exp().
The name_open() function used to be a silent operation for the server in that it wouldn't know when a client called name_open(). This behavior is changed to allow operation over the network.
The server will now always receive an _IO_CONNECT message when a client calls name_open(). (For more information, please refer to the gns entry in the Utilities Reference.)
This utility sets its user ID to root.
It was reported that you can overrun the source/target file argument
buffers in the utility, giving yourself root access.
Under QNX Neutrino, rcp spawns the cp utility
for local file-copying operations;
it's the cp utility that faults.
When rcp spawns cp, it does so with the credentials
of the user who launched rcp, rather than root's.
(Ref# 22002)
We now provide two shells:
You'll find these executables under ${QNX_HOST}/usr/bin (e.g. C:\QNX630\host\win32\x86\usr\bin). You may want to create desktop shortcuts for these or other executables you'll use often.
![]() |
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 QNX Momentics 6.3.0 are:
The 6.3 release contains known problems in these areas:
For more information about specific BSPs and DDKs, see the release notes that accompany them.
At this time, we recommend that you use the GCC 2.95.3 tool chain to compile the source for the BSPs and DDKs. (Ref# 19949)
The system crashes when using intensive memory allocations. (Ref# 17929)
PATH=/proc/boot:/bin:/usr/bin LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll procnto
Or, use setconf from the command line to set up LIBPATH. You must be root to do this.
Workaround: To get the support modes on a non-PCI Chips & Technologies graphics adapter (version 65550 and greater):
echo(devgt-iographics -dldevg-chips.so, $(fname))
crttrap trap
Workaround: If you need flat-panel support for a non-X86 platform, contact your QNX sales representative for options.
![]() |
For non-X86 systems, you must set jumper J3 on the IGS card on. |
As a workaround for some systems, you can manually lower the refresh rate from the default 60Hz to 53Hz. But for other systems there is no workaround, apart from using one of the generic drivers (e.g. devg-vesabios.so or devg-svga.so).
We are working on a better flat-panel solution for devg-radeon.so and plan to ship a new driver in a patch following the 6.3 release.
Workaround: Try removing all cards from the system except the card that will be used.
For some users, this isn't a good option. For example, you may not be able to remove cards if they're built into the motherboard, and the system uses one card for QNX Neutrino and a different card for Windows. In this case, there's another workaround that you can try. When the system boots, the graphics enumerator searches the system for graphics adapters that may be present, and creates a list of drivers to be used when crttrap is executed. This search is based on PCI Vendor and Device ID. Here's what to do:
![]() |
This workaround might not work with all hardware combinations. |
Workaround: If your laptop has special function keys to switch the display from the LCD panel to a CRT monitor (or to both), try cycling through the displays to see if the text prompt returns to the LCD. Even if this workaround helps, please let us know the type of laptop and graphics adapter you're using. Note that this may not fix the problem on all systems.
Workaround: There's a new configuration file (/usr/photon/config/crtc-settings) that io-graphics uses to set the graphics mode timings. You can modify these settings to get the correct timings for your graphics mode.
![]() |
If this file can't be found, io-graphics uses a set of generic timing formulas to calculate the values. This may also cause the very centering/refresh-rate problem you're trying to solve! |
Workaround: Enable alignment-fault emulation for procnto:
procnto -ae
Workaround: Rebuild the startup binary using Momentics 6.3.0. The resulting startup will work with both 6.2.1 and 6.3.0.
Workarounds:
export BISON_SIMPLE=$QNX_HOST/usr/share/bison/bison.simple export BISON_HAIRY=$QNX_HOST/usr/share/bison/bison.hairy
Or:
ln -s /usr/qnx630/host/qnx6/x86/usr/share/bison /usr/share
For example, the following will apply an alignment of 8 to both my_long_long_t and the long long:
typedef long long my_long_long_t __attribute__((__aligned__(8)));
Workaround: Make a duplicate typedef of a dummy type:
typedef long long my_dummy_t; typedef my_dummy_t my_long_long_t __attribute__((__aligned__(8)));
Workaround: Use the dwarf-2 debug format (-gdwarf-2) instead of stabs.
Workaround: Specify the alignment for each data declaration that needs it. For example:
struct mystruct {
int my_int;
int64_t my_int64 __attribute__((__aligned__(8)));
};
This problem affects only shle targets and occurs only on Windows when using gcc 3.3.1 with dwarf debug format while specifying an absolute source path. Note that the IDE uses an absolute source path and defaults to dwarf.
Workaround: Change the default debugging format from dwarf-2 to stabs+.
If you're using the IDE:
-gstabs+
If you're using the command line, you have two options:
![]() |
Use -gstabs+ instead of -g. For example, change:
qcc -V3.3.1,gcc_ntoshle -g c:\code\first_c.c -o first_c_g to: qcc -V3.3.1,gcc_ntoshle -gstabs+ c:\code\first_c.c -o first_c_g |
Or:
![]() |
Use the relative path to the source file. For example:
qcc -V3.3.1,gcc_ntoshle -g first_c.c -o first_c_g |
Workaround: See “Parse errors for simple code” in gcc.gnu.org/bugs.html#known.
Workaround: Launch pterm windows using pwm's Desktop Menu (press Alt-Enter or right-click on the desktop background) instead of using the Terminal button on the shelf. Only pterm windows started by shelf inherit the ignored SIGUSR1.
Another option is to write a wrapper around gdb to reset SIGUSR1.
This issue will be addressed in a patch to 6.3.0.
This issue will be addressed in a patch to 6.3.0.
This issue will be addressed in a patch to 6.3.0.
Workaround:
Don't use the MAP_SHARED flag. Most applications don't really need to create an anonymous shared object, just a mapping to physically contiguous memory.
If an object is required, please use shm_ctl() to overlay an object on top of a physically contiguous mapping.
This issue will be addressed in a patch to 6.3.0.
The server needs to look like this:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "myname"
union msg_hdrs {
uint16_t type;
struct _pulse pulse;
};
/*** Server Side of the code ***/
int main(int argc, char *argv[]) {
name_attach_t *attach;
union msg_hdrs msg;
int rcvid;
if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {
return EXIT_FAILURE;
}
while (1) {
rcvid = MsgReceive(attach->chid, &msg, sizeof(msg), NULL);
/* name_open sends a connect message, must EOK this */
if (msg.type == _IO_CONNECT ) {
MsgReply( rcvid, EOK, NULL, 0 );
continue;
}
/* Some other QNX IO message received, reject */
if (msg.type > _IO_BASE && msg.type <= _IO_MAX) {
MsgError(rcvid, ENOSYS);
continue;
}
}
}
Workarounds:
Workaround:
To avoid this issue, the application needs to:
For example:
...
char *p;
p = mmap(0, __PAGESIZE, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, NOFD, 0);
msync(p, __PAGESIZE, MS_INVALIDATE);
mprotect(p, __PAGESIZE,
PROT_READ|PROT_WRITE|PROT_NOCACHE);
...
Workaround: To make your system more secure, change the permissions to 750 (read, write, execute for the user; read, execute for the group; no permissions for others).
Workaround: Use the file-descriptor I/O functions instead, or call ferror() to check for errors after each call to fwrite(), fprintf(), and so on.
Workaround: Filter out the _NTO_TRACE_COMM_SMSG events by doing one of the following:
TraceEvent( _NTO_TRACE_DELEVENT, _NTO_TRACE_COMM, _NTO_TRACE_COMM_SMSG);
The side effect of filtering out these events is that the IDE's System Profiler won't be able to show you any message-passing.
Workaround: Edit the header file and change this line:
#define ELF64_R_INFO(s,t) ((((Elf32_Xword)(s))<<32) | ((Elf64_Xword)((t)&0xffffffff)))
to this:
#define ELF64_R_IN