Port-sparc64 archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

re: sun4v trap table



> For sparc64 in locore.s below is the fragment from the sun4v trap table for TL (Trap Level) 0:
>
>         SPILL64(uspill8_sun4vt0,ASI_AIUS)                       ! 0x080 spill_0_normal -- used to save user windows in user mode
>         SPILL32(uspill4_sun4vt0,ASI_AIUS)                       ! 0x084 spill_1_normal
>         SPILLBOTH(uspill8_sun4vt0,uspill4_sun4vt0,ASI_AIUS)     ! 0x088 spill_2_normal
>         sun4v_trap_entry_spill_fill_fail 1                      ! 0x08c spill_3_normal
>         SPILL64(kspill8_sun4vt0,ASI_N)                          ! 0x090 spill_4_normal  -- used to save supervisor windows
>         SPILL32(kspill4_sun4vt0,ASI_N)                          ! 0x094 spill_5_normal
>         SPILLBOTH(kspill8_sun4vt0,kspill4_sun4vt0,ASI_N)        ! 0x098 spill_6_normal
>         sun4v_trap_entry_spill_fill_fail 1                      ! 0x09c spill_7_normal
>
> Does anyone know how the TT (Trap Type) maps to the table entries? For
> example, when TT=0x080 why does the kernel think it needs to use SPILL64()
> and for example, not SPILL32(). Where is this defined?
>
> The architecture manual does not seem to specify the details, so I assume
> it is left up to the OS kernel to decide? Is this correct?

i thought it was more obvious but it's been almost 30 years since
i wrote some code related to this that eeh implemented as well in
a far more complete form, that also worked :)

the traptype is composed of 9 bits:

   8:6 are 010 for spill and 011 for fill.
   5 is if OTHERWIN is not 0.
   4:2 are either WSTATE.OTHER or WSTATE.NORMAL.

(1:0 is always 0 because these are 4-trap long traps.)

in the (original) v9 manual this is in 7.5.2.1
"Trap Type for Spill/Fill Traps".

so the control is on platform setting %WSTATE -- which is 3 bits for
"other" and "normal".  we only use two values for this so, really
only two of the above should be used?  it's been a while, and i'm
still a little confused by:

include/psl.h:264:#define WSTATE_USER    022
include/psl.h:263:#define WSTATE_KERN    026

since they both seem to set OTHER bits, which means that 4:2 in the
trap type will always be 2?  so always uses SPILLBOTH()?  i think i
am still missing something here...


(none of the above is sun4v specific but sparc v9 generic.)


.mrg.


Home | Main Index | Thread Index | Old Index