Page MenuHomeFreeBSD

D24908.id72009.diff
No OneTemporary

D24908.id72009.diff

Index: sys/powerpc/aim/mmu_radix.c
===================================================================
--- sys/powerpc/aim/mmu_radix.c
+++ sys/powerpc/aim/mmu_radix.c
@@ -2403,6 +2403,7 @@
printf("%s done\n", __func__);
pmap_bootstrapped = 1;
dmaplimit = roundup2(powerpc_ptob(Maxmem), L2_PAGE_SIZE);
+ PCPU_SET(flags, PCPU_GET(flags) | PC_FLAG_NOSRS);
}
static void
Index: sys/powerpc/aim/trap_subr64.S
===================================================================
--- sys/powerpc/aim/trap_subr64.S
+++ sys/powerpc/aim/trap_subr64.S
@@ -87,6 +87,9 @@
*/
restore_kernsrs:
GET_CPUINFO(%r28)
+ lwz %r29, PC_FLAGS(%r28)
+ mtcr %r29
+ btlr 0
addi %r28,%r28,PC_KERNSLB
ld %r29,16(%r28) /* One past USER_SLB_SLOT */
cmpdi %r29,0
@@ -270,9 +273,13 @@
std %r29,(savearea+CPUSAVE_R29)(%r3); \
std %r30,(savearea+CPUSAVE_R30)(%r3); \
std %r31,(savearea+CPUSAVE_R31)(%r3); \
+ lwz %r28,PC_FLAGS(%r3); \
+ mtcr %r28; \
+ bt 0, 0f; /* Check to skip restoring SRs. */ \
mflr %r27; /* preserve LR */ \
bl restore_usersrs; /* uses r28-r31 */ \
mtlr %r27; \
+0: \
ld %r31,(savearea+CPUSAVE_R31)(%r3); \
ld %r30,(savearea+CPUSAVE_R30)(%r3); \
ld %r29,(savearea+CPUSAVE_R29)(%r3); \
Index: sys/powerpc/include/pcpu.h
===================================================================
--- sys/powerpc/include/pcpu.h
+++ sys/powerpc/include/pcpu.h
@@ -54,7 +54,8 @@
register_t pc_disisave[CPUSAVE_LEN]; \
register_t pc_dbsave[CPUSAVE_LEN]; \
void *pc_restore; \
- vm_offset_t pc_qmap_addr;
+ vm_offset_t pc_qmap_addr; \
+ uint32_t pc_flags; /* cpu feature flags */
#define PCPU_MD_AIM32_FIELDS \
struct pvo_entry *qmap_pvo; \
@@ -77,6 +78,9 @@
#define PCPU_MD_AIM_FIELDS PCPU_MD_AIM32_FIELDS
#endif
+/* CPU feature flags, can be used for cached flow control. */
+#define PC_FLAG_NOSRS 0x00000001
+
#define BOOKE_CRITSAVE_LEN (CPUSAVE_LEN + 2)
#define BOOKE_TLB_MAXNEST 4
#define BOOKE_TLB_SAVELEN 16
Index: sys/powerpc/powerpc/db_interface.c
===================================================================
--- sys/powerpc/powerpc/db_interface.c
+++ sys/powerpc/powerpc/db_interface.c
@@ -91,4 +91,5 @@
db_printf("PPC: hwref = %#zx\n", pc->pc_hwref);
db_printf("PPC: ipimask = %#x\n", pc->pc_ipimask);
+ db_printf("PPC: flags = %#x\n", pc->pc_flags);
}
Index: sys/powerpc/powerpc/genassym.c
===================================================================
--- sys/powerpc/powerpc/genassym.c
+++ sys/powerpc/powerpc/genassym.c
@@ -64,6 +64,7 @@
ASSYM(PC_DISISAVE, offsetof(struct pcpu, pc_disisave));
ASSYM(PC_DBSAVE, offsetof(struct pcpu, pc_dbsave));
ASSYM(PC_RESTORE, offsetof(struct pcpu, pc_restore));
+ASSYM(PC_FLAGS, offsetof(struct pcpu, pc_flags));
#if defined(BOOKE)
ASSYM(PC_BOOKE_CRITSAVE, offsetof(struct pcpu, pc_booke.critsave));
@@ -106,6 +107,7 @@
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
+ASSYM(PC_FLAG_NOSRS, PC_FLAG_NOSRS);
#if defined(AIM)
ASSYM(USER_ADDR, USER_ADDR);
#ifdef __powerpc64__
Index: sys/powerpc/powerpc/mp_machdep.c
===================================================================
--- sys/powerpc/powerpc/mp_machdep.c
+++ sys/powerpc/powerpc/mp_machdep.c
@@ -246,6 +246,7 @@
printf("Waking up CPU %d (dev=%x)\n",
pc->pc_cpuid, (int)pc->pc_hwref);
+ pc->pc_flags = PCPU_GET(flags); /* Copy cached CPU flags */
ret = platform_smp_start_cpu(pc);
if (ret == 0) {
timeout = 2000; /* wait 2sec for the AP */

File Metadata

Mime Type
text/plain
Expires
Tue, Jun 16, 5:57 PM (7 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33996185
Default Alt Text
D24908.id72009.diff (3 KB)

Event Timeline