Home
Developer Resources
Technical Articles

QNX Technical Articles

QNX® Neutrino® Core OS 6.3.2 Release Notes

QNX® Neutrino® Core OS 6.3.2

Date of this edition: August 16, 2006

Target OS: QNX® Neutrino® 6.3.0 SP1 or SP2

Host OS:

  • Microsoft Windows XP SP1 or SP2, 2000 SP4, or NT SP6a
  • Sun Solaris 7, 8, 9, or 10
  • QNX® Neutrino® 6.3.0 SP1 or SP2
  • Linux Red Hat 8, 9, or Enterprise WS 3 or 4

Contents

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 the most up-to-date version of these release notes, go to our website, www.qnx.com, log into your myQNX account, and then go to the Download Center.


Caution: Make sure that Plug and Play OS is disabled in the BIOS before you run QNX Neutrino self-hosted.

What's new in the QNX Neutrino Core OS 6.3.2?

The QNX Neutrino Core OS 6.3.2 is an upgrade for QNX Neutrino 6.3.0 with Service Pack 1 or 2 that updates the kernel (procnto), libc, various utilities and daemons, and the system headers. On Windows, Linux, and Solaris hosts, it updates the development system that you use to create applications that you can run on a QNX Neutrino runtime system. On Neutrino hosts, it updates both the development and the runtime systems.

Because of the upgrades to libc and the system headers, once you've installed 6.3.2, you can no longer build code against the 6.3.0 headers and libraries. The value of _NTO_VERSION changes from 630 to 632. If you want to (natively) build code and run the executables using 6.3.0 and 6.3.2, you have to make separate installations on different partitions or machines. Code compiled with 6.3.0 SP1 or SP2 will run on a 6.3.2 system.

The following sections describe the main new features in the QNX Neutrino Core OS 6.3.2:


Note: You'll find a list of fixes at the end of this document.

