Module Name: src
Committed By: martin
Date: Sun Jun 14 19:05:27 UTC 2015
Modified Files:
src/sys/arch/sparc64/sparc64: autoconf.c pmap.c
Log Message:
Do not hardcode the assumption that .data and .bss fit together in a single
4 MB page. This allows booting kernels with options USB_DEBUG again.
To generate a diff of this commit:
cvs rdiff -u -r1.202 -r1.203 src/sys/arch/sparc64/sparc64/autoconf.c
cvs rdiff -u -r1.294 -r1.295 src/sys/arch/sparc64/sparc64/pmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/sparc64/autoconf.c
diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.202 src/sys/arch/sparc64/sparc64/autoconf.c:1.203
--- src/sys/arch/sparc64/sparc64/autoconf.c:1.202 Sun Mar 15 10:38:58 2015
+++ src/sys/arch/sparc64/sparc64/autoconf.c Sun Jun 14 19:05:27 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.202 2015/03/15 10:38:58 nakayama Exp $ */
+/* $NetBSD: autoconf.c,v 1.203 2015/06/14 19:05:27 martin Exp $ */
/*
* Copyright (c) 1996
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.202 2015/03/15 10:38:58 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.203 2015/06/14 19:05:27 martin Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -159,7 +159,8 @@ static void get_bootpath_from_prom(void)
* Kernel 4MB mappings.
*/
struct tlb_entry *kernel_tlbs;
-int kernel_tlb_slots;
+int kernel_dtlb_slots;
+int kernel_itlb_slots;
/* Global interrupt mappings for all device types. Match against the OBP
* 'device_type' property.
@@ -355,7 +356,11 @@ die_old_boot_loader:
boothowto = bi_howto->boothowto;
LOOKUP_BOOTINFO(bi_count, BTINFO_DTLB_SLOTS);
- kernel_tlb_slots = bi_count->count;
+ kernel_dtlb_slots = bi_count->count;
+ kernel_itlb_slots = kernel_dtlb_slots-1;
+ bi_count = lookup_bootinfo(BTINFO_ITLB_SLOTS);
+ if (bi_count)
+ kernel_itlb_slots = bi_count->count;
LOOKUP_BOOTINFO(bi_tlb, BTINFO_DTLB);
kernel_tlbs = &bi_tlb->tlb[0];
Index: src/sys/arch/sparc64/sparc64/pmap.c
diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.294 src/sys/arch/sparc64/sparc64/pmap.c:1.295
--- src/sys/arch/sparc64/sparc64/pmap.c:1.294 Thu Apr 16 08:58:44 2015
+++ src/sys/arch/sparc64/sparc64/pmap.c Sun Jun 14 19:05:27 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.294 2015/04/16 08:58:44 mrg Exp $ */
+/* $NetBSD: pmap.c,v 1.295 2015/06/14 19:05:27 martin Exp $ */
/*
*
* Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.294 2015/04/16 08:58:44 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.295 2015/06/14 19:05:27 martin Exp $");
#undef NO_VCACHE /* Don't forget the locked TLB in dostart */
#define HWREF
@@ -209,7 +209,7 @@ paddr_t ekdatap;
* Kernel 4MB pages.
*/
extern struct tlb_entry *kernel_tlbs;
-extern int kernel_tlb_slots;
+extern int kernel_dtlb_slots, kernel_itlb_slots;
static int npgs;
@@ -525,11 +525,11 @@ pmap_mp_init(void)
}
memcpy(v, mp_tramp_code, mp_tramp_code_len);
- *(u_long *)(v + mp_tramp_tlb_slots) = kernel_tlb_slots;
+ *(u_long *)(v + mp_tramp_tlb_slots) = kernel_dtlb_slots;
*(u_long *)(v + mp_tramp_func) = (u_long)cpu_mp_startup;
*(u_long *)(v + mp_tramp_ci) = (u_long)cpu_args;
tp = (pte_t *)(v + mp_tramp_code_len);
- for (i = 0; i < kernel_tlb_slots; i++) {
+ for (i = 0; i < kernel_dtlb_slots; i++) {
tp[i].tag = kernel_tlbs[i].te_va;
tp[i].data = TSB_DATA(0, /* g */
PGSZ_4M, /* sz */
@@ -542,18 +542,12 @@ pmap_mp_init(void)
0 /* ie */);
tp[i].data |= TLB_L | TLB_CV;
- /*
- * Assuming that the last tlb slot entry is the only data slot.
- *
- * If more than one data slot is required on day, perhaps
- * the bootinfo structure shared between ofwboot and the kernel
- * should be expanded to include the number of data slots.
- */
- if (i == kernel_tlb_slots-1)
+ if (i >= kernel_itlb_slots) {
tp[i].data |= TLB_W;
- else
+ } else {
if (CPU_ISSUN4V)
tp[i].data |= SUN4V_TLB_X;
+ }
DPRINTF(PDB_BOOT1, ("xtlb[%d]: Tag: %" PRIx64 " Data: %"
PRIx64 "\n", i, tp[i].tag, tp[i].data));
@@ -576,7 +570,7 @@ pmap_kextract(vaddr_t va)
int i;
paddr_t paddr = (paddr_t)-1;
- for (i = 0; i < kernel_tlb_slots; i++) {
+ for (i = 0; i < kernel_dtlb_slots; i++) {
if ((va & ~PAGE_MASK_4M) == kernel_tlbs[i].te_va) {
paddr = kernel_tlbs[i].te_pa +
(paddr_t)(va & PAGE_MASK_4M);
@@ -584,7 +578,7 @@ pmap_kextract(vaddr_t va)
}
}
- if (i == kernel_tlb_slots) {
+ if (i == kernel_dtlb_slots) {
panic("pmap_kextract: Address %p is not from kernel space.\n"
"Data segment is too small?\n", (void*)va);
}
@@ -2352,7 +2346,7 @@ pmap_dumpsize(void)
int sz;
sz = ALIGN(sizeof(kcore_seg_t)) + ALIGN(sizeof(cpu_kcore_hdr_t));
- sz += kernel_tlb_slots * sizeof(struct cpu_kcore_4mbseg);
+ sz += kernel_dtlb_slots * sizeof(struct cpu_kcore_4mbseg);
sz += phys_installed_size * sizeof(phys_ram_seg_t);
return btodb(sz + DEV_BSIZE - 1);
@@ -2428,7 +2422,7 @@ pmap_dumpmmu(int (*dump)(dev_t, daddr_t,
/* new version of locked segments description */
kcpu->newmagic = SPARC64_KCORE_NEWMAGIC;
- kcpu->num4mbsegs = kernel_tlb_slots;
+ kcpu->num4mbsegs = kernel_dtlb_slots;
kcpu->off4mbsegs = ALIGN(sizeof(cpu_kcore_hdr_t));
/* description of per-cpu mappings */
@@ -2440,7 +2434,7 @@ pmap_dumpmmu(int (*dump)(dev_t, daddr_t,
/* Now the memsegs */
kcpu->nmemseg = phys_installed_size;
kcpu->memsegoffset = kcpu->off4mbsegs
- + kernel_tlb_slots * sizeof(struct cpu_kcore_4mbseg);
+ + kernel_dtlb_slots * sizeof(struct cpu_kcore_4mbseg);
/* Now we need to point this at our kernel pmap. */
kcpu->nsegmap = STSZ;
@@ -2450,7 +2444,7 @@ pmap_dumpmmu(int (*dump)(dev_t, daddr_t,
bp = (int *)((long)kcpu + ALIGN(sizeof(cpu_kcore_hdr_t)));
/* write locked kernel 4MB TLBs */
- for (i = 0; i < kernel_tlb_slots; i++) {
+ for (i = 0; i < kernel_dtlb_slots; i++) {
ktlb.va = kernel_tlbs[i].te_va;
ktlb.pa = kernel_tlbs[i].te_pa;
EXPEDITE(&ktlb, sizeof(ktlb));