<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>My team is in the process of proposing and implementing some System property changes for JDK8 to help</div><div>identify specific processor&nbsp;characteristics and operating system platforms that might be needed in the future. &nbsp;</div><div>The immediate need is for the detection of&nbsp;arm hard-float ABI but the other properties are being added in</div><div>case we need them while&nbsp;the window is open.</div><div><br></div><div><br></div><div>OS.ARCH ADDITIONS</div><div>-----------------------------</div><br><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><tt>Embedded processors support a variety of CPU configurations that are not all binary compatible. &nbsp;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.<br>&nbsp;<br>Here's a specific example of this issue:<br>&nbsp;<br>There are three predominate binaries that we support Java for Linux ARM platforms on.<br>&nbsp;<br>1. Full soft-floatABI (No floating point instructions)<br>&nbsp;<br>2. VFP with softfp ABI (floating arguments are not passed in floating point registers)<br>&nbsp;<br>3. VFP with hard float ABI (floating pointer arguments passes in registers)<br>&nbsp;<br>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.<br>&nbsp;<br>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.<br>&nbsp;<br>Developers are requesting a way to identify which ABI Java is currently using in order to select a compatible native library when using JNI.<br></tt></td></tr></tbody></table><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">&nbsp;</td></tr><tr><td class="hb" style="font-style: normal; font-variant: normal; font-weight: bold; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><br></td></tr></tbody></table><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><br></td></tr><tr><td class="hb" style="font-style: normal; font-variant: normal; font-weight: bold; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">Solution</td></tr><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><tt>I propose adding a few new System properties that can be used to provide additional<br>information beyond the basic os.arch values for ARM as well as other processor<br>architectures. These properties will all be optional. Although these properties are<br>under the os name space, this was done to be consistent with the os.arch and other<br>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.<br>&nbsp;<br>os.arch.endian<br>---------------------<br>&nbsp;<br>This property if available will return either "big" or "little" depending on which endian mode the processor is executing in.<br>&nbsp;<br>os.arch.variant<br>---------------------<br>&nbsp;<br>This property, if available, is a free form description of the specific processor architecture. See examples below.<br>&nbsp;<br>os.arch.fpu<br>----------------<br>&nbsp;<br>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".<br>&nbsp;<br>os.arch.abi<br>----------------<br>&nbsp;<br>This property, if available, describes if the floating point calling convention is hardfloat or softfloat.<br>&nbsp;<br>os.arch.datamodel<br>---------------------------<br>&nbsp;<br>This property, if available, reports that the running process is executing in either 32 bit or 64 bit mode.<br>&nbsp;<br>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.<br>&nbsp;<br>EXAMPLES<br>------------------<br>&nbsp;<br>Here are some options for ARM processors (os.arch == arm)<br>&nbsp;<br>os.arch.endian { big, little}<br>os.arch.variant {cortex-a8, cortex-a9, armv5, armv6, armv7}<br>os.arch.fpu {vfp, neon, none}<br>os.arch.abi {softfloat, hardfloat}<br>os.arch.datamodel {32, 64}<br>&nbsp;<br>Here are some options for PowerPC (os.arch == ppc)<br>&nbsp;<br>os.arch.endian { big, little}<br>os.arch.variant {e500v2, e500mc, e600}<br>os.arch.fpu {booke, altivec, spe, none }<br>os.arch.abi {softfloat, hardfloat}<br>os.arch.datamodel {32, 64}</tt></td></tr></tbody></table><div><br></div><div>* although existing properties exist for datamodel and endian in the sun.* namespace, they are duplicated here</div><div>for consistency and to make it easier for developers to find.</div><div><br></div><div><br></div><div>OS.VARIANT ADDITIONS</div><div>------------------------------</div><div><br></div><div><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><tt>The current os.name System property does not provide sufficient information for identifying the specific platform that the Java runtime is running on. &nbsp;New platforms that are derived from existing platforms but have unique requirements may require special support. &nbsp;If someone were to port JDK8 to the Apple iOS platform, they could use much of the Mac OS X implemenation. &nbsp;This platform shares most of the same underlying operating system interfaces based on Darwin but some of the APIs are subsetted. &nbsp;A similar issue would arise in an attempt to support Java applications on Android operating systems which is a unique implementation of Linux.<br></tt></td></tr></tbody></table><br><table cellpadding="1" cellspacing="0" class="bt" style="border-collapse: collapse; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); font-size: 12px; line-height: 14px; position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">&nbsp;</td></tr><tr><td class="hb" colspan="10" valign="top" style="font-style: normal; font-variant: normal; font-weight: bold; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">Interface summary</td></tr><tr class="h" style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><td valign="top" style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">exported&nbsp;&nbsp;&nbsp;&nbsp;</td><td valign="top" style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">external&nbsp;&nbsp;&nbsp;&nbsp;</td><td valign="top" style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">property&nbsp;&nbsp;&nbsp;&nbsp;</td><td valign="top" colspan="4" style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">os.variant, os.variant.version</td></tr></tbody></table><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">&nbsp;</td></tr><tr><td class="hb" style="font-style: normal; font-variant: normal; font-weight: bold; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">Solution</td></tr><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><tt>I propose we add a new System property (os.variant) that will provide the specific OS implementation.<br>&nbsp;<br>Since Android is really a specific variant of Linux, os.name will report Linux while os.variant will report Android.<br>&nbsp;<br>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).<br>&nbsp;<br>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.<br>&nbsp;<br>These os.variant property will also be added to the "release" file located in the top level JRE directory as OS_VARIANT.<br></tt></td></tr></tbody></table><table cellpadding="0" cellspacing="0" style="font-family: arial, helvetica; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; "><tbody><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">&nbsp;</td></tr><tr><td class="hb" style="font-style: normal; font-variant: normal; font-weight: bold; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; ">Specification</td></tr><tr><td style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 1.2; font-family: arial, helvetica; "><tt>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.<br>&nbsp;<br>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&nbsp;the Java processes is currently executing on. &nbsp;This property is also optional.<br>&nbsp;<br>Examples of Operating System Platforms would be:<br>&nbsp;<br>Android<br>iPhone OS<br>Ubuntu<br>Debian<br>Raspbian</tt></td></tr></tbody></table><div><br></div></div><div><br></div></body></html>