arch/tile: Save and restore extra user state for tilegx
During context switch, save and restore a couple of additional bits of tilegx user state that can be persistently modified by userspace. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
This commit is contained in:
@@ -150,6 +150,9 @@
|
|||||||
/** Is the PROC_STATUS SPR supported? */
|
/** Is the PROC_STATUS SPR supported? */
|
||||||
#define CHIP_HAS_PROC_STATUS_SPR() 0
|
#define CHIP_HAS_PROC_STATUS_SPR() 0
|
||||||
|
|
||||||
|
/** Is the DSTREAM_PF SPR supported? */
|
||||||
|
#define CHIP_HAS_DSTREAM_PF() 0
|
||||||
|
|
||||||
/** Log of the number of mshims we have. */
|
/** Log of the number of mshims we have. */
|
||||||
#define CHIP_LOG_NUM_MSHIMS() 2
|
#define CHIP_LOG_NUM_MSHIMS() 2
|
||||||
|
|
||||||
|
@@ -150,6 +150,9 @@
|
|||||||
/** Is the PROC_STATUS SPR supported? */
|
/** Is the PROC_STATUS SPR supported? */
|
||||||
#define CHIP_HAS_PROC_STATUS_SPR() 1
|
#define CHIP_HAS_PROC_STATUS_SPR() 1
|
||||||
|
|
||||||
|
/** Is the DSTREAM_PF SPR supported? */
|
||||||
|
#define CHIP_HAS_DSTREAM_PF() 0
|
||||||
|
|
||||||
/** Log of the number of mshims we have. */
|
/** Log of the number of mshims we have. */
|
||||||
#define CHIP_LOG_NUM_MSHIMS() 2
|
#define CHIP_LOG_NUM_MSHIMS() 2
|
||||||
|
|
||||||
|
@@ -103,6 +103,18 @@ struct thread_struct {
|
|||||||
/* Any other miscellaneous processor state bits */
|
/* Any other miscellaneous processor state bits */
|
||||||
unsigned long proc_status;
|
unsigned long proc_status;
|
||||||
#endif
|
#endif
|
||||||
|
#if !CHIP_HAS_FIXED_INTVEC_BASE()
|
||||||
|
/* Interrupt base for PL0 interrupts */
|
||||||
|
unsigned long interrupt_vector_base;
|
||||||
|
#endif
|
||||||
|
#if CHIP_HAS_TILE_RTF_HWM()
|
||||||
|
/* Tile cache retry fifo high-water mark */
|
||||||
|
unsigned long tile_rtf_hwm;
|
||||||
|
#endif
|
||||||
|
#if CHIP_HAS_DSTREAM_PF()
|
||||||
|
/* Data stream prefetch control */
|
||||||
|
unsigned long dstream_pf;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_HARDWALL
|
#ifdef CONFIG_HARDWALL
|
||||||
/* Is this task tied to an activated hardwall? */
|
/* Is this task tied to an activated hardwall? */
|
||||||
struct hardwall_info *hardwall;
|
struct hardwall_info *hardwall;
|
||||||
|
@@ -408,6 +408,15 @@ static void save_arch_state(struct thread_struct *t)
|
|||||||
#if CHIP_HAS_PROC_STATUS_SPR()
|
#if CHIP_HAS_PROC_STATUS_SPR()
|
||||||
t->proc_status = __insn_mfspr(SPR_PROC_STATUS);
|
t->proc_status = __insn_mfspr(SPR_PROC_STATUS);
|
||||||
#endif
|
#endif
|
||||||
|
#if !CHIP_HAS_FIXED_INTVEC_BASE()
|
||||||
|
t->interrupt_vector_base = __insn_mfspr(SPR_INTERRUPT_VECTOR_BASE_0);
|
||||||
|
#endif
|
||||||
|
#if CHIP_HAS_TILE_RTF_HWM()
|
||||||
|
t->tile_rtf_hwm = __insn_mfspr(SPR_TILE_RTF_HWM);
|
||||||
|
#endif
|
||||||
|
#if CHIP_HAS_DSTREAM_PF()
|
||||||
|
t->dstream_pf = __insn_mfspr(SPR_DSTREAM_PF);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void restore_arch_state(const struct thread_struct *t)
|
static void restore_arch_state(const struct thread_struct *t)
|
||||||
@@ -428,14 +437,14 @@ static void restore_arch_state(const struct thread_struct *t)
|
|||||||
#if CHIP_HAS_PROC_STATUS_SPR()
|
#if CHIP_HAS_PROC_STATUS_SPR()
|
||||||
__insn_mtspr(SPR_PROC_STATUS, t->proc_status);
|
__insn_mtspr(SPR_PROC_STATUS, t->proc_status);
|
||||||
#endif
|
#endif
|
||||||
|
#if !CHIP_HAS_FIXED_INTVEC_BASE()
|
||||||
|
__insn_mtspr(SPR_INTERRUPT_VECTOR_BASE_0, t->interrupt_vector_base);
|
||||||
|
#endif
|
||||||
#if CHIP_HAS_TILE_RTF_HWM()
|
#if CHIP_HAS_TILE_RTF_HWM()
|
||||||
/*
|
__insn_mtspr(SPR_TILE_RTF_HWM, t->tile_rtf_hwm);
|
||||||
* Clear this whenever we switch back to a process in case
|
#endif
|
||||||
* the previous process was monkeying with it. Even if enabled
|
#if CHIP_HAS_DSTREAM_PF()
|
||||||
* in CBOX_MSR1 via TILE_RTF_HWM_MIN, it's still just a
|
__insn_mtspr(SPR_DSTREAM_PF, t->dstream_pf);
|
||||||
* performance hint, so isn't worth a full save/restore.
|
|
||||||
*/
|
|
||||||
__insn_mtspr(SPR_TILE_RTF_HWM, 0);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user