| @node Platform, Contributors, Maintenance, Top | 
 | @c %MENU% Describe all platform-specific facilities provided | 
 | @appendix Platform-specific facilities | 
 |  | 
 | @Theglibc{} can provide machine-specific functionality. | 
 |  | 
 | @menu | 
 | * PowerPC::           Facilities Specific to the PowerPC Architecture | 
 | @end menu | 
 |  | 
 | @node PowerPC | 
 | @appendixsec PowerPC-specific Facilities | 
 |  | 
 | Facilities specific to PowerPC that are not specific to a particular | 
 | operating system are declared in @file{sys/platform/ppc.h}. | 
 |  | 
 | @deftypefun {uint64_t} __ppc_get_timebase (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Read the current value of the Time Base Register. | 
 |  | 
 | The @dfn{Time Base Register} is a 64-bit register that stores a monotonically | 
 | incremented value updated at a system-dependent frequency that may be | 
 | different from the processor frequency.  More information is available in | 
 | @cite{Power ISA 2.06b - Book II - Section 5.2}. | 
 |  | 
 | @code{__ppc_get_timebase} uses the processor's time base facility directly | 
 | without requiring assistance from the operating system, so it is very | 
 | efficient. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {uint64_t} __ppc_get_timebase_freq (void) | 
 | @safety{@prelim{}@mtunsafe{@mtuinit{}}@asunsafe{@asucorrupt{:init}}@acunsafe{@acucorrupt{:init}}} | 
 | @c __ppc_get_timebase_freq=__get_timebase_freq @mtuinit @acsfd | 
 | @c  __get_clockfreq @mtuinit @asucorrupt:init @acucorrupt:init @acsfd | 
 | @c    the initialization of the static timebase_freq is not exactly | 
 | @c    safe, because hp_timing_t cannot be atomically set up. | 
 | @c   syscall:get_tbfreq ok | 
 | @c   open dup @acsfd | 
 | @c   read dup ok | 
 | @c   memcpy dup ok | 
 | @c   memmem dup ok | 
 | @c   close dup @acsfd | 
 | Read the current frequency at which the Time Base Register is updated. | 
 |  | 
 | This frequency is not related to the processor clock or the bus clock. | 
 | It is also possible that this frequency is not constant.  More information is | 
 | available in @cite{Power ISA 2.06b - Book II - Section 5.2}. | 
 | @end deftypefun | 
 |  | 
 | The following functions provide hints about the usage of resources that are | 
 | shared with other processors.  They can be used, for example, if a program | 
 | waiting on a lock intends to divert the shared resources to be used by other | 
 | processors.  More information is available in @cite{Power ISA 2.06b - Book II - | 
 | Section 3.2}. | 
 |  | 
 | @deftypefun {void} __ppc_yield (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Provide a hint that performance will probably be improved if shared resources | 
 | dedicated to the executing processor are released for use by other processors. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_mdoio (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Provide a hint that performance will probably be improved if shared resources | 
 | dedicated to the executing processor are released until all outstanding storage | 
 | accesses to caching-inhibited storage have been completed. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_mdoom (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Provide a hint that performance will probably be improved if shared resources | 
 | dedicated to the executing processor are released until all outstanding storage | 
 | accesses to cacheable storage for which the data is not in the cache have been | 
 | completed. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_set_ppr_med (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Set the Program Priority Register to medium value (default). | 
 |  | 
 | The @dfn{Program Priority Register} (PPR) is a 64-bit register that controls | 
 | the program's priority.  By adjusting the PPR value the programmer may | 
 | improve system throughput by causing the system resources to be used | 
 | more efficiently, especially in contention situations. | 
 | The three unprivileged states available are covered by the functions | 
 | @code{__ppc_set_ppr_med} (medium -- default), @code{__ppc_set_ppc_low} (low) | 
 | and @code{__ppc_set_ppc_med_low} (medium low).  More information | 
 | available in @cite{Power ISA 2.06b - Book II - Section 3.1}. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_set_ppr_low (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Set the Program Priority Register to low value. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_set_ppr_med_low (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Set the Program Priority Register to medium low value. | 
 | @end deftypefun | 
 |  | 
 | Power ISA 2.07 extends the priorities that can be set to the Program Priority | 
 | Register (PPR).  The following functions implement the new priority levels: | 
 | very low and medium high. | 
 |  | 
 | @deftypefun {void} __ppc_set_ppr_very_low (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Set the Program Priority Register to very low value. | 
 | @end deftypefun | 
 |  | 
 | @deftypefun {void} __ppc_set_ppr_med_high (void) | 
 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
 | Set the Program Priority Register to medium high value.  The medium high | 
 | priority is privileged and may only be set during certain time intervals by | 
 | problem-state programs.  If the program priority is medium high when the time | 
 | interval expires or if an attempt is made to set the priority to medium high | 
 | when it is not allowed, the priority is set to medium. | 
 | @end deftypefun |