What's new: Kernel

  • Threads now have names, which can make debugging easier. (Ref# 27085)

    The following commands now support thread names:

    • pidin now displays the thread names
    • dumper maintains the thread-name information in core files

    Note: The IDE can't currently display the thread names.

  • We've improved the performance of message-passing for short (fewer than 256 bytes) single and multipart messages. This has improved the performance for process-to-process messages in this size range by 15-30% as compared to that under QNX Momentics 6.3.0 SP2.

The OS images that we ship start procnto with the -v option, so that the kernel provides you with more information when a signal terminates a process.

Virtual memory manager

The QNX Neutrino Core OS 6.3.2 includes a completely rearchitected virtual memory (VM) manager. This provides significant benefits and functionalities, as follows:

  • consistent POSIX mmap() behavior across all supported architectures
  • partial munmap() is now supported on all processor families
  • POSIX memory-mapped files are now supported
  • POSIX memory locking is supported
  • POSIX typed memory is supported

Here are more details:

  • The new manager implements tighter error checking, so programs that worked with earlier revisions of the OS might encounter errors now.
  • In some cases, the new code may delay memory-manager operations until a page is referenced, which could affect some code. You can use the POSIX mlock() or mlockall() functions to disable this behavior.
  • If a thread (e.g. a device driver) does a ThreadCtl(_NTO_TCTL_IO...), the memory manager super-locks the memory referenced by the process to ensure that a page fault never occurs during periods while interrupts are disabled, or an ISR is executing.
  • With POSIX support for memory-mapped files, the msync() function now performs its intended operation of writing changes in the mapped memory back to the underlying file. This has an interaction with the QNX Neutrino extension of having the function flush or invalidate the data cache (via the MS_SYNC or MS_INVALIDATE flags respectively). To get the previous behavior of just data cache operations, add the new MS_CACHE_ONLY flag to the call in addition to MS_SYNC or MS_INVALIDATE.
  • The mmap() flag MAP_NOSYNCFILE continues to be supported, but if the same region in a file is mapped twice, once with MAP_NOSYNCFILE and once without, the memmgr code may not be able to tell whether a change was made through the MAP_NOSYNCFILE mapping or not, and thus write out changes that weren't intended.
  • Since a process that has requested I/O privileges (by calling ThreadCtl(_NTO_TCTL_IO,...)) can't allow page faults, the memory manager is unable to track individual page modifications. This means that although memory-mapped files obey the POSIX semantics, the memory-manager code may write more pages than it needs to back to the underlying file, and may write the same page multiple times.
  • There's a new function:
    int munmap_flags(void *addr, size_t len, unsigned flags);
        

    The flags have the following allowable values:

    0
    Behave the same as munmap().
    UNMAP_INIT_REQUIRED
    POSIX initialization of the page to all zeros is required the next time the underlying physical memory is allocated.
    UNMAP_INIT_OPTIONAL
    Initialization of the underlying physical memory to zeros on its next allocation is optional.
  • The mmap() function has a new flag, MAP_NOINIT. When specified, the POSIX requirement that the memory be zeroed is relaxed. This allows for faster starting, but can open a security vulnerability. By default, the kernel initializes the memory.

    The physical memory being used for this allocation must have been previously freed with UNMAP_INIT_OPTIONAL for this flag to have any effect.

  • The procnto command line now has an -mmemmgr_configuration option. The memmgr_configuration string is a sequence of configuration options to enable (or if preceded with a ~ character, disable) memory-manager aspects. The configuration options include:
    i
    munmap() acts as if UNMAP_INIT_REQUIRED were specified (the default).
    ~i
    munmap() acts as if UNMAP_INIT_OPTIONAL were specified.
    l
    (“el”) Lock all memory; act as if mlockall(MCL_CURRENT|MCL_FUTURE) were specified at the start of every program.
    ~l
    Don't lock all memory (the default).
    L
    Superlock all memory; act as if ThreadCtl(_NTO_CTL_IO, 0) were specified at the start of every program. This affects only the locking of memory; programs don't actually get I/O privileges.
    ~L
    Don't superlock all memory (the default).
    b
    Enable backward compatibility (the default).

    We fixed some bugs when we redesigned the memory manager. In some cases, this could make application code that ran in earlier versions of the OS now fail, if they inadvertently depended on the buggy behavior. The b configuration option attempts to make the new memory manager act like the old one in terms of some bugs, so that old code can continue to work until you can correct the application.


    Note: With 6.3.2, the b option is on by default. In the next major release of the OS, we intend to turn it off by default.

    Currently, the only thing it affects is the behavior of the MAP_BELOW16M flag to mmap(). Previous releases didn't respect this flag on non-x86 architectures. With backwards compatibility that continues to be the case. Without backwards compatibility, MAP_BELOW16M is honored on all architectures, which could cause a mmap() that worked before to now fail.

    ~b
    Disable backward compatibility.
  • The pthread_attr_getstackprealloc() and pthread_attr_setstackprealloc() functions have been added to get and set the size of memory to preallocate for a MAP_LAZY stack. By default, the system allocate 4 KB of physical memory for the initial stack reference. These functions let you change that if you know that a thread is going to require more stack space. Semantically, there will be no difference in operation, but the memory manager may be able to arrange to use a bigger page-table entry for the stack if it knows up-front that more memory will be needed.

What's new: Libraries and header files

System headers
We've changed the following header files to make them more POSIX_compliant:
  • <limits.h> (Ref# 26160)
  • <setjmp.h> (Ref# 26162)
  • <stdlib.h> (Ref# 26163)
  • <stdint.h> (Ref# 26166)
  • <confname.h> (Ref# 26167)
  • <wordexp.h> (Ref# 26171)
<sys/platform.h>
We've removed the obsolete XBS_ILP32_* symbols and replaced them with the _XBS5_ILP32_* equivalents. If you use the old definitions, you should update your code. (Ref# 26159)
ENDIAN_*()
We've added PPC-specific versions of these macros. (Ref# 22140)
FILE* I/O functions
If a FILE* stream is placed into unbuffered mode (so theoretically all writes should physically happen immediately and any failures be detected), the low-level functions correctly indicate the errors, but the FILE*-oriented output functions (fwrite(), fprintf(), etc.) formerly didn't set errno. They now do. For example, if there's no space left on the disk, these functions now correctly indicate that an error has occurred. (Ref# 19598)
fork()
  • Physically contiguous areas are now preserved across a fork(). If one process does a mmap() with MAP_ANON|MAP_PHYS to obtain a physically contiguous memory (drivers and the like), and then forks, the child process now enforces contiguous areas when copying the parent's mappings. (Ref# 17531)
  • If you do a mmap() with MAP_ANON|MAP_SHARED with permissions of PROT_NONE, and use mprotect() to change a single page to PROT_READ|PROT_WRITE, and then fork(), the permissions of the MAP_ANON|MAP_SHARED mapping are now correctly set per-page. (Ref# 24585)
getgrouplist()
The list of groups that this function creates no longer includes the group ID that you pass as the basegid argument. (Ref# 15547)
iofunc_funcs_t
The iofunc_funcs_t structure is now larger, and the _IOFUNC_NFUNCS count has increased. If you use memset() to initialize this structure, the change in size won't affect your resource managers.

If your resource managers use this callout table to install their own OCB allocation routines, and you didn't use memset(), recompiling your resource managers will cause the new callouts (for OCB locking) to be used. The libc library is backwards-compatible in that resource managers that haven't been recompiled won't attempt to use the new callouts, and a NULL callout means to use the default/old behavior.

pthread_getname_np(), pthread_setname_np()
You can use these functions to get and set the name of the threads in your applications.
remove()
If path names a directory, remove(path) is now equivalent to rmdir(path) instead of unlink(path), due to a change in POSIX. (Ref# 19534, 28319)
sigevent
Future versions of the library might use hidden bits in the sigev_notify member of the sigevent structure. To avoid problems in the future, don't compare this member directly to a constant; use the new SIGEV_GET_TYPE() macro. For example, instead of:
if( my_event.sigev_notify == SIGEV_PULSE) 
  

use:

if( SIGEV_GET_TYPE(&my_event) == SIGEV_PULSE) 
  
siginfo_t
The siginfo_t structure now has a new field, si_bdslot. When a signal is caused by a program exception (SIGSEGV, SIGILL, etc.), the field is nonzero if the faulting instruction is in a branch delay slot on architectures with them (MIPS, SH).

Note:
  • This is currently implemented only for MIPS.
  • Earlier versions of procnto left this field as a random value, so code should check the procnto version number before examining the field.

What's new: Utilities

on
This utility now supports these new options (Ref# 13645):
  • -R runmask — set the CPU affinity to runmask. You can use this option multiple times to specify masks that are more than 32 bits long.
  • -C cpunum — set the CPU Affinity to cpunum, where the first CPU is 0. You can use this option multiple times.

If you use both the -C and -R options or multiple instances of them, the resultant mask is the bitwise ORing of all -C and -R options. (Ref# 28501)

pidin
This utility now supports these new formatting codes:
  • H — display scheduling-specific information for each thread
  • h — display the thread name
  • i — display the runmask

and these new arguments:

  • sched — display useful scheduling parameters for each thread
  • extsched — display details of the active extended scheduler configuration
  • fds —: show information about the process's file descriptors
  • rmasks — display the process's runmask.

(Ref# 27982, 28098)

qconfig
This utility now displays more information about the products you've installed:
  • The new -b option shows only the installed baseline product, e.g. QNX Momentics 6.3.0 SP1 or SP2. The output is the same as the old qconfig command without any options.
  • The new -p option shows only the installed product updates, e.g. the QNX Neutrino Core OS 6.3.2.
  • The new -a option shows all products (baseline and product updates) in machine-readable form.
  • Without any options, qconfig lists all products in human-readable form.
  • qconfig no longer lists 6.3.0 SP1 and SP2 as separate installations.

(Ref# 29245, 29579)

slay
  • The meanings of these options have changed somewhat:
    • -R runmask — set the CPU affinity to runmask. You can use this option multiple times to specify masks that are more than 32 bits long.
    • -C cpunum — set the CPU Affinity to cpunum, where the first CPU is 0. You can use this option multiple times.

    If you use both the -C and -R options or multiple instances of them, the resultant mask is the bitwise ORing of all -C and -R options. (Ref# 28083)

  • There's a new -i option that also sets the inherit mask when used in conjunction with -R or -C. (Ref# 27716, 29576)
  • When you use -R or -C without -T, all threads in the specified process or processes are now affected. Previously -R or -C would fail without -T (Ref# 27716)
  • -P without -T now affects all threads in the specified process or processes. Previously it affected only thread 1. (Ref# 27817)
  • You can now identify the processes by name or ID. By default, slay matches either name or pid; you can use the new -m name or -m pid option to restrict the match. (Ref# 28890)
tracelogger
If you specify a duration for the log (with the -s option), then the number of iterations logged is once again unlimited instead of being set to 32. (Ref# 26823)

What's new: Startup

  • All startup-* commands have a new command-line option that lets you control the flags field in the cpuinfo section of the system page:
    -F value
    OR the flags field with value.
    -F ~value
    AND the flags field with ~value.
  • We added support for the x86 NX (no-execute) page table bit. On processors that support it (AMD64, IA-32e), mmap()'d memory no longer lets you execute instructions in that memory unless you've specified the PROT_EXEC permission flag. If not specified, a SIGSEGV occurs.

    Note: You must enable page-table extensions (with the -x startup option) in order for the NX bit to be effective.

    You can turn off support by putting -F ~0x4000 on the startup command line.

Known issues

The QNX Neutrino Core OS 6.3.2 contains known issues in these areas:


Note: We're actively investigating all known issues. See also the release notes for the version of QNX Momentics (6.3.0 SP1 or SP2 ) that you've installed on your system.

Key issues you should know about

  • Some calls to mmap() with MAP_ANON or MAP_LAZY may be slower with the QNX Neutrino Core OS 6.3.2 than with earlier releases on certain platforms. The difference is more pronounced for small sizes (e.g. 4 KB). For larger sizes (more than 32 KB), performance may be the same or better with 6.3.2. It might take longer to start applications and create threads. In part, this is due to the virtual memory manager's more complete data structures. (Ref# 26280, 27831, 29341)
  • The kernel might crash on the Freescale Power Quicc III board when there's a heavy networking load. This problem occurs only when the core-to-system clock ratio is set to 2:1. The problem also exists with earlier releases of QNX Neutrino. We're still determining the root cause. (Ref# 27079)
  • The change in the memory manager for the Core OS 6.3.2 generates information that causes the Process Memory Map view in the IDE (6.3.0 SP2 and earlier) to misclassify memory maps. In general, HEAP-type allocations are classified as OBJECTs. The memory block size and address information are correctly displayed. (Ref# 29748)
  • procnto and the underlying filesystem may become deadlocked when you use read/write memory-mapped files with multiple threads, under the following circumstances:
    • If you have multiple writable mappings to the same region of the file (in different processes, for example), then calling msync() with MS_SYNC can cause a deadlock.
    • If you have multiple mappings to files that use the same underlying resource manager, and these mappings are first referenced simultaneously (e.g. the first reference in a program), there is the potential for a deadlock if the number of simultaneous first references exceeds the number of threads in the underlying resource manager.

    (Ref# 29596, 29440, 29380)

Known issues: Kernel

procnto
  • Multiple concurrent calls to shm_unlink() for the same shared memory object can cause kernel corruption and crash the kernel. (Ref# 18121)
  • We've observed some memory corruption for uncacheable memory with the Renesas BigSur (SH7751) board. It might be a problem with the hardware. (Ref# 27741)
  • Some calls to mmap() with MAP_ANON or MAP_LAZY may be slower with the QNX Neutrino Core OS 6.3.2 than with earlier releases on certain platforms. The difference is more pronounced for small sizes (e.g. 4 KB). For larger sizes (more than 32 KB), performance may be the same or better with 6.3.2. It might take longer to start applications and create threads. In part, this is due to the virtual memory manager's more complete data structures. (Ref# 26280, 27831, 29341)
  • A potential deadlock exists in the malloc library when you're using vfork() and exec() if the vforked child receives a termination signal while holding the malloc library mutex. (Ref# 28161)
  • If you're in a directory on a remote machine, and you pipe the output of a command to xargs, and you redirect the output to a file, you get a “cannot fork” error. For example:
    cd /net/remote_machine/tmp
    find . -type f | xargs grep FAIL > report.txt
    /bin/sh: cannot fork - try again
        

    It seems to be a problem with permissions. Piping the output of xargs to less works. (Ref# 29834)

    Workaround: Log in as root.

  • procnto and the underlying filesystem may become deadlocked when you use read/write memory-mapped files with multiple threads, under the following circumstances:
    • If you have multiple writable mappings to the same region of the file (in different processes, for example), then calling msync() with MS_SYNC can cause a deadlock.
    • If you have multiple mappings to files that use the same underlying resource manager, and these mappings are first referenced simultaneously (e.g. the first reference in a program), there is the potential for a deadlock if the number of simultaneous first references exceeds the number of threads in the underlying resource manager.

    (Ref# 29596, 29440, 29380)

  • On PowerPC and SH4, if an msync() operation (with MS_INVALIDATE) is performed on a lazy mapping (a mmap() of anonymous memory with MAP_LAZY), the msync() causes the lazy pages to get allocated and mapped in. (Ref# 29647)
procnto-booke
  • The kernel might crash on the Freescale Power Quicc III board when there's a heavy networking load. This problem occurs only when the core-to-system clock ratio is set to 2:1. The problem also exists with earlier releases of QNX Neutrino. We're still determining the root cause. (Ref# 27079)
mq
If you use the instrumented kernel to trace events while you're using mq, emitting _NTO_TRACE_COMM_SMSG communication-class events might cause your application to crash with an EFAULT when it calls mq_send(). We've encountered this problem on SHLE boards. (Ref# 38082)

Workaround: Filter out the _NTO_TRACE_COMM_SMSG events by doing one of the following:

  • On the command line, filter out all COMM-class messages by passing the -F6 option to tracelogger.
  • In your application, filter out COMM_SMSG messages by calling:
    TraceEvent( _NTO_TRACE_DELEVENT, _NTO_TRACE_COMM, _NTO_TRACE_COMM_SMSG);
        
  • In the IDE, filter out COMM_SMSG messages with qconn by selecting the Class Specific mode in the System Profiler Configuration dialog, then selecting the Communication tab, selecting the Event Specific mode, and then disabling Send Message.

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.

Known issues: Libraries and header files

ENDIAN_*()
This release includes inline assembly optimization on some platforms for the ENDIAN_*() (byte-swapping) routines.

These routines are macros that determine the best method to perform the byte-swapping (as inline math using shift-and-mask operations that may be constant-folded at compile time, or as inline assembly using native CPU instructions at runtime). Due to a bug in the gcc 2.95.3 __builtin_constant_p() implementation, code compiled with gcc 2.95.3 always selects the assembly variant.

This means that if you use an ENDIAN_*() expression as a static initializer, it fails to compile. For example, if you use gcc 2.95.3 to compile the following code:

static uint32_t numbers[] = {
ENDIAN_LE32(0x39c39c39),
ENDIAN_BE32(0x39c39c39)
};
  

you'll get an initializer element is not constant compile error. (Ref# 27099)

Workaround: Do one of the following:

  • If you're defining the structure inside a function body, remove the static qualifier, which causes the data structure to be initialized at runtime rather than compile time, at which stage inline assembly is valid.
  • Compile affected code with gcc 3.3.5, which has a fixed __builtin_constant_p() that allows detection of a constant expression and implements the byte-swapping with shift and mask operations. You can choose gcc 3.3.5 by specifying the appropriate -V compiler version to cc or gcc, or by setting GCC_VERSION=3.3.5 within a Makefile or common.mk environment.

Note: This affects only static initializers containing ENDIAN_*() expressions, and doesn't apply to any runtime use of these ENDIAN_*() macros.

libmalloc
The debug malloc library no longer works on SH platforms. (Ref# 27639)

Workaround: Download the Debug Malloc Library Patch (Patch ID 155) from our website.

Known issues: Filesystems

/dev/shmem
Large block writes to /dev/shmem are slower than in the last release. (Ref# 26280)

Known issues: Networking

io_net
On MIPSLE Malta boards, io-net may crash with a SIGBUS signal when using the pcnet network driver. This is due to a bug in the pcnet driver. (Ref# 28177)

Workaround: Download the Network Driver Patch (Patch ID 153) from our website.

Known issues: Utilities

slay
Trying to slay something on a node in a domain other than your own will fail. For example, if you're in domainX, and you try to slay something on node foo in domainY, you'll see this:
# slay -n foo.domainY process_name
slay: Unable to find process 'process_name'
  

(Ref# 29840)

Known issues: IDE (Professional Edition only)

  • The kernel now supports thread names (Ref# 27085), but the IDE can't currently display them.
  • The change in the memory manager for the Core OS 6.3.2 generates information that causes the Process Memory Map view in the IDE (6.3.0 SP2 and earlier) to misclassify memory maps. In general, HEAP-type allocations are classified as OBJECTs. The memory block size and address information are correctly displayed. (Ref# 29748)

Known issues: Startup

  • A situation exists on PowerPC-based boards with less than 256 MB of RAM whereby a machine check can be received. This is due to a speculative load (for a branch not taken) from a memory address beyond the extent of physical RAM but within the first 256 MB window. This condition has been detected only on a Freescale MGT5200 Lite with 64 MB of memory and only during the execution of a specific sequence of regression and benchmark tests on the 6.3.2 kernel. The possibility of occurrence has existed in all previous Neutrino releases; however, to best of our knowledge, no such failures have been reported. (Ref# 28335)

    Workaround: A requirement of startup code for PowerPC-based boards is to configure the DBAT0 register. The register is currently configured for a minimum size of 256 MB. Initializing DBAT0U[BL] to the exact (power of 2) size of physical memory will eliminate this situation from producing a machine check exception. Alternatively, if possible on the particular board, disabling the assertion of TEA will also prevent the errant (speculative load for a branch not taken) machine check when this specific situation occurs. This option should be considered in the context of the entire system. Please contact QNX for specific questions about these and other workarounds

Known issues: Uninstalling

On self-hosted Neutrino systems, if you uninstall the QNX Neutrino Core OS 6.3.2, the uninstaller rebuilds the boot image in /.boot and tells you to rebuild the image manually if you use a custom image. If you rebuild your boot image at this point, mkifs will crash. (Ref# 30079)

Workaround: After the uninstaller has rebuild the boot image, do the following:

  1. If you need a non-DMA image, copy the one that the uninstaller has just rebuilt:
    cp /boot/fs/qnxbase.ifs /.boot
      
  2. Reboot your machine.
  3. Rebuild your custom image:

    mkifs your_build_file /.boot

  4. Reboot your machine again.

Getting started with the documentation

After you've installed your development suite, you'll find an extensive set of online documentation in HTML format. Go to the help menu item (e.g. in Windows XP: All Programs-->QNX Momentics-->Documentation) or look under the following directory:

${QNX_TARGET}/usr/help/product/momentics/bookset.html

This “roadmap” page contains links to the various HTML booksets that accompany the OS (e.g. System Architecture, Programmer's Guide, Library Reference, Utilities Reference, etc.).

You'll find the installation and release notes in the base_directory/install/ntocore/6.3.2 directory. To determine your base_directory, see the installation notes.


Note: For the most up-to-date version of the installation and release notes, go to our website, www.qnx.com, log into your myQNX account, and then go to the Download Center.

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.


Note: Coexistence of 6.3 and 6.2.1 is supported only on Windows and Solaris hosts.

Technical support

If you have any questions, comments, or problems with a QNX product, please contact Technical Support. For more information, see the How to Get Help chapter of the online version of the Welcome to QNX Momentics guide, or visit our website, www.qnx.com.


Note: The telephone numbers and email addresses for Technical Support in the printed version of the Welcome to QNX Momentics guide are now obsolete. (Ref# 26700)

List of fixes

The problems fixed in the QNX Neutrino Core OS 6.3.2 include the following:

Change Ref #
A non-root process can no longer change the shared portion of the libc shared library. 1191
After a fork(), the parent and child processes now correctly share the code areas that aren't already in the libc shared library. 1192
ftruncate() now lets you shrink a shared memory object. 1242
mmap() no longer sets errno to values that don't conform to POSIX. 1611
Calling exec() from more than one thread at the same time, no longer causes some threads to be blocked on procnto forever. 1631
Processes can no longer use spawn() with the SPAWN_SETGROUP flag to make the new process join a process group that isn't in the same session as the calling process. 1671
mprotect() now correctly fails and sets errno to EACCESS if you try to specify PROT_WRITE on shared memory that was opened and mapped in as read-only. 1748
mprotect() now correctly fails and sets errno to ENOMEM if the addresses in the specified range are outside the range allowed for the address space of a process, or specify one or more pages that aren't mapped. 1749
If a process does a pthread_mutex_lock() on a mutex owned by another thread, causing a priority boost, and then the blocked thread is then forcibly unblocked (pthread_cancel()), the priority is now correctly unboosted. 9224
Booting no longer fails when you pass nothing to display_msg in your system's start script. 11059
You can now specify the runmask for any binary by using the on command. 13645
fflush(), like rewind() and fseek(), lets you switch between read and write modes, as per the ANSI specification. 14053
If you run low on memory on an SHLE board, the board no longer hangs when you try to create threads. 16390
procnto now correctly applies the RLIMIT_STACK limit only to the stack of a process's main thread. 16902
procnto: the virtual memory total size is now maintained when you fork() a process. 17163
procnto no longer crashes during a VM mmap()/munmap() load test 17250
procnto now supports a partial munmap() of a region on all targets. 17251
procnto now preserves the MAP_PHYS flag on the parent's mapped areas. When you call fork(), it passes the appropriate flags to do the child's mapping. 17531
procnto: mmap() no longer returns NULL (mapping of page zero) for anonymous mappings. 17565
If asyncmsg_get() is blocked, and then a call to asyncmsg_put() wakes it up, it now gets a message. 17631
opendir() no longer leaks file descriptors after an exec(). 19223
If path names a directory, remove(path) is now equivalent to rmdir(path). 19534, 28319
getgroups() now correctly sets errno to EINVAL when the given array is too small. 19556
fcntl(F_GETLK) now gets the correct l_len value. 19557
fcntl() now correctly sets errno to EBADF if you pass it a closed file descriptor. 19558
If you call fcntl() with an F_GETLK or F_SETLK command, the function now checks the range of l_type. 19559
fcntl(F_DUPFD) now correctly fails if there are OPEN_MAX file descriptors currently open. 19597
fwrite() now correctly propagates underlying write errors to the higher-level functions. 19598
When any stop signal (SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU) is generated for a process, any pending SIGCONT signals for that process are now correctly discarded. When SIGCONT is generated for a process, all pending stop signals for that process are also correctly discarded. 19647
SIGCONT is now correctly delivered to user code. 19691
The /dev devices now support the F_GETFL flag for fcntl(). 19700
SIGCONT now correctly makes a stopped process continue. 19822
pidin's error messages are now more meaningful. 20266
On x86 targets, fork() no longer fails if the parent has PROT_NONE pages 20361
mmap(MAP_SHARED | MAP_ANON | MAP_PHYS) now correctly allocates physically contiguous memory. 20478
A new macro, LOGIN_NAME_MAX has been defined in <limits.h>. The passwd, login, and su utilities now use this macro to check the length of a user's name (login and su truncate the string, and passwd fails with appropriate notification). The current value is 256 characters. 20589
The access() function now includes supplementary groups when it checks permissions. 20641
SIGHUP is no longer lost if the session leader calls procmgr_daemon(). 20745
mphys() now properly tells the difference between PROT_NONE and unallocated memory. 20842
The POSIX asynchronous I/O functions (aio_*) are now implemented. 20996
The freopen() function now first attempts to flush the stream and close any file descriptor associated with the stream. The original stream is now correctly closed whether or not the subsequent open succeeds. 21042
You can now specify a SIG_IGN action for SIGCONT. This still unblocks the process. 21043, 21344
execlp() now correctly sets errno to ENOENT if you pass it an empty string for the command. 21045
execlp() now correctly interprets a trailing colon (:) in your PATH as meaning the current directory. 21046
Setting SIG_DFL now correctly cancels a pending signal. 21084
The creation and modification times are no longer updated prematurely when you open a FIFO. 21170
<sys/sem.h> no longer declares the unimplemented semctl(), semget(), and semop() functions. 21355
On SH4 targets, entering a signal handler during a single-precision operation no longer causes a SIGSEGV. 21529
pidin now correctly reports the stack size for all the threads in a process. 21741
If you try to use dlopen() in a statically-linked application, dlopen() now returns NULL instead of crashing with a SIGSEGV. 21757
The MAP_NOX64 flag for mmap() is now honored on SH4 targets. 21783
If you create a timer, then use TimerSettime() to set it with TIMER_ABSTIME to a time in the past, the timer now fires immediately instead of on the next timer tick. 22026
<gulliver.h> now includes PPC-specific versions of the ENDIAN* macros. 22140
<cpuinline.h> now provides fast 16-, 32-, and 64-bit integer swapping for SH4 targets. 22224
A missing parenthesis has been added to the definition of __PASS_AS_FLOAT() in <sh/platform.h>. 22290
The libc and inline versions of alloca() now both set errno correctly. 22403
The priority of a thread that was boosted by a mutex lock is now correctly lowered again after a timeout. 22495
_PATH_SHELLS is now defined in <paths.h>. 22573
The priority of a thread that was boosted by a mutex lock is now correctly lowered after a timeout. 22595
Floating-point emulation no longer changes errno unexpectedly. 22976
Calling ftruncate() for a file in /dev/shmem no longer fails when more than one file descriptor exists. 23050
Spurious replies no longer cause the kernel to assert. 23091
The system no longer hangs if you pass a bad pointer as the old argument to ClockAdjust(). 23229
The iofunc_chown() handler now correctly follows the POSIX specification for POSIX_CHOWN_RESTRICTED. 23270
pthread_join() now correctly never returns EINTR after a thread receives a signal. 23337
If you're debugging a program in the IDE, and you add a watchpoint setting the value to be an address, and then click the Go button, procnto no longer crashes on the target. 23480
Using pipelines or setpgid() on a terminating process no longer makes procnto-smp become deadlocked. 23481
Processes can now terminate, even if they have /proc/self/as open. 23567
pipe no longer faults with heap issues on x86 SMP systems. 23752
<sys/link.h> now defines time_t if necessary, so that it compiles successfully if you include only it in an application. 23770
SELECT_FLAG_REARM now works properly in select_attach() 23936 (Ticket ID 68474)
You no longer get a warning about adding parentheses when you call va_arg() on SH targets when you compile with gcc 2.95.3. 24146
localtime_r() is now thread-safe. 24235
The kernel now does only atomic updates to the thread and timer vectors. 24427
pathconf(_PC_SYMLOOP_MAX) queries now work. 24486
shm_unlink() now correctly sets errno to ENOENT instead of ENXIO if the named shared memory object doesn't exist. 24761
mkifs no longer faults if you run it from a directory that has been removed. 24968
If a process is running at a low priority and then changes to a high priority (either due to the sporadic scheduler or to self-boosting), a trace event is now emitted. 25233
In the instrumented kernel, the size of data passed in wide mode to the thread state event handler is now correctly measured in bytes. 25487
procnto's crash messages now include the version of the OS. 25502
It's now possible to create identical image filesystems on different machines with mkifs. 25584
The procnto filesystems now correctly perform EBADF read/write checks. 25631
In /proc, the as file no longer has the same inode number as its parent directory. 25783
We now provide a C++ prototype for the overloaded version of the abs() function for long integers. 26023
We've removed the obsolete XBS_ILP32_* symbols from <sys/platform.h> and replaced them with the _XBS5_ILP32_* equivalents. 26159
We've changed the <limits.h>, <setjmp.h>, <stdlib.h>, <stdint.h>, <confname.h>, and <wordexp.h> header files to make them more POSIX_compliant. 26160, 26162, 26163, 26166, 26167, 26171
We've made some corrections to the usage message for tracelogger. 26651
The two implementations of message queues, mqueue and mq can now coexist. 26744
For tracelogger, if you specify a duration for the log (with the -s option), then the number of iterations logged is once again unlimited instead of being set to 32. 26823
slogger no longer causes priority inversion when it's preempted after a low-priority reader calls MsgCurrent(). 26878
ENDIAN_LE32() now works properly on PPC targets. 26883
Calling munmap() a second time on the same range no longer fails with EINVAL. 26969 (Ticket ID 70476)
Threads now have names. 27085
msync() now correctly fails and sets errno to EBUSY if some or all of the addresses in the specified range are locked and you've set MS_INVALIDATE in the flags. 27200
msync() now correctly fails and sets errno to ENOMEM if the addresses in the specified range are outside the range allowed for the address space of a process or specify one or more pages that aren't mapped. 27201
Specifying a very long name for the slay -n option no longer causes a buffer overrun. 27526
The prototypes for slogf() and vslogf() now specify __attribute__((format (printf, ..., so you now get warnings when the argument lists don't match the format string. 27659
slay has a new -i option that also sets the inherit mask when used in conjunction with -R or -C. 27716
Using vfork() no longer causes infrequent shutdowns of procnto-smp on x86 targets. 27761
On MIPS targets, the kernel no longer uses the 64-bit memcpy() routines if MIPS_CPU_FLAG_64BIT is set in cpuflags. 27829
<arm/smpxchg.h> now has the appropriate __BEGIN_DECLS and __END_DECLS lines. 28202
pidin fds now shows socket-level information. 28261
If you make two asynchronous connections from a process, the messages that you send with asyncmsg_put() on the second connection are now correctly received. 28324
You can now use the process name or ID to identify processes to slay; for more information, see What's new: Utilities,” above. 28890
The qconfig utility now displays more information about the products you've installed. For more information, see the What's new: Utilities section, above. 29245, 29579