My team is in the process of proposing and implementing some System property 
changes for JDK8 to help
identify specific processor characteristics and operating system platforms that 
might be needed in the future.  
The immediate need is for the detection of arm hard-float ABI but the other 
properties are being added in
case we need them while the window is open.


OS.ARCH ADDITIONS
-----------------------------

Embedded processors support a variety of CPU configurations that are not all 
binary compatible.  If a developer needs to provide native binaries for one or 
more of these configurations, they need a way of querying the platform 
constraints in order to load the appropriate JNI shared library.
 
Here's a specific example of this issue:
 
There are three predominate binaries that we support Java for Linux ARM 
platforms on.
 
1. Full soft-floatABI (No floating point instructions)
 
2. VFP with softfp ABI (floating arguments are not passed in floating point 
registers)
 
3. VFP with hard float ABI (floating pointer arguments passes in registers)
 
The first two (1,2) options are binary compatible at the ABI level. The only 
difference is the use of VFP instructions and if you are running on a processor 
that can execute them.
 
The third option is a new ABI and is incompatible with the older ABIs unless 
you are running on a system that supports multi-arch.
 
Developers are requesting a way to identify which ABI Java is currently using 
in order to select a compatible native library when using JNI.
 


Solution
I propose adding a few new System properties that can be used to provide 
additional
information beyond the basic os.arch values for ARM as well as other processor
architectures. These properties will all be optional. Although these properties 
are
under the os name space, this was done to be consistent with the os.arch and 
other
pre-existing properties. The new properties being define here define the mode 
in which the processor is being used by the running Java process rather than 
defining the capabilities of the OS. These are obviously related but the OS for 
example might be capable of running both 32 and 64 bit programs but the value 
returned for os.arch.datamodel will return 32 if the running process is a 32 
bit Java process.
 
os.arch.endian
---------------------
 
This property if available will return either "big" or "little" depending on 
which endian mode the processor is executing in.
 
os.arch.variant
---------------------
 
This property, if available, is a free form description of the specific 
processor architecture. See examples below.
 
os.arch.fpu
----------------
 
This property, if available, describes the specific floating point execution 
unit that is being used by the Java process. If floating point instructions are 
emulated, this property will return "none".
 
os.arch.abi
----------------
 
This property, if available, describes if the floating point calling convention 
is hardfloat or softfloat.
 
os.arch.datamodel
---------------------------
 
This property, if available, reports that the running process is executing in 
either 32 bit or 64 bit mode.
 
The "release" file located in the top level JRE directory should also be 
enhanced to include these new properties as OS_ARCH_ENDIAN, OS_ARCH_VARIANT, 
OS_ARCH_FPU, OS_ARCH_ABI and OS_ARCH_DATAMODEL.
 
EXAMPLES
------------------
 
Here are some options for ARM processors (os.arch == arm)
 
os.arch.endian { big, little}
os.arch.variant {cortex-a8, cortex-a9, armv5, armv6, armv7}
os.arch.fpu {vfp, neon, none}
os.arch.abi {softfloat, hardfloat}
os.arch.datamodel {32, 64}
 
Here are some options for PowerPC (os.arch == ppc)
 
os.arch.endian { big, little}
os.arch.variant {e500v2, e500mc, e600}
os.arch.fpu {booke, altivec, spe, none }
os.arch.abi {softfloat, hardfloat}
os.arch.datamodel {32, 64}

* although existing properties exist for datamodel and endian in the sun.* 
namespace, they are duplicated here
for consistency and to make it easier for developers to find.


OS.VARIANT ADDITIONS
------------------------------

The current os.name System property does not provide sufficient information for 
identifying the specific platform that the Java runtime is running on.  New 
platforms that are derived from existing platforms but have unique requirements 
may require special support.  If someone were to port JDK8 to the Apple iOS 
platform, they could use much of the Mac OS X implemenation.  This platform 
shares most of the same underlying operating system interfaces based on Darwin 
but some of the APIs are subsetted.  A similar issue would arise in an attempt 
to support Java applications on Android operating systems which is a unique 
implementation of Linux.

 
Interface summary
exported        external        property        os.variant, os.variant.version
 
Solution
I propose we add a new System property (os.variant) that will provide the 
specific OS implementation.
 
Since Android is really a specific variant of Linux, os.name will report Linux 
while os.variant will report Android.
 
In addition, we will add an os.variant.version that will report the specific 
version. In the Android example, os.version will report the underlying Linux 
version, but os.variant.version will report the Android specific version (2.6, 
4.1 for example).
 
For Apple, I propose to maintain the current Mac OS X value for os.name but use 
iPhone OS for the os.variant and the specific iPhone OS version for 
os.variant.version.
 
These os.variant property will also be added to the "release" file located in 
the top level JRE directory as OS_VARIANT.
 
Specification
A new os.variant String property will be optionally available in a running Java 
process to identify which Operating System Platform the Java process is running 
on.
 
A new os.variant.version String property will be available in a running Java 
process to identify the specific version of the Operating System Platform that 
the Java processes is currently executing on.  This property is also optional.
 
Examples of Operating System Platforms would be:
 
Android
iPhone OS
Ubuntu
Debian
Raspbian


Reply via email to