# # $Id$ # This file discusses SPARC specific issues which are important to this port. The primary topics in this file are: + Global Register Usage + Stack Frame + EF bit in the PSR Global Register Usage ===================== This information on register usage is based heavily on a comment in the file gcc-2.7.0/config/sparc/sparc.h in the the gcc 2.7.0 source. + g0 is hardwired to 0 + On non-v9 systems: - g1 is free to use as temporary. - g2-g4 are reserved for applications. Gcc normally uses them as temporaries, but this can be disabled via the -mno-app-regs option. - g5 through g7 are reserved for the operating system. + On v9 systems: - g1 and g5 are free to use as temporaries. - g2-g4 are reserved for applications (the compiler will not normally use them, but they can be used as temporaries with -mapp-regs). - g6-g7 are reserved for the operating system. NOTE: As of gcc 2.7.0 register g1 was used in the following scenarios: + as a temporary by the 64 bit sethi pattern + when restoring call-preserved registers in large stack frames RTEMS places no constraints on the usage of the global registers. Although gcc assumes that either g5-g7 (non-V9) or g6-g7 (V9) are reserved for the operating system, RTEMS does not assume any special use for them. Stack Frame =========== The stack grows downward (i.e. to lower addresses) on the SPARC architecture. The following is the organization of the stack frame: | ............... | fp | | +-------------------------------+ | | | Local registers, temporaries, | | and saved floats | x bytes | | sp + x +-------------------------------+ | | | outgoing parameters past | | the sixth one | x bytes | | sp + 92 +-------------------------------+ * | | * | area for callee to save | * | register arguments | * 24 bytes | | * sp + 68 +-------------------------------+ * | | * | structure return pointer | * 4 bytes | | * sp + 64 +-------------------------------+ * | | * | local register set | * 32 bytes | | * sp + 32 +-------------------------------+ * | | * | input register set | * 32 bytes | | * sp +-------------------------------+ * * = minimal stack frame x = optional components EF bit in the PSR ================= The EF (enable floating point unit) in the PSR is utilized in this port to prevent non-floating point tasks from performing floating point operations. This bit is maintained as part of the integer context. However, the floating point context is switched BEFORE the integer context. Thus the EF bit in place at the time of the FP switch may indicate that FP operations are disabled. This occurs on certain task switches, when the EF bit will be 0 for the outgoing task and thus a fault will be generated on the first FP operation of the FP context save. The remedy for this is to enable FP access as the first step in both the save and restore of the FP context area. This bit will be subsequently reloaded by the integer context switch. Two of the scenarios which demonstrate this problem are outlined below: 1. When the first FP task is switched to. The system tasks are not FP and thus would be unable to restore the FP context of the incoming task. 2. On a deferred FP context switch. In this case, the system might switch from FP Task A to non-FP Task B and then to FP Task C. In this scenario, the floating point state must technically be saved by a non-FP task.