diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2010-07-10 19:32:26 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2010-07-10 19:32:26 +0000 |
commit | 9a9eb00f7b2ba1a461a4f0e474e2d8431e727018 (patch) | |
tree | 9aced9ad7d9f9287739626262ea6f8bb85e23935 | |
parent | ab98f8b4b2be806732331cc202bf10bf268cac9f (diff) |
sun4e (i.e. SPARCengine 1e) support. This platform is a mix between sun4 and
sun4c, as it has a sun4c OpenPROM but a sun4 8KB pagesize. VME devices are
not supported yet.
ok deraadt@
33 files changed, 557 insertions, 424 deletions
diff --git a/sys/arch/sparc/conf/GENERIC b/sys/arch/sparc/conf/GENERIC index e6f9a8dc160..4270707afb9 100644 --- a/sys/arch/sparc/conf/GENERIC +++ b/sys/arch/sparc/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.97 2010/07/03 03:59:17 krw Exp $ +# $OpenBSD: GENERIC,v 1.98 2010/07/10 19:32:20 miod Exp $ # # For further information on compiling OpenBSD kernels, see the config(8) # man page. @@ -17,6 +17,7 @@ maxusers 20 # estimated number of users # At least one is required. option SUN4 # sun4/100, sun4/200, sun4/300 option SUN4C # sun4c - SS1, 1+, 2, ELC, SLC, IPC, IPX, etc. +option SUN4E # sun4e - SPARCengine 1E option SUN4M # sun4m - SS10, SS20, Classic, etc. #option MMU_3L # 3-level MMU on sun4/400 @@ -40,7 +41,7 @@ mainbus0 at root cpu0 at mainbus0 # Bus types found on SPARC systems. -sbus0 at mainbus0 # sun4c +sbus0 at mainbus0 # sun4c and sun4e obio0 at mainbus0 # sun4 and sun4m vmes0 at mainbus0 # sun4 vmel0 at mainbus0 # sun4 @@ -55,7 +56,7 @@ audio* at audioamd? audiocs0 at sbus0 # sun4m audio* at audiocs? -auxreg* at mainbus0 # sun4c +auxreg* at mainbus0 # sun4c and sun4e auxreg* at obio0 # sun4m # Power status and control register found on Sun4m systems @@ -63,7 +64,7 @@ power0 at obio0 # Mostek clock found on 4/300, sun4c, and sun4m systems. # The Mostek clock NVRAM is the "eeprom" on sun4/300 systems. -clock0 at mainbus0 # sun4c +clock0 at mainbus0 # sun4c and sun4e clock0 at obio0 # sun4m clock0 at obio0 addr 0xf2000000 # sun4/300 @@ -71,12 +72,12 @@ clock0 at obio0 addr 0xf2000000 # sun4/300 oclock0 at obio0 addr 0xf3000000 # sun4/100 and sun4/200 # Memory error registers. -memreg0 at mainbus0 # sun4c +memreg0 at mainbus0 # sun4c and sun4e memreg0 at obio0 # sun4m memreg0 at obio0 addr 0xf4000000 # sun4 # Timer chip found on 4/300, sun4c, and sun4m systems. -timer0 at mainbus0 # sun4c +timer0 at mainbus0 # sun4c and sun4e timer0 at obio0 # sun4m timer0 at obio0 addr 0xef000000 # sun4/300 @@ -86,15 +87,15 @@ timer0 at obio0 addr 0xef000000 # sun4/300 eeprom0 at obio0 addr 0xf2000000 # sun4/100 and sun4/200 # 8 segment led display on sun4/sun4m systems -led0 at mainbus0 # sun4 +led0 at mainbus0 # sun4 and sun4e led0 at obio0 # sun4/600 # Zilog 8530 serial chips. Each has two-channels. # zs0 is ttya and ttyb. zs1 is the keyboard and mouse. -zs0 at mainbus0 # sun4c +zs0 at mainbus0 # sun4c and sun4e zs0 at obio0 # sun4m zs0 at obio0 addr 0xf1000000 level 12 # sun4 -zs1 at mainbus0 # sun4c +zs1 at mainbus0 # sun4c and sun4e zs1 at obio0 # sun4m zs1 at obio0 addr 0xf0000000 level 12 # sun4 zs2 at obio0 addr 0xe0000000 level 12 # sun4/300 @@ -143,7 +144,7 @@ esp0 at obio0 addr 0xfa000000 level 4 flags 0x00ff000f # sun4c or sun4m SCSI - an NCR53c94 or equivalent behind # specialized DMA glue dma0 at sbus0 # on-board SCSI -esp0 at sbus0 flags 0x00ff000f # sun4c +esp0 at sbus0 flags 0x00ff000f # sun4c and sun4e esp0 at dma0 flags 0x00ff000f # sun4m # FSBE/S SCSI - an NCR53c94 or equivalent behind @@ -151,7 +152,7 @@ dma* at sbus? # SBus SCSI esp* at sbus? flags 0x00ff000f # two flavours esp* at dma? flags 0x00ff000f # depending on model -#sun4c, sun4m +#sun4c, sun4e, sun4m isp* at sbus? # sun4m Ethernet - an AMD 7990 LANCE behind @@ -168,7 +169,7 @@ le0 at lebuffer0 # le* at lebuffer? # # sun4/300 and sun4c Ethernet - an AMD 7990 LANCE -le0 at sbus0 # sun4c on-board +le0 at sbus0 # sun4c/sun4e on-board le* at sbus? le0 at obio0 addr 0xf9000000 level 6 # sun4/300 diff --git a/sys/arch/sparc/conf/RAMDISK b/sys/arch/sparc/conf/RAMDISK index ee5d214b87c..5a2386c6bd2 100644 --- a/sys/arch/sparc/conf/RAMDISK +++ b/sys/arch/sparc/conf/RAMDISK @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK,v 1.70 2010/07/03 03:59:17 krw Exp $ +# $OpenBSD: RAMDISK,v 1.71 2010/07/10 19:32:20 miod Exp $ # $NetBSD: GENERIC,v 1.28.2.1 1996/07/02 23:55:22 jtc Exp $ # Machine architecture; required by config(8) @@ -30,6 +30,7 @@ option CRYPTO # Cryptographic framework # At least one is required. option SUN4 # sun4/100, sun4/200, sun4/300 option SUN4C # sun4c - SS1, 1+, 2, ELC, SLC, IPC, IPX, etc. +option SUN4E # sun4e - SPARCengine 1E option SUN4M # sun4m - SS10, SS20, Classic, etc. #option MMU_3L # 3-level MMU on sun4/400 @@ -51,7 +52,7 @@ mainbus0 at root cpu0 at mainbus0 # Bus types found on SPARC systems. -sbus0 at mainbus0 # sun4c +sbus0 at mainbus0 # sun4c and sun4e obio0 at mainbus0 # sun4 and sun4m vmes0 at mainbus0 # sun4 vmel0 at mainbus0 # sun4 @@ -63,7 +64,7 @@ sbus0 at iommu0 # sun4m #audioamd0 at sbus0 # sun4m #audio* at audioamd? -auxreg* at mainbus0 # sun4c +auxreg* at mainbus0 # sun4c and sun4e auxreg* at obio0 # sun4m # Power status and control register found on Sun4m systems @@ -71,7 +72,7 @@ power0 at obio0 # Mostek clock found on 4/300, sun4c, and sun4m systems. # The Mostek clock NVRAM is the "eeprom" on sun4/300 systems. -clock0 at mainbus0 # sun4c +clock0 at mainbus0 # sun4c and sun4e clock0 at obio0 # sun4m clock0 at obio0 addr 0xf2000000 # sun4/300 @@ -79,12 +80,12 @@ clock0 at obio0 addr 0xf2000000 # sun4/300 oclock0 at obio0 addr 0xf3000000 # sun4/100 and sun4/200 # Memory error registers. -memreg0 at mainbus0 # sun4c +memreg0 at mainbus0 # sun4c and sun4e memreg0 at obio0 # sun4m memreg0 at obio0 addr 0xf4000000 # sun4 # Timer chip found on 4/300, sun4c, and sun4m systems. -timer0 at mainbus0 # sun4c +timer0 at mainbus0 # sun4c and sun4e timer0 at obio0 # sun4m timer0 at obio0 addr 0xef000000 # sun4/300 @@ -95,10 +96,10 @@ eeprom0 at obio0 addr 0xf2000000 # sun4/100 and sun4/200 # Zilog 8530 serial chips. Each has two-channels. # zs0 is ttya and ttyb. zs1 is the keyboard and mouse. -zs0 at mainbus0 # sun4c +zs0 at mainbus0 # sun4c and sun4e zs0 at obio0 # sun4m zs0 at obio0 addr 0xf1000000 level 12 # sun4 -zs1 at mainbus0 # sun4c +zs1 at mainbus0 # sun4c and sun4e zs1 at obio0 # sun4m zs1 at obio0 addr 0xf0000000 level 12 # sun4 zs2 at obio0 addr 0xe0000000 level 12 # sun4/300 @@ -130,7 +131,7 @@ esp0 at obio0 addr 0xfa000000 level 4 flags 0x00ff000f # sun4c or sun4m SCSI - an NCR53c94 or equivalent behind # specialized DMA glue dma0 at sbus0 # on-board SCSI -esp0 at sbus0 flags 0x00ff000f # sun4c +esp0 at sbus0 flags 0x00ff000f # sun4c and sun4e esp0 at dma0 flags 0x00ff000f # sun4m # FSBE/S SCSI - an NCR53c94 or equivalent behind @@ -151,7 +152,7 @@ le0 at lebuffer0 # le* at lebuffer? # # sun4/300 and sun4c Ethernet - an AMD 7990 LANCE -le0 at sbus0 # sun4c on-board +le0 at sbus0 # sun4c/sun4e on-board le* at sbus? le0 at obio0 addr 0xf9000000 level 6 # sun4/300 diff --git a/sys/arch/sparc/dev/bwtwo.c b/sys/arch/sparc/dev/bwtwo.c index 918eec695ff..a479974d9bf 100644 --- a/sys/arch/sparc/dev/bwtwo.c +++ b/sys/arch/sparc/dev/bwtwo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bwtwo.c,v 1.37 2010/06/07 19:43:45 miod Exp $ */ +/* $OpenBSD: bwtwo.c,v 1.38 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: bwtwo.c,v 1.33 1997/05/24 20:16:02 pk Exp $ */ /* @@ -240,7 +240,7 @@ bwtwoattach(struct device *parent, struct device *self, void *args) case BUS_SBUS: obp_name: -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) nam = getpropstring(node, "model"); #endif break; @@ -272,7 +272,7 @@ obp_name: } #endif - if (CPU_ISSUN4COR4M) + if (!CPU_ISSUN4) isconsole = node == fbnode; sc->sc_phys = ca->ca_ra.ra_reg[0]; diff --git a/sys/arch/sparc/dev/cgsix.c b/sys/arch/sparc/dev/cgsix.c index c38b4605ba5..847787ab987 100644 --- a/sys/arch/sparc/dev/cgsix.c +++ b/sys/arch/sparc/dev/cgsix.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cgsix.c,v 1.42 2010/06/07 19:43:45 miod Exp $ */ +/* $OpenBSD: cgsix.c,v 1.43 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: cgsix.c,v 1.33 1997/08/07 19:12:30 pk Exp $ */ /* @@ -253,7 +253,7 @@ cgsixattach(struct device *parent, struct device *self, void *args) } #endif - if (CPU_ISSUN4COR4M) + if (!CPU_ISSUN4) isconsole = node == fbnode; fhcrev = (*sc->sc_fhc >> FHC_REV_SHIFT) & diff --git a/sys/arch/sparc/dev/dma.c b/sys/arch/sparc/dev/dma.c index 191ec5f51c9..8d1fc60875f 100644 --- a/sys/arch/sparc/dev/dma.c +++ b/sys/arch/sparc/dev/dma.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dma.c,v 1.27 2010/06/27 05:52:01 beck Exp $ */ +/* $OpenBSD: dma.c,v 1.28 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: dma.c,v 1.46 1997/08/27 11:24:16 bouyer Exp $ */ /* @@ -111,7 +111,7 @@ dmamatch(parent, vcf, aux) if (strcmp(cf->cf_driver->cd_name, ra->ra_name) && strcmp("espdma", ra->ra_name)) return (0); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS) { if (!sbus_testdma((struct sbus_softc *)parent, ca)) return (0); @@ -133,7 +133,7 @@ dmaattach(parent, self, aux) struct confargs *ca = aux; struct dma_softc *sc = (void *)self; int devnode; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) int node; struct confargs oca; char *name; @@ -217,7 +217,7 @@ dmaattach(parent, self, aux) if (CPU_ISSUN4) goto espsearch; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) /* Propagate bootpath */ if (ca->ca_ra.ra_bp != NULL && (strcmp(ca->ca_ra.ra_bp->name, "espdma") == 0 || @@ -238,7 +238,7 @@ dmaattach(parent, self, aux) oca.ca_bustype = BUS_SBUS; (void) config_found(&sc->sc_dev, (void *)&oca, dmaprint); } while ((node = nextsibling(node)) != 0); else -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ if (strcmp(ca->ca_ra.ra_name, "dma") == 0) { espsearch: @@ -413,7 +413,7 @@ ledmamatch(parent, vcf, aux) if (strcmp(cf->cf_driver->cd_name, ra->ra_name)) return (0); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (!sbus_testdma((struct sbus_softc *)parent, ca)) return(0); #endif diff --git a/sys/arch/sparc/dev/esp.c b/sys/arch/sparc/dev/esp.c index 85120c54f8e..d7f6960f19e 100644 --- a/sys/arch/sparc/dev/esp.c +++ b/sys/arch/sparc/dev/esp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: esp.c,v 1.32 2010/06/28 18:31:01 krw Exp $ */ +/* $OpenBSD: esp.c,v 1.33 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: esp.c,v 1.69 1997/08/27 11:24:18 bouyer Exp $ */ /* @@ -169,7 +169,7 @@ struct ncr53c9x_glue esp_glue = { NULL, /* gl_clear_latched_intr */ }; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) struct ncr53c9x_glue esp_glue1 = { esp_rdreg1, esp_wrreg1, @@ -193,7 +193,7 @@ espmatch(parent, vcf, aux) register struct confargs *ca = aux; register struct romaux *ra = &ca->ca_ra; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS) { if (strcmp("SUNW,fas", ra->ra_name) == 0 || strcmp("ptscII", ra->ra_name) == 0) @@ -203,7 +203,7 @@ espmatch(parent, vcf, aux) if (strcmp(cf->cf_driver->cd_name, ra->ra_name)) return (0); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS) { if (!sbus_testdma((struct sbus_softc *)parent, ca)) return (0); @@ -261,7 +261,7 @@ espattach(parent, self, aux) /* gimme MHz */ sc->sc_freq /= 1000000; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS && strcmp("SUNW,fas", ca->ca_ra.ra_name) == 0) { struct dma_softc *dsc; @@ -387,7 +387,7 @@ espattach(parent, self, aux) /* * Set up glue for MI code. */ -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS && strcmp("ptscII", ca->ca_ra.ra_name) == 0) { sc->sc_glue = &esp_glue1; @@ -539,7 +539,7 @@ esp_write_reg(sc, reg, val) esc->sc_reg[reg * 4] = v; } -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) u_char esp_rdreg1(sc, reg) struct ncr53c9x_softc *sc; diff --git a/sys/arch/sparc/dev/fb.c b/sys/arch/sparc/dev/fb.c index db0fdc52d7d..bf299342ec1 100644 --- a/sys/arch/sparc/dev/fb.c +++ b/sys/arch/sparc/dev/fb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fb.c,v 1.51 2010/06/07 19:43:45 miod Exp $ */ +/* $OpenBSD: fb.c,v 1.52 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: fb.c,v 1.23 1997/07/07 23:30:22 pk Exp $ */ /* @@ -82,7 +82,7 @@ #include <machine/eeprom.h> #include <sparc/dev/pfourreg.h> #endif -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) #include <machine/bsd_openprom.h> #endif @@ -118,7 +118,7 @@ fb_unblank() #if NWSDISPLAY > 0 -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) static int a2int(char *, int); #endif int fb_get_console_metrics(int *, int *, int *, int *); @@ -272,7 +272,7 @@ obpsize: sf->sf_fbsize = sf->sf_height * sf->sf_linebytes; } -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) static int a2int(char *cp, int deflt) { @@ -313,7 +313,7 @@ fbwscons_init(struct sunfb *sf, int isconsole) { struct rasops_info *ri = &sf->sf_ro; int cols, rows; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) int fw, fh, wt, wl; #endif @@ -326,8 +326,8 @@ fbwscons_init(struct sunfb *sf, int isconsole) ri->ri_width = sf->sf_width; ri->ri_height = sf->sf_height; -#if defined(SUN4C) || defined(SUN4M) - if (CPU_ISSUN4COR4M) { +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) + if (!CPU_ISSUN4) { rows = a2int(getpropstring(optionsnode, "screen-#rows"), 34); cols = a2int(getpropstring(optionsnode, "screen-#columns"), 80); } @@ -369,8 +369,8 @@ fbwscons_init(struct sunfb *sf, int isconsole) * this chunk. */ -#if defined(SUN4C) || defined(SUN4M) - if (CPU_ISSUN4COR4M && isconsole) { +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) + if (!CPU_ISSUN4 && isconsole) { if (fb_get_console_metrics(&fw, &fh, &wt, &wl) != 0) { /* * Assume a 12x22 prom font and a centered @@ -422,7 +422,7 @@ fbwscons_init(struct sunfb *sf, int isconsole) rasops_init(ri, rows, cols); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) /* * If this is the console display and there is no font change, * adjust our terminal window to the position of the PROM @@ -670,7 +670,7 @@ fb_pfour_burner(void *v, u_int enable, u_int flags) #endif /* SUN4 */ -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) int fb_get_console_metrics(int *fontwidth, int *fontheight, int *wtop, int *wleft) { @@ -732,6 +732,6 @@ fb_get_console_metrics(int *fontwidth, int *fontheight, int *wtop, int *wleft) return (0); } -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ #endif /* NWSDISPLAY */ diff --git a/sys/arch/sparc/dev/fd.c b/sys/arch/sparc/dev/fd.c index c90be332be7..ed0e33b6252 100644 --- a/sys/arch/sparc/dev/fd.c +++ b/sys/arch/sparc/dev/fd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fd.c,v 1.71 2010/07/02 19:57:15 tedu Exp $ */ +/* $OpenBSD: fd.c,v 1.72 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: fd.c,v 1.51 1997/05/24 20:16:19 pk Exp $ */ /*- @@ -281,9 +281,9 @@ fdcmatch(parent, match, aux) register struct romaux *ra = &ca->ca_ra; /* - * Floppy doesn't exist on sun4. + * Floppy doesn't exist on sun4 and sun4e. */ - if (CPU_ISSUN4) + if (CPU_ISSUN4OR4E) return (0); /* diff --git a/sys/arch/sparc/dev/if_le.c b/sys/arch/sparc/dev/if_le.c index 7bf1432d45b..0a8b22f562f 100644 --- a/sys/arch/sparc/dev/if_le.c +++ b/sys/arch/sparc/dev/if_le.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_le.c,v 1.30 2009/10/26 20:17:27 deraadt Exp $ */ +/* $OpenBSD: if_le.c,v 1.31 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: if_le.c,v 1.50 1997/09/09 20:54:48 pk Exp $ */ /*- @@ -407,7 +407,7 @@ lematch(parent, vcf, aux) return (ca->ca_bustype == BUS_OBIO); } #endif -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (ca->ca_bustype == BUS_SBUS) { if (!sbus_testdma((struct sbus_softc *)parent, ca)) return (0); @@ -428,7 +428,7 @@ leattach(parent, self, aux) struct confargs *ca = aux; int pri; struct bootpath *bp; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) int sbuschild = strcmp(parent->dv_cfdata->cf_driver->cd_name, "sbus") == 0; int lebufchild = strcmp(parent->dv_cfdata->cf_driver->cd_name, "lebuffer") == 0; int dmachild = strcmp(parent->dv_cfdata->cf_driver->cd_name, "ledma") == 0; @@ -446,14 +446,14 @@ leattach(parent, self, aux) printf(" pri %d", pri); sc->sc_hasifmedia = 1; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) lesc->sc_lebufchild = lebufchild; #endif lesc->sc_r1 = (struct lereg1 *) mapiodev(ca->ca_ra.ra_reg, 0, sizeof(struct lereg1)); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) lebuf = NULL; if (lebufchild) { lebuf = (struct lebuf_softc *)parent; @@ -506,17 +506,17 @@ leattach(parent, self, aux) laddr & 0xfffe0000); } /* else */ #endif /* solbourne */ -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) -#if defined(SUN4C) || defined(SUN4M) - if (sbuschild && CPU_ISSUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) + if (sbuschild && CPU_ISSUN4DOR4M) laddr = (u_long)dvma_malloc_space(MEMSIZE, &sc->sc_mem, M_NOWAIT, M_SPACE_D24); else #endif laddr = (u_long)dvma_malloc(MEMSIZE, &sc->sc_mem, M_NOWAIT); -#endif /* SUN4 || SUN4C || SUN4M */ -#if defined (SUN4M) +#endif /* SUN4 || SUN4C || SUN4D || SUN4E || SUN4M */ +#if defined(SUN4D) || defined (SUN4M) if ((laddr & 0xffffff) >= (laddr & 0xffffff) + MEMSIZE) panic("if_le: Lance buffer crosses 16MB boundary"); #endif @@ -533,7 +533,7 @@ leattach(parent, self, aux) else #endif sc->sc_conf3 = LE_C3_BSWP | LE_C3_ACON | LE_C3_BCON; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (dmachild) { lesc->sc_dma = (struct dma_softc *)parent; lesc->sc_dma->sc_le = lesc; @@ -544,7 +544,7 @@ leattach(parent, self, aux) bp = ca->ca_ra.ra_bp; switch (ca->ca_bustype) { -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) #define SAME_LANCE(bp, ca) \ ((bp->val[0] == ca->ca_slot && bp->val[1] == ca->ca_offset) || \ (bp->val[0] == -1 && bp->val[1] == sc->sc_dev.dv_unit)) @@ -554,7 +554,7 @@ leattach(parent, self, aux) SAME_LANCE(bp, ca)) bp->dev = &sc->sc_dev; break; -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ default: if (bp != NULL && strcmp(bp->name, le_cd.cd_name) == 0 && @@ -581,7 +581,7 @@ leattach(parent, self, aux) sc->sc_hwreset = lehwreset; ifmedia_init(&sc->sc_ifmedia, 0, lemediachange, lemediastatus); -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (lebufchild) { ifmedia_add(&sc->sc_ifmedia, IFM_ETHER | IFM_10_T, 0, NULL); ifmedia_set(&sc->sc_ifmedia, IFM_ETHER | IFM_10_T); diff --git a/sys/arch/sparc/dev/lebuffer.c b/sys/arch/sparc/dev/lebuffer.c index bed9669017a..65c16196158 100644 --- a/sys/arch/sparc/dev/lebuffer.c +++ b/sys/arch/sparc/dev/lebuffer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lebuffer.c,v 1.8 2010/06/26 23:24:44 guenther Exp $ */ +/* $OpenBSD: lebuffer.c,v 1.9 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: lebuffer.c,v 1.3 1997/05/24 20:16:28 pk Exp $ */ /* @@ -102,7 +102,7 @@ lebufattach(parent, self, aux) struct device *parent, *self; void *aux; { -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) register struct confargs *ca = aux; struct lebuf_softc *sc = (void *)self; int node; @@ -157,5 +157,5 @@ lebufattach(parent, self, aux) oca.ca_bustype = BUS_SBUS; (void) config_found(&sc->sc_dev, (void *)&oca, lebufprint); } -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ } diff --git a/sys/arch/sparc/dev/led.c b/sys/arch/sparc/dev/led.c index 209d5e587c2..e8fdc26f66c 100644 --- a/sys/arch/sparc/dev/led.c +++ b/sys/arch/sparc/dev/led.c @@ -1,4 +1,4 @@ -/* $OpenBSD: led.c,v 1.12 2006/08/01 18:09:40 deraadt Exp $ */ +/* $OpenBSD: led.c,v 1.13 2010/07/10 19:32:24 miod Exp $ */ /* * Copyright (c) 1998 Jason L. Wright (jason@thought.net) @@ -27,7 +27,7 @@ */ /* - * Driver for leds on the 4/100, 4/200, 4/300, and 4/600. (sun4 & sun4m) + * Driver for leds on the sun4, sun4e, and 4/600 (sun4m) systems. */ #include <sys/param.h> @@ -42,8 +42,10 @@ #include <machine/autoconf.h> #include <machine/ctlreg.h> +#include <machine/vmparam.h> #include <sparc/sparc/asm.h> #include <sparc/cpu.h> +#include <sparc/sparc/auxioreg.h> #include <sparc/sparc/cpuvar.h> #include <sparc/dev/led.h> @@ -72,10 +74,10 @@ ledmatch(parent, vcf, aux) struct device *parent; void *vcf, *aux; { -#if defined(SUN4) +#if defined(SUN4) || defined(SUN4E) struct cfdata *cf = vcf; #endif -#if defined(SUN4) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4E) || defined(SUN4M) struct confargs *ca = aux; register struct romaux *ra = &ca->ca_ra; @@ -87,16 +89,16 @@ ledmatch(parent, vcf, aux) } #endif /* SUN4M */ -#if defined(SUN4) +#if defined(SUN4) || defined(SUN4E) if (ca->ca_bustype == BUS_MAIN) { if (strcmp(cf->cf_driver->cd_name, ra->ra_name)) return (0); - if (CPU_ISSUN4) + if (CPU_ISSUN4OR4E) return (1); return (0); } -#endif /* SUN4 */ -#endif /* SUN4 || SUN4M */ +#endif /* SUN4 || SUN4E*/ +#endif /* SUN4 || SUN4E || SUN4M */ return (0); } @@ -139,21 +141,26 @@ led_cycle(v) if (sparc_led_blink == 0) sc->sc_index = 0; + s = splhigh(); + switch (cputyp) { + default: #if defined(SUN4M) - if (CPU_ISSUN4M) { - s = splhigh(); + case CPU_SUN4M: (*sc->sc_reg) = led_pattern[sc->sc_index] | 0xff00; - splx(s); - } + break; +#endif +#if defined(SUN4E) + case CPU_SUN4E: + *(volatile u_char *)(AUXREG_VA) = led_pattern[sc->sc_index]; + break; #endif - #if defined(SUN4) - if (CPU_ISSUN4) { - s = splhigh(); + case CPU_SUN4: stba(AC_DIAG_REG, ASI_CONTROL, led_pattern[sc->sc_index]); - splx(s); - } + break; #endif + } + splx(s); if (sparc_led_blink != 0) { s = (((averunnable.ldavg[0] + FSCALE) * hz) >> (FSHIFT + 3)); diff --git a/sys/arch/sparc/dev/sbus.c b/sys/arch/sparc/dev/sbus.c index 0357403db49..d177c8f45b7 100644 --- a/sys/arch/sparc/dev/sbus.c +++ b/sys/arch/sparc/dev/sbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sbus.c,v 1.16 2007/05/29 09:54:13 sobrado Exp $ */ +/* $OpenBSD: sbus.c,v 1.17 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: sbus.c,v 1.17 1997/06/01 22:10:39 pk Exp $ */ /* @@ -159,7 +159,10 @@ sbus_attach(parent, self, aux) * IS THIS THE CORRECT DEFAULT?? */ node = ra->ra_node; - sc->sc_clockfreq = getpropint(node, "clock-frequency", 25*1000*1000); + sc->sc_clockfreq = getpropint(node, "clock-frequency", -1); + if (sc->sc_clockfreq <= 0) + sc->sc_clockfreq = getpropint(findroot(), "clock-frequency", + 25 * 1000 * 1000); printf(": clock = %s MHz\n", clockfreq(sc->sc_clockfreq)); /* @@ -199,6 +202,10 @@ sbus_attach(parent, self, aux) */ for (node = firstchild(node); node; node = nextsibling(node)) { name = getpropstring(node, "name"); +#ifdef SUN4E + if (CPU_ISSUN4E && strcmp(name, "vm") == 0) + continue; +#endif if (!romprop(&oca.ca_ra, name, node)) continue; @@ -224,7 +231,7 @@ sbus_translate(dev, ca) ca->ca_slot = SBUS_ABS_TO_SLOT(base); ca->ca_offset = SBUS_ABS_TO_OFFSET(base); } else { - if (!CPU_ISSUN4C) + if (!CPU_ISSUN4C && !CPU_ISSUN4E) panic("relative sbus addressing not supported"); ca->ca_slot = slot = ca->ca_ra.ra_iospace; ca->ca_offset = base; diff --git a/sys/arch/sparc/dev/sbusreg.h b/sys/arch/sparc/dev/sbusreg.h index f6449311a5e..96d858d06d5 100644 --- a/sys/arch/sparc/dev/sbusreg.h +++ b/sys/arch/sparc/dev/sbusreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sbusreg.h,v 1.5 2007/05/29 09:54:15 sobrado Exp $ */ +/* $OpenBSD: sbusreg.h,v 1.6 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: sbusreg.h,v 1.3 1997/09/14 19:17:25 pk Exp $ */ /* @@ -51,11 +51,13 @@ * in `absolute' and `relative' address flavors, so we have to handle both. * Relative addresses do *not* include the slot number. */ -#define SBUS_BASE 0xf8000000 -#define SBUS_ADDR(slot, off) (SBUS_BASE + ((slot) << 25) + (off)) +#define SBUS_PAGE_SHIFT (13 + PAGE_SHIFT) +#define SBUS_BASE (0 - (4 << SBUS_PAGE_SHIFT)) +#define SBUS_PAGE_MASK ((1 << SBUS_PAGE_SHIFT) - 1) +#define SBUS_ADDR(slot, off) (SBUS_BASE + ((slot) << SBUS_PAGE_SHIFT) + (off)) #define SBUS_ABS(a) ((unsigned)(a) >= SBUS_BASE) -#define SBUS_ABS_TO_SLOT(a) (((a) - SBUS_BASE) >> 25) -#define SBUS_ABS_TO_OFFSET(a) (((a) - SBUS_BASE) & 0x1ffffff) +#define SBUS_ABS_TO_SLOT(a) (((a) - SBUS_BASE) >> SBUS_PAGE_SHIFT) +#define SBUS_ABS_TO_OFFSET(a) (((a) - SBUS_BASE) & SBUS_PAGE_MASK) struct sbusreg { u_int32_t sbus_afsr; /* M-to-S Asynchronous Fault Status */ diff --git a/sys/arch/sparc/dev/z8530kbd.c b/sys/arch/sparc/dev/z8530kbd.c index cad933dd4f1..08dd87c5405 100644 --- a/sys/arch/sparc/dev/z8530kbd.c +++ b/sys/arch/sparc/dev/z8530kbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: z8530kbd.c,v 1.13 2009/01/12 21:11:56 miod Exp $ */ +/* $OpenBSD: z8530kbd.c,v 1.14 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: z8530tty.c,v 1.77 2001/05/30 15:24:24 lukem Exp $ */ /*- @@ -387,7 +387,7 @@ zskbd_attach(parent, self, aux) } ss->sc_click = 0; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (!CPU_ISSUN4) { char *cp = getpropstring(optionsnode, "keyboard-click?"); diff --git a/sys/arch/sparc/dev/zs.c b/sys/arch/sparc/dev/zs.c index d3751bc31a3..10b9452daa8 100644 --- a/sys/arch/sparc/dev/zs.c +++ b/sys/arch/sparc/dev/zs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: zs.c,v 1.47 2009/04/10 20:53:51 miod Exp $ */ +/* $OpenBSD: zs.c,v 1.48 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: zs.c,v 1.50 1997/10/18 00:00:40 gwr Exp $ */ /*- @@ -96,11 +96,11 @@ int zs_major = 12; */ #define PCLK (9600 * 512) /* PCLK pin input clock rate */ -#define ZS_DELAY() (CPU_ISSUN4C ? (0) : delay(2)) +#define ZS_DELAY() ((CPU_ISSUN4C || CPU_ISSUN4E) ? (0) : delay(2)) /* The layout of this is hardware-dependent (padding, order). */ struct zschan { -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) volatile u_char zc_csr; /* ctrl,status, and indirect access */ u_char zc_xxx0; volatile u_char zc_data; /* data */ @@ -226,7 +226,7 @@ zs_match(parent, vcf, aux) return (ca->ca_bustype == BUS_OBIO); #endif - if ((ca->ca_bustype == BUS_MAIN && !CPU_ISSUN4) || + if ((ca->ca_bustype == BUS_MAIN && (CPU_ISSUN4C || CPU_ISSUN4E)) || (ca->ca_bustype == BUS_OBIO && CPU_ISSUN4M)) return (getpropint(ra->ra_node, "slave", -2) == cf->cf_unit); ra->ra_len = NBPG; @@ -828,7 +828,7 @@ zscnpollc(dev, on) /*****************************************************************/ -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) cons_decl(prom); @@ -934,7 +934,7 @@ promcnputc(dev, c) splx(s); } -#endif /* SUN4 || SUN4C || SUN4M */ +#endif /* SUN4 || SUN4C || SUN4D || SUN4E || SUN4M */ /*****************************************************************/ @@ -960,7 +960,7 @@ consinit() int channel, zs_unit; int inSource, outSink; -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) if (promvec->pv_romvec_vers > 2) { /* We need to probe the PROM device tree */ int node,fd; @@ -1068,7 +1068,7 @@ setup_output: inSource = *promvec->pv_stdin; outSink = *promvec->pv_stdout; } -#endif /* SUN4 || SUN4C || SUN4M */ +#endif /* SUN4 || SUN4C || SUN4D || SUN4E || SUN4M */ #ifdef solbourne if (CPU_ISKAP) { const char *dev; @@ -1093,7 +1093,7 @@ setup_output: } #endif -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) setup_console: #endif diff --git a/sys/arch/sparc/dev/zs_kgdb.c b/sys/arch/sparc/dev/zs_kgdb.c index 2d14aafc542..6dc0e40183c 100644 --- a/sys/arch/sparc/dev/zs_kgdb.c +++ b/sys/arch/sparc/dev/zs_kgdb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: zs_kgdb.c,v 1.3 2008/06/26 05:42:13 ray Exp $ */ +/* $OpenBSD: zs_kgdb.c,v 1.4 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: zs_kgdb.c,v 1.1 1997/10/18 00:00:51 gwr Exp $ */ /*- @@ -59,7 +59,7 @@ #define PCLK (9600 * 512) /* PCLK pin input clock rate */ #define ZSHARD_PRI 6 /* Wired on the CPU board... */ -#define ZS_DELAY() (CPU_ISSUN4C ? (0) : delay(2)) +#define ZS_DELAY() ((CPU_ISSUN4C || CPU_ISSUN4E) ? (0) : delay(2)) /* The layout of this is hardware-dependent (padding, order). */ struct zschan { diff --git a/sys/arch/sparc/include/param.h b/sys/arch/sparc/include/param.h index 71cc97bf954..dd5e29b0b39 100644 --- a/sys/arch/sparc/include/param.h +++ b/sys/arch/sparc/include/param.h @@ -1,4 +1,4 @@ -/* $OpenBSD: param.h,v 1.41 2010/06/29 21:26:09 miod Exp $ */ +/* $OpenBSD: param.h,v 1.42 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: param.h,v 1.29 1997/03/10 22:50:37 pk Exp $ */ /* @@ -136,115 +136,125 @@ extern int mmumod; #endif /* _KERNEL */ /* - * Values for the cputyp variable. + * Values for the cputyp variable. Order is important! */ #define CPU_SUN4 0 -#define CPU_SUN4C 1 -#define CPU_SUN4M 2 +#define CPU_SUN4E 1 +#define CPU_SUN4C 2 +#define CPU_SUN4M 3 +#define CPU_SUN4D 4 /* * Shorthand CPU-type macros. Enumerate all eight cases. * Let compiler optimize away code conditional on constants. * - * On a sun4 machine, the page size is 8192, while on a sun4c and sun4m - * it is 4096. Therefore, in the (SUN4 && (SUN4C || SUN4M)) cases below, - * NBPG, PGOFSET and PGSHIFT are defined as variables which are initialized - * early in locore.s after the machine type has been detected. + * On sun4 and sun4e machines, the page size is 8192, while on sun4c, sun4d + * and sun4m machines, it is 4096. Therefore, in the common case below, the + * various pagesize-related defines are defined as variables which are + * initialized early in locore.s after the machine type has been detected. * * Note that whenever the macros defined below evaluate to expressions * involving variables, the kernel will perform slightly worse due to the * extra memory references they'll generate. */ -#if defined(SUN4M) && defined(SUN4C) && defined(SUN4) -# define CPU_ISSUN4M (cputyp == CPU_SUN4M) -# define CPU_ISSUN4C (cputyp == CPU_SUN4C) -# define CPU_ISSUN4 (cputyp == CPU_SUN4) -# define CPU_ISSUN4OR4C (cputyp == CPU_SUN4 || cputyp == CPU_SUN4C) -# define CPU_ISSUN4COR4M (cputyp == CPU_SUN4C || cputyp == CPU_SUN4M) -#elif defined(SUN4M) && defined(SUN4C) && !defined(SUN4) -# define CPU_ISSUN4M (cputyp == CPU_SUN4M) -# define CPU_ISSUN4C (cputyp == CPU_SUN4C) -# define CPU_ISSUN4 (0) -# define CPU_ISSUN4OR4C (cputyp == CPU_SUN4C) -# define CPU_ISSUN4COR4M (cputyp == CPU_SUN4C || cputyp == CPU_SUN4M) -# define NBPG 4096 -# define PGOFSET (NBPG-1) -# define PGSHIFT SUN4CM_PGSHIFT -# define PAGE_SIZE 4096 -# define PAGE_MASK (PAGE_SIZE - 1) -# define PAGE_SHIFT SUN4CM_PGSHIFT -#elif defined(SUN4M) && !defined(SUN4C) && defined(SUN4) -# define CPU_ISSUN4M (cputyp == CPU_SUN4M) -# define CPU_ISSUN4C (0) -# define CPU_ISSUN4 (cputyp == CPU_SUN4) -# define CPU_ISSUN4OR4C (cputyp == CPU_SUN4) -# define CPU_ISSUN4COR4M (cputyp == CPU_SUN4M) -#elif defined(SUN4M) && !defined(SUN4C) && !defined(SUN4) -# define CPU_ISSUN4M (1) -# define CPU_ISSUN4C (0) -# define CPU_ISSUN4 (0) -# define CPU_ISSUN4OR4C (0) -# define CPU_ISSUN4COR4M (1) -# define NBPG 4096 -# define PGOFSET (NBPG-1) -# define PGSHIFT SUN4CM_PGSHIFT -# define PAGE_SIZE 4096 +#if (defined(SUN4) || defined(SUN4E)) && !(defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) +# define PAGE_SIZE 8192 # define PAGE_MASK (PAGE_SIZE - 1) -# define PAGE_SHIFT SUN4CM_PGSHIFT -#elif !defined(SUN4M) && defined(SUN4C) && defined(SUN4) -# define CPU_ISSUN4M (0) -# define CPU_ISSUN4C (cputyp == CPU_SUN4C) -# define CPU_ISSUN4 (cputyp == CPU_SUN4) -# define CPU_ISSUN4OR4C (1) -# define CPU_ISSUN4COR4M (cputyp == CPU_SUN4C) -#elif !defined(SUN4M) && defined(SUN4C) && !defined(SUN4) -# define CPU_ISSUN4M (0) -# define CPU_ISSUN4C (1) -# define CPU_ISSUN4 (0) -# define CPU_ISSUN4OR4C (1) -# define CPU_ISSUN4COR4M (1) -# define NBPG 4096 -# define PGOFSET (NBPG-1) -# define PGSHIFT SUN4CM_PGSHIFT +# define PAGE_SHIFT SUN4_PGSHIFT +#elif (defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4E)) # define PAGE_SIZE 4096 # define PAGE_MASK (PAGE_SIZE - 1) # define PAGE_SHIFT SUN4CM_PGSHIFT -#elif !defined(SUN4M) && !defined(SUN4C) && defined(SUN4) -# define CPU_ISSUN4M (0) -# define CPU_ISSUN4C (0) -# define CPU_ISSUN4 (1) -# define CPU_ISSUN4OR4C (1) -# define CPU_ISSUN4COR4M (0) -# define NBPG 8192 -# define PGOFSET (NBPG-1) -# define PGSHIFT SUN4_PGSHIFT -# define PAGE_SIZE 8192 -# define PAGE_MASK (PAGE_SIZE - 1) -# define PAGE_SHIFT SUN4_PGSHIFT -#elif !defined(SUN4M) && !defined(SUN4C) && !defined(SUN4) -# define CPU_ISSUN4M (cputyp == CPU_SUN4M) -# define CPU_ISSUN4C (cputyp == CPU_SUN4C) -# define CPU_ISSUN4 (cputyp == CPU_SUN4) -# define CPU_ISSUN4OR4C (cputyp == CPU_SUN4 || cputyp == CPU_SUN4C) -# define CPU_ISSUN4COR4M (cputyp == CPU_SUN4C || cputyp == CPU_SUN4M) -#endif - -#ifndef NBPG +#else #ifdef STANDALONE /* boot blocks */ -# define NBPG nbpg -# define PGOFSET pgofset -# define PGSHIFT pgshift # define PAGE_SIZE nbpg # define PAGE_MASK pgofset # define PAGE_SHIFT pgshift #else -# define NBPG uvmexp.pagesize -# define PGOFSET uvmexp.pagemask -# define PGSHIFT uvmexp.pageshift # define PAGE_SIZE uvmexp.pagesize # define PAGE_MASK uvmexp.pagemask # define PAGE_SHIFT uvmexp.pageshift #endif #endif +# define NBPG PAGE_SIZE +# define PGOFSET PAGE_MASK +# define PGSHIFT PAGE_SHIFT + +#if defined(SUN4) && !(defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M)) +# define CPU_ISSUN4 (1) +#elif defined(SUN4C) && !(defined(SUN4) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M)) +# define CPU_ISSUN4C (1) +#elif defined(SUN4D) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E) || defined(SUN4M)) +# define CPU_ISSUN4D (1) +#elif defined(SUN4E) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) +# define CPU_ISSUN4E (1) +#elif defined(SUN4M) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E)) +# define CPU_ISSUN4M (1) +#elif (defined(SUN4) || defined(SUN4C)) && !(defined(SUN4D) || defined(SUN4E) || defined(SUN4M)) +# define CPU_ISSUN4OR4C (1) +#elif (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) && !(defined(SUN4D) || defined(SUN4M)) +# define CPU_ISSUN4OR4COR4E (1) +#elif (defined(SUN4) || defined(SUN4E)) && !(defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) +# define CPU_ISSUN4OR4E (1) +#elif (defined(SUN4C) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4D) || defined(SUN4E)) +# define CPU_ISSUN4COR4M (1) +#elif (defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E)) +# define CPU_ISSUN4DOR4M (1) +#endif + +#if !defined(CPU_ISSUN4) +#if defined(SUN4) +# define CPU_ISSUN4 (cputyp == CPU_SUN4) +#else +# define CPU_ISSUN4 (0) +#endif +#endif +#if !defined(CPU_ISSUN4C) +#if defined(SUN4C) +# define CPU_ISSUN4C (cputyp == CPU_SUN4C) +#else +# define CPU_ISSUN4C (0) +#endif +#endif +#if !defined(CPU_ISSUN4D) +#if defined(SUN4D) +# define CPU_ISSUN4D (cputyp == CPU_SUN4D) +#else +# define CPU_ISSUN4D (0) +#endif +#endif +#if !defined(CPU_ISSUN4E) +#if defined(SUN4E) +# define CPU_ISSUN4E (cputyp == CPU_SUN4E) +#else +# define CPU_ISSUN4E (0) +#endif +#endif +#if !defined(CPU_ISSUN4M) +#if defined(SUN4M) +# define CPU_ISSUN4M (cputyp == CPU_SUN4M) +#else +# define CPU_ISSUN4M (0) +#endif +#endif + +#if !defined(CPU_ISSUN4OR4C) +# define CPU_ISSUN4OR4C (CPU_ISSUN4 || CPU_ISSUN4C) +#endif +#if !defined(CPU_ISSUN4OR4E) +# define CPU_ISSUN4OR4E (cputyp <= CPU_SUN4E) + /* (CPU_ISSUN4 || CPU_ISSUN4E) */ +#endif +#if !defined(CPU_ISSUN4OR4COR4E) +# define CPU_ISSUN4OR4COR4E (cputyp <= CPU_SUN4C) + /* (CPU_ISSUN4 || CPU_ISSUN4C || CPU_ISSUN4E) */ +#endif +#if !defined(CPU_ISSUN4COR4M) +# define CPU_ISSUN4COR4M (CPU_ISSUN4C || CPU_ISSUN4M) +#endif +#if !defined(CPU_ISSUN4DOR4M) +# define CPU_ISSUN4DOR4M (cputyp >= CPU_SUN4D) + /* (CPU_ISSUN4D || CPU_ISSUN4M) */ +#endif #endif /* _SPARC_PARAM_H_ */ diff --git a/sys/arch/sparc/include/pmap.h b/sys/arch/sparc/include/pmap.h index e4c1c780dc8..d2727b93faa 100644 --- a/sys/arch/sparc/include/pmap.h +++ b/sys/arch/sparc/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.47 2010/06/29 21:26:09 miod Exp $ */ +/* $OpenBSD: pmap.h,v 1.48 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: pmap.h,v 1.30 1997/08/04 20:00:47 pk Exp $ */ /* @@ -303,7 +303,7 @@ void pmap_writetext(unsigned char *, int); /* SUN4/SUN4C SPECIFIC DECLARATIONS */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) boolean_t pmap_clear_modify4_4c(struct vm_page *); boolean_t pmap_clear_reference4_4c(struct vm_page *); int pmap_enter4_4c(pmap_t, vaddr_t, paddr_t, vm_prot_t, int); @@ -335,7 +335,7 @@ void pmap_zero_page4m(struct vm_page *); void pmap_changeprot4m(pmap_t, vaddr_t, vm_prot_t, int); #endif /* defined SUN4M */ -#if !defined(SUN4M) && (defined(SUN4) || defined(SUN4C)) +#if !(defined(SUN4D) || defined(SUN4M)) && (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) #define pmap_clear_modify pmap_clear_modify4_4c #define pmap_clear_reference pmap_clear_reference4_4c @@ -350,7 +350,7 @@ void pmap_changeprot4m(pmap_t, vaddr_t, vm_prot_t, int); #define pmap_zero_page pmap_zero_page4_4c #define pmap_changeprot pmap_changeprot4_4c -#elif defined(SUN4M) && !(defined(SUN4) || defined(SUN4C)) +#elif (defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E)) #define pmap_clear_modify pmap_clear_modify4m #define pmap_clear_reference pmap_clear_reference4m diff --git a/sys/arch/sparc/include/pte.h b/sys/arch/sparc/include/pte.h index 0be131b3a24..cd43462a1d2 100644 --- a/sys/arch/sparc/include/pte.h +++ b/sys/arch/sparc/include/pte.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pte.h,v 1.7 2010/06/18 23:48:11 miod Exp $ */ +/* $OpenBSD: pte.h,v 1.8 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: pte.h,v 1.19 1997/08/05 11:00:10 pk Exp $ */ /* @@ -191,7 +191,7 @@ typedef u_char smeg_t; /* 8 bits needed per Sun-4 regmap entry */ #define SGOFSET (NBPSG - 1) /* mask for segment offset */ /* number of PTEs that map one segment (not number that fit in one segment!) */ -#if defined(SUN4) && (defined(SUN4C) || defined(SUN4M)) +#if (defined(SUN4) || defined(SUN4E)) && (defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) extern int nptesg; #define NPTESG nptesg /* (which someone will have to initialize) */ #else @@ -237,28 +237,28 @@ extern int mmu_has_hole; #define MMU_HOLE_START 0x20000000 #define MMU_HOLE_END 0xe0000000 -#if defined(SUN4M) /* Optimization: sun4m, sun4c have same page */ -#if defined(SUN4) /* size, so they're used interchangeably */ -#define VA_VPG(va) (cputyp==CPU_SUN4 ? VA_SUN4_VPG(va) : VA_SUN4C_VPG(va)) -#define VA_OFF(va) (cputyp==CPU_SUN4 ? VA_SUN4_OFF(va) : VA_SUN4C_OFF(va)) +#if defined(SUN4D) || defined(SUN4M) /* Optimization: sun4c/d/m have same */ +#if defined(SUN4) || defined(SUN4E) /* page size, so they're used interchangeably */ +#define VA_VPG(va) (CPU_ISSUN4OR4E ? VA_SUN4_VPG(va) : VA_SUN4C_VPG(va)) +#define VA_OFF(va) (CPU_ISSUN4OR4E ? VA_SUN4_OFF(va) : VA_SUN4C_OFF(va)) #else #define VA_VPG(va) VA_SUN4M_VPG(va) #define VA_OFF(va) VA_SUN4M_OFF(va) -#endif /* defined SUN4 */ -#else /* 4m not defined */ -#if defined(SUN4) && defined(SUN4C) -#define VA_VPG(va) (cputyp==CPU_SUN4C ? VA_SUN4C_VPG(va) : VA_SUN4_VPG(va)) -#define VA_OFF(va) (cputyp==CPU_SUN4C ? VA_SUN4C_OFF(va) : VA_SUN4_OFF(va)) +#endif /* defined SUN4 || defined SUN4E */ +#else /* 4d,4m not defined */ +#if (defined(SUN4) || defined(SUN4E)) && defined(SUN4C) +#define VA_VPG(va) (CPU_ISSUN4C ? VA_SUN4C_VPG(va) : VA_SUN4_VPG(va)) +#define VA_OFF(va) (CPU_ISSUN4C ? VA_SUN4C_OFF(va) : VA_SUN4_OFF(va)) #endif -#if defined(SUN4C) && !defined(SUN4) +#if defined(SUN4C) && !(defined(SUN4) || defined(SUN4E)) #define VA_VPG(va) VA_SUN4C_VPG(va) #define VA_OFF(va) VA_SUN4C_OFF(va) #endif -#if !defined(SUN4C) && defined(SUN4) +#if !defined(SUN4C) && (defined(SUN4) || defined(SUN4E)) #define VA_VPG(va) VA_SUN4_VPG(va) #define VA_OFF(va) VA_SUN4_OFF(va) #endif -#endif /* defined 4m */ +#endif /* defined 4d,4m */ /* there is no `struct pte'; we just use `int'; this is for non-4M only */ #define PG_V 0x80000000 @@ -272,7 +272,7 @@ extern int mmu_has_hole; #define PG_OBIO 0x04000000 /* on board I/O (incl. SBus on 4c) */ #define PG_VME16 0x08000000 /* 16-bit-data VME space */ #define PG_VME32 0x0c000000 /* 32-bit-data VME space */ -#if defined(SUN4M) +#if defined(SUN4D) || defined(SUN4M) #define PG_SUN4M_OBMEM 0x0 /* No type bits=>obmem on 4m */ #define PG_SUN4M_OBIO 0xf /* obio maps to 0xf on 4M */ #define SRMMU_PGTYPE 0xf0000000 /* Top 4 bits of pte PPN give type */ diff --git a/sys/arch/sparc/sparc/autoconf.c b/sys/arch/sparc/sparc/autoconf.c index 6aaebc18c88..fae8b8e6018 100644 --- a/sys/arch/sparc/sparc/autoconf.c +++ b/sys/arch/sparc/sparc/autoconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.c,v 1.91 2010/07/06 20:40:01 miod Exp $ */ +/* $OpenBSD: autoconf.c,v 1.92 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: autoconf.c,v 1.73 1997/07/29 09:41:53 fair Exp $ */ /* @@ -168,6 +168,43 @@ struct om_vector *oldpvec = (struct om_vector *)PROM_BASE; void bootstrap() { +#if defined(SUN4C) || defined(SUN4E) + /* + * If we are running on a sun4e system, we need to differentiate it + * from sun4c now. Note that we can't use CPU_ISSUN4C here because + * it might have been optimized depending upon the kernel + * configuration. + */ + if (cputyp == CPU_SUN4C) { + char tmpstr[24]; + u_long pgsiz; + + pgsiz = 0; + snprintf(tmpstr, sizeof tmpstr, "pagesize %x l!", + (u_long)&pgsiz); + rominterpret(tmpstr); + if (pgsiz == 1 << SUN4_PGSHIFT) { +#if defined(SUN4E) + extern int nbpg, pgofset; + + cputyp = CPU_SUN4E; + nbpg = 1 << SUN4_PGSHIFT; + pgofset = nbpg - 1; +#else + printf("OpenBSD/sparc: this kernel does not support the sun4e\n"); + romhalt(); +#endif + } else { +#if defined(SUN4C) + /* cputyp, nbpg and pgofset already set in locore */ +#else + printf("OpenBSD/sparc: this kernel does not support the sun4c\n"); + romhalt(); +#endif + } + } +#endif + #if defined(SUN4) if (CPU_ISSUN4) { extern void oldmon_w_cmd(u_long, char *); @@ -312,16 +349,16 @@ bootstrap() } #endif /* SUN4M */ -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { /* Map Interrupt Enable Register */ /* * XXX on non-Sun4, we ought to get the address from * XXX the `interrupt-enable' node. */ - pmap_kenter_pa(INTRREG_VA, - INT_ENABLE_REG_PHYSADR | PMAP_NC | PMAP_OBIO, - VM_PROT_READ | VM_PROT_WRITE); + pmap_kenter_pa(INTRREG_VA, PMAP_NC | PMAP_OBIO | + (CPU_ISSUN4E ? INT_ENABLE_REG_PHYSADR_4E : + INT_ENABLE_REG_PHYSADR_44C), VM_PROT_READ | VM_PROT_WRITE); pmap_update(pmap_kernel()); /* Disable all interrupts */ *((unsigned char *)INTRREG_VA) = 0; @@ -477,13 +514,6 @@ bootpath_fake(bp, cp) nbootpath++; \ } -#if defined(SUN4) - if (CPU_ISSUN4M) { - printf("twas brillig..\n"); - return; - } -#endif - pp = cp + 2; v0val[0] = v0val[1] = v0val[2] = 0; if (*pp == '(' /* for vi: ) */ @@ -573,7 +603,7 @@ bootpath_fake(bp, cp) } #endif /* SUN4 */ -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) /* * sun4c stuff */ @@ -621,7 +651,7 @@ bootpath_fake(bp, cp) BP_APPEND(bp, tmpname, target, lun, v0val[2]); return; } -#endif /* SUN4C */ +#endif /* SUN4C || SUN4E */ /* @@ -793,8 +823,8 @@ cpu_configure() panic("cpu_configure: ROM hasn't mapped memreg!"); } #endif -#if defined(SUN4C) - if (CPU_ISSUN4C) { +#if defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4C || CPU_ISSUN4E) { node = findroot(); cp = getpropstring(node, "device_type"); if (strcmp(cp, "cpu") != 0) @@ -819,8 +849,8 @@ cpu_configure() if (CPU_ISSUN4M) intreg_clr_4m(SINTR_MA); #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) intreg_set_44c(IE_ALLIE); #endif (void)spl0(); @@ -1069,7 +1099,7 @@ mainbus_attach(parent, dev, aux) struct confargs oca; register const char *const *ssp, *sp = NULL; struct confargs *ca = aux; -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) register int node0, node; const char *const *openboot_special; #define L1A_HACK /* XXX hack to allow L1-A during autoconf */ @@ -1105,8 +1135,22 @@ mainbus_attach(parent, dev, aux) "virtual-memory", NULL }; -#else -#define openboot_special4c ((void *)0) +#endif +#if defined(SUN4E) + static const char *const openboot_special4e[] = { + /* find these first (end with empty string) */ + "memory-error", /* as early as convenient, in case of error */ + "eeprom", + "counter-timer", + "auxiliary-io", + "", + + /* ignore these (end with NULL) */ + "interrupt-enable", + "options", + "p2bus", /* memory bus, has `eccmem' child */ + NULL + }; #endif #if defined(SUN4M) static const char *const openboot_special4m[] = { @@ -1130,8 +1174,6 @@ mainbus_attach(parent, dev, aux) /* we also skip any nodes with device_type == "cpu" */ NULL }; -#else -#define openboot_special4m ((void *)0) #endif if (CPU_ISSUN4) @@ -1177,11 +1219,29 @@ mainbus_attach(parent, dev, aux) /* * The rest of this routine is for OBP machines exclusively. */ -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) - openboot_special = CPU_ISSUN4M - ? openboot_special4m - : openboot_special4c; + switch (cputyp) { +#ifdef SUN4C + case CPU_SUN4C: + openboot_special = openboot_special4c; + break; +#endif +#ifdef SUN4E + case CPU_SUN4E: + openboot_special = openboot_special4e; + break; +#endif +#ifdef SUN4M + case CPU_SUN4M: + openboot_special = openboot_special4m; + break; +#endif + default: + /* panic("can't happen"); */ + openboot_special = NULL; + break; + } node = ca->ca_ra.ra_node; /* i.e., the root node */ @@ -1201,7 +1261,7 @@ mainbus_attach(parent, dev, aux) config_found(dev, (void *)&oca, mbprint); } } - } else if (CPU_ISSUN4C) { + } else if (CPU_ISSUN4C || CPU_ISSUN4E) { bzero(&oca, sizeof(oca)); oca.ca_ra.ra_node = node; oca.ca_ra.ra_name = "cpu"; @@ -1257,8 +1317,8 @@ mainbus_attach(parent, dev, aux) for (node = node0; node; node = nextsibling(node)) { register const char *cp; -#if defined(SUN4M) - if (CPU_ISSUN4M) /* skip the CPUs */ +#if defined(SUN4D) || defined(SUN4M) + if (CPU_ISSUN4DOR4M) /* skip the CPUs */ if (node_has_property(node, "device_type") && !strcmp(getpropstring(node, "device_type"), "cpu")) continue; @@ -1280,7 +1340,22 @@ mainbus_attach(parent, dev, aux) (void) config_found(dev, (void *)&oca, mbprint); } } -#endif /* SUN4C || SUN4M */ + +#if defined(SUN4E) + if (CPU_ISSUN4E) { + /* + * Attach the leds. + * XXX This is not a natural attachment, but since there + * XXX is more than one led, this does not fit in the usual + * XXX auxio blink framework. + */ + bzero(&oca, sizeof(oca)); + oca.ca_bustype = BUS_MAIN; + oca.ca_ra.ra_name = "led"; + config_found(dev, (void *)&oca, mbprint); + } +#endif +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ } struct cfattach mainbus_ca = { @@ -1334,8 +1409,8 @@ findzs(zs) } #endif -#if defined(SUN4C) || defined(SUN4M) - if (CPU_ISSUN4COR4M) { +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) + if (!CPU_ISSUN4) { int node; node = firstchild(findroot()); @@ -1371,7 +1446,7 @@ findzs(zs) int makememarr(struct memarr *ap, u_int xmax, int which) { -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) struct v0mlist *mp; int node, n; char *prop; @@ -1382,6 +1457,11 @@ makememarr(struct memarr *ap, u_int xmax, int which) panic("makememarr"); #endif +#ifdef DIAGNOSTIC + if (which != MEMARR_AVAILPHYS && which != MEMARR_TOTALPHYS) + panic("makememarr"); +#endif + #if defined(SUN4) if (CPU_ISSUN4) { if (ap != NULL && xmax != 0) { @@ -1393,7 +1473,7 @@ makememarr(struct memarr *ap, u_int xmax, int which) return 1; } #endif -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) switch (n = promvec->pv_romvec_vers) { case 0: /* @@ -1437,7 +1517,7 @@ makememarr(struct memarr *ap, u_int xmax, int which) if (n <= 0) panic("makememarr: no memory found"); return (n); -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ } /* @@ -1450,7 +1530,7 @@ getprop(node, name, buf, bufsiz) void *buf; register int bufsiz; { -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) register struct nodeops *no; register int len; #endif @@ -1462,7 +1542,7 @@ getprop(node, name, buf, bufsiz) } #endif -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) no = promvec->pv_nodeops; len = no->no_proplen(node, name); if (len > bufsiz) { @@ -1652,7 +1732,7 @@ romgetcursoraddr(rowp, colp) void romhalt() { - if (CPU_ISSUN4COR4M) + if (!CPU_ISSUN4) *promvec->pv_synchook = NULL; promvec->pv_halt(); @@ -1663,7 +1743,7 @@ void romboot(str) char *str; { - if (CPU_ISSUN4COR4M) + if (!CPU_ISSUN4) *promvec->pv_synchook = NULL; promvec->pv_reboot(str); @@ -1733,8 +1813,8 @@ device_register(struct device *dev, void *aux) } #endif -#if defined(SUN4C) - if (CPU_ISSUN4C && dev->dv_xname[0] == 's') +#if defined(SUN4C) || defined(SUN4E) + if ((CPU_ISSUN4C || CPU_ISSUN4E) && dev->dv_xname[0] == 's') target = sd_crazymap(target); #endif diff --git a/sys/arch/sparc/sparc/auxreg.c b/sys/arch/sparc/sparc/auxreg.c index 30976b6afa0..519e965e045 100644 --- a/sys/arch/sparc/sparc/auxreg.c +++ b/sys/arch/sparc/sparc/auxreg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auxreg.c,v 1.14 2007/07/01 19:07:46 miod Exp $ */ +/* $OpenBSD: auxreg.c,v 1.15 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: auxreg.c,v 1.21 1997/05/24 20:15:59 pk Exp $ */ /* @@ -124,6 +124,7 @@ auxregmatch(struct device *parent, void *cf, void *aux) default: return (0); case CPU_SUN4C: + case CPU_SUN4E: return (strcmp("auxiliary-io", ca->ca_ra.ra_name) == 0); case CPU_SUN4M: return (strcmp("auxio", ca->ca_ra.ra_name) == 0 || diff --git a/sys/arch/sparc/sparc/cache.c b/sys/arch/sparc/sparc/cache.c index 9fb0a2599cf..57f9a8e8db9 100644 --- a/sys/arch/sparc/sparc/cache.c +++ b/sys/arch/sparc/sparc/cache.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cache.c,v 1.19 2010/06/29 21:24:41 miod Exp $ */ +/* $OpenBSD: cache.c,v 1.20 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: cache.c,v 1.34 1997/09/26 22:17:23 pk Exp $ */ /* @@ -89,10 +89,10 @@ sun4_cache_enable() { u_int i, lim, ls, ts; - cache_alias_bits = CPU_ISSUN4 + cache_alias_bits = CPU_ISSUN4OR4E ? CACHE_ALIAS_BITS_SUN4 : CACHE_ALIAS_BITS_SUN4C; - cache_alias_dist = CPU_ISSUN4 + cache_alias_dist = CPU_ISSUN4OR4E ? CACHE_ALIAS_DIST_SUN4 : CACHE_ALIAS_DIST_SUN4C; @@ -357,7 +357,7 @@ turbosparc_cache_enable() } #endif /* defined(SUN4M) */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * Flush the current context from the cache. * @@ -548,7 +548,7 @@ sun4_cache_flush(base, len) sun4_vcache_flush_context(); } } -#endif /* defined(SUN4) || defined(SUN4C) */ +#endif /* SUN4 || SUN4C || SUN4E */ #if defined(SUN4M) /* diff --git a/sys/arch/sparc/sparc/cache.h b/sys/arch/sparc/sparc/cache.h index d8cfa200bc9..4a2fcffb7c5 100644 --- a/sys/arch/sparc/sparc/cache.h +++ b/sys/arch/sparc/sparc/cache.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cache.h,v 1.10 2007/01/22 19:39:33 miod Exp $ */ +/* $OpenBSD: cache.h,v 1.11 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: cache.h,v 1.16 1997/07/06 21:15:14 pk Exp $ */ /* @@ -122,10 +122,10 @@ extern int cache_alias_dist; extern int cache_alias_bits; /* Optimize cache alias macros on single architecture kernels */ -#if defined(SUN4) && !defined(SUN4C) && !defined(SUN4M) +#if (defined(SUN4) || defined(SUN4E)) && !(defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) #define CACHE_ALIAS_DIST CACHE_ALIAS_DIST_SUN4 #define CACHE_ALIAS_BITS CACHE_ALIAS_BITS_SUN4 -#elif !defined(SUN4) && defined(SUN4C) && !defined(SUN4M) +#elif !(defined(SUN4) || defined(SUN4E)) && defined(SUN4C) && !(defined(SUN4D) || defined(SUN4M)) #define CACHE_ALIAS_DIST CACHE_ALIAS_DIST_SUN4C #define CACHE_ALIAS_BITS CACHE_ALIAS_BITS_SUN4C #else diff --git a/sys/arch/sparc/sparc/clock.c b/sys/arch/sparc/sparc/clock.c index d043e7c6834..382b3266470 100644 --- a/sys/arch/sparc/sparc/clock.c +++ b/sys/arch/sparc/sparc/clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.c,v 1.25 2010/07/06 20:40:01 miod Exp $ */ +/* $OpenBSD: clock.c,v 1.26 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: clock.c,v 1.52 1997/05/24 20:16:05 pk Exp $ */ /* @@ -377,8 +377,7 @@ clockattach(parent, self, aux) if (CPU_ISSUN4) prop = "mk48t02"; - - else if (CPU_ISSUN4COR4M) + else if (!CPU_ISSUN4) prop = getpropstring(ra->ra_node, "model"); printf(": %s (eeprom)\n", prop); @@ -455,7 +454,7 @@ timermatch(parent, vcf, aux) return (1); } - if (CPU_ISSUN4C) { + if (CPU_ISSUN4C || CPU_ISSUN4E) { return (strcmp("counter-timer", ca->ca_ra.ra_name) == 0); } @@ -492,11 +491,11 @@ timerattach(parent, self, aux) lim = &counterreg_4m->t_limit; } - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { /* * This time, we ignore any existing virtual address because * we have a fixed virtual address for the timer, to make - * microtime() faster (in SUN4/SUN4C kernel only). + * microtime() faster (in SUN4/SUN4C/SUN4E kernel only). */ (void)mapdev(ra->ra_reg, TIMERREG_VA, 0, sizeof(struct timerreg_4)); @@ -644,7 +643,7 @@ cpu_initclocks() counterreg_4m->t_limit = tmr_ustolim4m(statint); } - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { timerreg4->t_c10.t_limit = tmr_ustolim(tick); timerreg4->t_c14.t_limit = tmr_ustolim(statint); } @@ -656,8 +655,8 @@ cpu_initclocks() intreg_clr_4m(SINTR_T); #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) intreg_set_44c(IE_L14 | IE_L10); #endif } @@ -705,8 +704,8 @@ clockintr(cap) discard = timerreg_4m->t_limit; } #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { discard = timerreg4->t_c10.t_limit; } #endif @@ -749,7 +748,7 @@ statintr(cap) } } - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { discard = timerreg4->t_c14.t_limit; } statclock((struct clockframe *)cap); @@ -769,7 +768,7 @@ statintr(cap) counterreg_4m->t_limit = tmr_ustolim4m(newint); } - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { timerreg4->t_c14.t_limit = tmr_ustolim(newint); } return (1); diff --git a/sys/arch/sparc/sparc/conf.c b/sys/arch/sparc/sparc/conf.c index a6f1969a5b5..78a1a281285 100644 --- a/sys/arch/sparc/sparc/conf.c +++ b/sys/arch/sparc/sparc/conf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.c,v 1.52 2010/07/03 03:59:17 krw Exp $ */ +/* $OpenBSD: conf.c,v 1.53 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: conf.c,v 1.40 1996/04/11 19:20:03 thorpej Exp $ */ /* @@ -205,7 +205,7 @@ struct cdevsw cdevsw[] = cdev_notdef(), /* 67: was /dev/cgsix */ cdev_notdef(), /* 68 */ cdev_gen_init(NAUDIO,audio), /* 69: /dev/audio */ -#if defined(SUN4) || defined(SUN4C) || defined(SUN4M) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) cdev_openprom_init(1,openprom), /* 70: /dev/openprom */ #else cdev_notdef(), /* 70 */ diff --git a/sys/arch/sparc/sparc/cpu.c b/sys/arch/sparc/sparc/cpu.c index 45e01bbd18f..983cccd6e69 100644 --- a/sys/arch/sparc/sparc/cpu.c +++ b/sys/arch/sparc/sparc/cpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.c,v 1.46 2010/06/07 19:54:33 miod Exp $ */ +/* $OpenBSD: cpu.c,v 1.47 2010/07/10 19:32:24 miod Exp $ */ /* $NetBSD: cpu.c,v 1.56 1997/09/15 20:52:36 pk Exp $ */ /* @@ -189,20 +189,30 @@ cpu_attach(parent, self, aux) bcopy(&cpuinfo, sc, sizeof(cpuinfo)); } -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) switch (cputyp) { #if defined(SUN4C) case CPU_SUN4C: cpu_class = "sun4c"; break; #endif /* defined(SUN4C) */ +#if defined(SUN4D) + case CPU_SUN4D: + cpu_class = "sun4d"; + break; +#endif /* defined(SUN4D) */ +#if defined(SUN4E) + case CPU_SUN4E: + cpu_class = "sun4e"; + break; +#endif /* defined(SUN4E) */ #if defined(SUN4M) case CPU_SUN4M: cpu_class = "sun4m"; break; #endif /* defined(SUN4M) */ } -#endif /* defined(SUN4C) || defined(SUN4M) */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ getcpuinfo(sc, node); @@ -535,7 +545,7 @@ cpumatch_sun4(sc, mp, node) } #endif /* SUN4 */ -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) struct module_info module_sun4c = { CPUTYP_UNKNOWN, VAC_WRITETHROUGH, @@ -568,7 +578,7 @@ cpumatch_sun4c(sc, mp, node) rnode = findroot(); sc->mmu_npmeg = sc->mmu_nsegment = - getpropint(rnode, "mmu-npmg", 128); + getpropint(rnode, "mmu-npmg", CPU_ISSUN4E ? 256 : 128); sc->mmu_ncontext = getpropint(rnode, "mmu-nctx", 8); /* Get clock frequency */ @@ -617,7 +627,7 @@ getcacheinfo_sun4c(sc, node) if (getpropint(node, "buserr-type", 0) == 1) sc->flags |= CPUFLG_SUN4CACHEBUG; } -#endif /* SUN4C */ +#endif /* SUN4C || SUN4E */ #if defined(solbourne) struct module_info module_kap = { @@ -1196,6 +1206,10 @@ struct cpu_conf { { CPU_SUN4C, 9, 0, ANY, ANY, "W8601/8701 or MB86903", &module_sun4c }, #endif +#if defined(SUN4E) + { CPU_SUN4E, 0, 0, ANY, ANY, "MB86900/1A or L64801", &module_sun4c }, +#endif + #if defined(SUN4M) { CPU_SUN4M, 0, 4, 0, 4, "MB86904", &module_swift }, { CPU_SUN4M, 0, 5, 0, 5, "MB86907", &module_turbosparc }, diff --git a/sys/arch/sparc/sparc/intr.c b/sys/arch/sparc/sparc/intr.c index 80041ae3627..3509ce4c5cb 100644 --- a/sys/arch/sparc/sparc/intr.c +++ b/sys/arch/sparc/sparc/intr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: intr.c,v 1.33 2010/07/06 20:40:01 miod Exp $ */ +/* $OpenBSD: intr.c,v 1.34 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: intr.c,v 1.20 1997/07/29 09:42:03 fair Exp $ */ /* @@ -468,8 +468,8 @@ softintr_establish(int level, void (*fn)(void *), void *arg) * passed to intreg_set_44c(). */ ipl = hw = level; -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { /* * Select the most suitable of the three available * softintr levels. @@ -540,8 +540,9 @@ softintr_schedule(void *arg) raise(0, sih->sih_hw); break; #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) case CPU_SUN4: + case CPU_SUN4E: case CPU_SUN4C: intreg_set_44c(sih->sih_hw); break; diff --git a/sys/arch/sparc/sparc/intreg.h b/sys/arch/sparc/sparc/intreg.h index 1a8439fb9ef..cf7bdc66c20 100644 --- a/sys/arch/sparc/sparc/intreg.h +++ b/sys/arch/sparc/sparc/intreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: intreg.h,v 1.10 2010/07/06 20:40:01 miod Exp $ */ +/* $OpenBSD: intreg.h,v 1.11 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: intreg.h,v 1.6 1997/07/22 20:19:10 pk Exp $ */ /* @@ -43,7 +43,7 @@ #include <sparc/sparc/vaddrs.h> -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * sun4c interrupt enable register. @@ -55,7 +55,8 @@ * must be mapped early in the boot process (otherwise NMI handling * will fail). */ -#define INT_ENABLE_REG_PHYSADR 0xf5000000 /* phys addr in IOspace */ +#define INT_ENABLE_REG_PHYSADR_44C 0xf5000000 +#define INT_ENABLE_REG_PHYSADR_4E 0xea000000 /* * Bits in interrupt enable register. Software interrupt requests must @@ -75,7 +76,7 @@ void intreg_set_44c(int); /* set given bits */ void intreg_clr_44c(int); /* clear given bits */ #endif -#endif /* SUN4 || SUN4C */ +#endif /* SUN4 || SUN4C || SUN4E */ #if defined(SUN4M) diff --git a/sys/arch/sparc/sparc/iommu.c b/sys/arch/sparc/sparc/iommu.c index b8ec3070051..4f7261bb01e 100644 --- a/sys/arch/sparc/sparc/iommu.c +++ b/sys/arch/sparc/sparc/iommu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: iommu.c,v 1.24 2010/06/17 16:11:19 miod Exp $ */ +/* $OpenBSD: iommu.c,v 1.25 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: iommu.c,v 1.13 1997/07/29 09:42:04 fair Exp $ */ /* @@ -145,7 +145,7 @@ iommu_match(parent, vcf, aux) register struct confargs *ca = aux; register struct romaux *ra = &ca->ca_ra; - if (CPU_ISSUN4OR4C) + if (CPU_ISSUN4OR4COR4E) return (0); return (strcmp(cf->cf_driver->cd_name, ra->ra_name) == 0); } diff --git a/sys/arch/sparc/sparc/kgdb_machdep.c b/sys/arch/sparc/sparc/kgdb_machdep.c index 29369983ef5..e507484bc24 100644 --- a/sys/arch/sparc/sparc/kgdb_machdep.c +++ b/sys/arch/sparc/sparc/kgdb_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kgdb_machdep.c,v 1.9 2008/06/26 05:42:13 ray Exp $ */ +/* $OpenBSD: kgdb_machdep.c,v 1.10 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: kgdb_machdep.c,v 1.1 1997/08/31 21:22:45 pk Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -98,7 +98,7 @@ lda(((vaddr_t)va & 0xFFFFF000) | ASI_SRMMUFP_L3, ASI_SRMMUFP) #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) #define getpte4(va) lda(va, ASI_PTE) #define setpte4(va, pte) sta(va, ASI_PTE, pte) #endif @@ -274,8 +274,8 @@ kgdb_acc(vaddr_t va, size_t len) return (0); } #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4C || CPU_ISSUN4) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { pte = getpte4(va); if ((pte & PG_V) == 0) return (0); diff --git a/sys/arch/sparc/sparc/locore.s b/sys/arch/sparc/sparc/locore.s index 36d89c293be..527a1ba414b 100644 --- a/sys/arch/sparc/sparc/locore.s +++ b/sys/arch/sparc/sparc/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.87 2010/07/06 20:40:01 miod Exp $ */ +/* $OpenBSD: locore.s,v 1.88 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: locore.s,v 1.73 1997/09/13 20:36:48 pk Exp $ */ /* @@ -187,11 +187,11 @@ curproc = CPUINFO_VA + CPUINFO_CURPROC /* * cputyp is the current cpu type, used to distinguish between * the many variations of different sun4* machines. It contains - * the value CPU_SUN4, CPU_SUN4C, or CPU_SUN4M. + * the value CPU_SUN4, CPU_SUN4C, CPU_SUN4D, CPU_SUN4E or CPU_SUN4M. */ .globl _C_LABEL(cputyp) _C_LABEL(cputyp): - .word 1 + .word CPU_SUN4C /* * cpumod is the current cpu model, used to distinguish between variants * in the Sun4 and Sun4M families. See /sys/arch/sparc/include/param.h for @@ -209,7 +209,7 @@ _C_LABEL(cpumod): _C_LABEL(mmumod): .word 0 -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) _C_LABEL(cputypval): .asciz "sun4c" .ascii " " @@ -225,6 +225,7 @@ _C_LABEL(cputypvallen) = _C_LABEL(cputypvar) - _C_LABEL(cputypval) .globl _C_LABEL(nbpg) _C_LABEL(nbpg): .word 0 + .globl _C_LABEL(pgofset) _C_LABEL(pgofset): .word 0 @@ -240,7 +241,7 @@ sun4m_notsup: sun4d_notsup: .asciz "cr .( OpenBSD/sparc: this kernel does not support the sun4d) cr" #endif -#if !defined(SUN4C) +#if !(defined(SUN4C) || defined(SUN4E)) sun4c_notsup: .asciz "cr .( OpenBSD/sparc: this kernel does not support the sun4c) cr" #endif @@ -347,11 +348,13 @@ sun4_notsup: #define ZS_INTERRUPT4M HARDINT4M(12) #endif + .text .globl start, _C_LABEL(kernel_text) _C_LABEL(kernel_text): start: /* - * Put sun4 traptable first, since it needs the most stringent alignment (8192) + * Put sun4 and sun4e traptables first, since they need the most stringent + * alignment (8192). */ #if defined(SUN4) trapbase_sun4: @@ -612,11 +615,19 @@ trapbase_sun4: STRAP(0xfd) STRAP(0xfe) STRAP(0xff) +#endif /* SUN4 */ + +#if defined(SUN4) && defined(SUN4E) + /* + * Make sure the sun4e trap table (which is the same as the sun4c + * table until we support VME interrupts) is properly page-aligned. + */ + .skip 4096 #endif -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) trapbase_sun4c: -/* trap 0 is special since we cannot receive it */ + /* trap 0 is special since we cannot receive it */ b dostart; nop; nop; nop ! 00 = reset (fake) VTRAP(T_TEXTFAULT, memfault_sun4c) ! 01 = instr. fetch fault TRAP(T_ILLINST) ! 02 = illegal instruction @@ -1136,15 +1147,22 @@ trapbase_sun4m: STRAP(0xff) #endif +#if (defined(SUN4) || defined(SUN4E)) /* * Pad the trap table to max page size. * Trap table size is 0x100 * 4instr * 4byte/instr = 4096 bytes; * need to .skip 4096 to pad to page size iff. the number of trap tables * defined above is odd. */ -#if (defined(SUN4) + defined(SUN4C) + defined(SUN4M)) % 2 == 1 +/* + * SUN4 && !SUN4E => pad if only one of 4C and 4M is set + * SUN4E => pad if 4M is not set + */ +#if (!defined(SUN4E) && (defined(SUN4C) + defined(SUN4M)) == 1) || \ + (defined(SUN4E) && !defined(SUN4M)) .skip 4096 #endif +#endif #ifdef DEBUG /* @@ -1227,7 +1245,7 @@ Lpanic_red: * The code below also assumes that PTE_OF_ADDR is safe in a delay * slot; it is, at it merely sets its `pte' register to a temporary value. */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* input: addr, output: pte; aux: bad address label */ #define PTE_OF_ADDR4_4C(addr, pte, bad, page_offset) \ sra addr, PG_VSHIFT, pte; \ @@ -1289,14 +1307,14 @@ Lpanic_red: cmp pte, (SRMMU_TEPTE | PPROT_WRITE) #endif /* 4m */ -#if defined(SUN4M) && !(defined(SUN4C) || defined(SUN4)) +#if (defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E)) #define PTE_OF_ADDR(addr, pte, bad, page_offset, label) \ PTE_OF_ADDR4M(addr, pte, bad, page_offset) #define CMP_PTE_USER_WRITE(pte, tmp, label) CMP_PTE_USER_WRITE4M(pte,tmp) #define CMP_PTE_USER_READ(pte, tmp, label) CMP_PTE_USER_READ4M(pte,tmp) -#elif (defined(SUN4C) || defined(SUN4)) && !defined(SUN4M) +#elif (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) && !(defined(SUN4D) || defined(SUN4M)) #define PTE_OF_ADDR(addr, pte, bad, page_offset,label) \ PTE_OF_ADDR4_4C(addr, pte, bad, page_offset) @@ -1780,14 +1798,14 @@ memfault_sun4: sethi %hi(SER_WRITE), %o5 ! damn SER_WRITE wont fit simm13 ! or %lo(SER_WRITE), %o5, %o5! not necessary since %lo is zero or %o5, %o1, %o1 ! set SER_WRITE -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) ba,a normal_mem_fault !!nop ! XXX make efficient later -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ #endif /* SUN4 */ memfault_sun4c: -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) TRAP_SETUP(-CCFSZ-80) INCR(_C_LABEL(uvmexp)+V_FAULTS) ! cnt.v_faults++ (clobbers %o0,%o1) @@ -1882,7 +1900,7 @@ memfault_sun4c: b return_from_trap wr %l0, 0, %psr /* NOTREACHED */ -#endif /* SUN4C */ +#endif /* SUN4C || SUN4E */ #if defined(SUN4M) memfault_sun4m: @@ -2401,9 +2419,9 @@ softintr_common: * _sparc_interrupt{44c,4m} is exported for paranoia checking * (see intr.c). */ -#if defined(SUN4M) .globl _C_LABEL(sparc_interrupt4m) _C_LABEL(sparc_interrupt4m): +#if defined(SUN4D) || defined(SUN4M) mov 1, %l4 sethi %hi(ICR_PI_PEND), %l5 ld [%l5 + %lo(ICR_PI_PEND)], %l5 ! get pending interrupts @@ -2424,13 +2442,11 @@ _C_LABEL(sparc_interrupt4m): ld [%l6 + %lo(ICR_PI_PEND)], %g0 b,a softintr_common -#endif +#endif /* SUN4D || SUN4M */ -#if defined(SUN4) || defined(SUN4C) +sparc_interrupt_common: .globl _C_LABEL(sparc_interrupt44c) _C_LABEL(sparc_interrupt44c): -#endif -sparc_interrupt_common: INTR_SETUP(-CCFSZ-80) std %g2, [%sp + CCFSZ + 24] ! save registers INCR(_C_LABEL(uvmexp)+V_INTR) ! cnt.v_intr++; (clobbers %o0,%o1) @@ -2491,25 +2507,6 @@ sparc_interrupt_common: b 5b std %l4, [%l3 + IH_COUNT] -#ifdef notyet -/* - * Level 12 (ZS serial) interrupt. Handle it quickly, schedule a - * software interrupt, and get out. Do the software interrupt directly - * if we would just take it on the way out. - * - * Input: - * %l0 = %psr - * %l1 = return pc - * %l2 = return npc - * Internal: - * %l3 = zs device - * %l4, %l5 = temporary - * %l6 = rr3 (or temporary data) + 0x100 => need soft int - * %l7 = zs soft status - */ -zshard: -#endif /* notyet */ - /* * Level 15 interrupt. An async memory error has occurred; * take care of it (typically by panicking, but hey...). @@ -2551,12 +2548,12 @@ nmi_sun4: mov %g1, %l5 ! save g1, g6, g7 mov %g6, %l6 mov %g7, %l7 -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4E) b,a nmi_common -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C */ #endif -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) nmi_sun4c: INTR_SETUP(-CCFSZ-80) INCR(_C_LABEL(uvmexp)+V_INTR) ! cnt.v_intr++; (clobbers %o0,%o1) @@ -2586,11 +2583,12 @@ nmi_sun4c: lda [%o0] ASI_CONTROL, %o3 ! async err reg inc 4, %o0 lda [%o0] ASI_CONTROL, %o4 ! async virt addr -#if defined(SUN4M) +#if defined(SUN4) !!b,a nmi_common -#endif /* SUN4M */ -#endif /* SUN4C */ +#endif /* SUN4 */ +#endif /* SUN4C || SUN4E */ +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) nmi_common: ! and call C code call _C_LABEL(memerr4_4c) @@ -2610,6 +2608,7 @@ nmi_common: stb %o1, [%o0 + %lo(INTRREG_VA)] b return_from_trap wr %l4, 0, %y ! restore y +#endif /* SUN4 || SUN4C || SUN4E */ #if defined(SUN4M) nmi_sun4m: @@ -3439,11 +3438,11 @@ dostart: be is_sun4 nop -#if defined(SUN4C) || defined(SUN4M) +#if defined(SUN4C) || defined(SUN4D) || defined(SUN4E) || defined(SUN4M) mov %o0, %g7 ! save prom vector pointer /* - * are we on a sun4c, sun4d or a sun4m? + * are we on a sun4c, sun4d, sun4e or a sun4m? */ ld [%g7 + PV_NODEOPS], %o4 ! node = pv->pv_nodeops->no_nextnode(0) ld [%o4 + NO_NEXTNODE], %o4 @@ -3468,9 +3467,9 @@ dostart: cmp %o0, 'm' be is_sun4m nop -#endif /* SUN4C || SUN4M */ +#endif /* SUN4C || SUN4D || SUN4E || SUN4M */ - ! ``on a sun4e or sun4u? hell no!'' + ! ``on a sun4u? hell no!'' ld [%g7 + PV_HALT], %o1 ! by this kernel, then halt call %o1 nop @@ -3508,7 +3507,11 @@ is_sun4d: /*NOTREACHED*/ #endif is_sun4c: -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) + /* + * Assume sun4c for now; bootstrap() will check for the pagesize + * and will update the page size variables as well as cputyp. + */ set trapbase_sun4c, %g6 mov SUN4CM_PGSHIFT, %g5 @@ -3516,7 +3519,7 @@ is_sun4c: stba %g0, [%g1] ASI_CONTROL b start_havetype - mov CPU_SUN4C, %g4 ! XXX CPU_SUN4 + mov CPU_SUN4C, %g4 #else RELOCATE(sun4c_notsup, %o0) @@ -3598,7 +3601,7 @@ start_havetype: * Need different initial mapping functions for different * types of machines. */ -#if defined(SUN4C) +#if defined(SUN4C) || defined(SUN4E) cmp %g4, CPU_SUN4C bne 1f set 1 << 18, %l3 ! segment size in bytes @@ -3611,7 +3614,7 @@ start_havetype: add %l3, %l0, %l0 ! (and lowva += segsz) b,a startmap_done 1: -#endif /* SUN4C */ +#endif /* SUN4C || SUN4E */ #if defined(SUN4) cmp %g4, CPU_SUN4 @@ -3800,7 +3803,7 @@ startmap_done: call init_tables st %o0, [%o1 + %lo(_C_LABEL(nwindows))] -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * Some sun4/sun4c models have fewer than 8 windows. For extra * speed, we do not need to save/restore those windows @@ -3819,7 +3822,7 @@ noplab: nop 1: #endif -#if ((defined(SUN4) || defined(SUN4C)) && defined(SUN4M)) +#if ((defined(SUN4) || defined(SUN4C) || defined(SUN4E)) && (defined(SUN4D) || defined(SUN4M))) /* * Patch instructions at specified labels that start @@ -3835,7 +3838,7 @@ Lgandul: nop ld [%o0 + %lo(Lgandul)], %l0 ! %l0 = NOP cmp %g4, CPU_SUN4M - bne,a 1f + blu,a 1f nop ! this should be automated! @@ -4529,14 +4532,14 @@ Lsw_load: /* p does have a context: just switch to it */ Lsw_havectx: ! context is in %o0 -#if (defined(SUN4) || defined(SUN4C)) && defined(SUN4M) +#if (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) && (defined(SUN4D) || defined(SUN4M)) sethi %hi(_C_LABEL(cputyp)), %o1 ! what cpu are we running on? ld [%o1 + %lo(_C_LABEL(cputyp))], %o1 cmp %o1, CPU_SUN4M - be 1f + bge 1f nop #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) set AC_CONTEXT, %o1 retl stba %o0, [%o1] ASI_CONTROL ! setcontext(vm->vm_map.pmap->pm_ctxnum); @@ -5388,7 +5391,7 @@ ENTRY(loadfpstate) * Set and clear bits in the interrupt register. */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * Since there are no read-modify-write instructions for this, * and one of the interrupts is nonmaskable, we must disable traps. @@ -5420,7 +5423,7 @@ ENTRY(intreg_clr_44c) nop retl nop -#endif /* SUN4 || SUN4C */ +#endif /* SUN4 || SUN4C || SUN4E */ #if defined(SUN4M) /* @@ -5943,10 +5946,10 @@ ENTRY(microtime) #endif sethi %hi(_C_LABEL(time)), %g2 -#if defined(SUN4M) && !(defined(SUN4C) || defined(SUN4)) +#if (defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E)) sethi %hi(TIMERREG_VA+4), %g3 or %g3, %lo(TIMERREG_VA+4), %g3 -#elif (defined(SUN4C) || defined(SUN4)) && !defined(SUN4M) +#elif (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) && !(defined(SUN4D) || defined(SUN4M)) sethi %hi(TIMERREG_VA), %g3 or %g3, %lo(TIMERREG_VA), %g3 #else diff --git a/sys/arch/sparc/sparc/pmap.c b/sys/arch/sparc/sparc/pmap.c index d05914798d6..77121c067f9 100644 --- a/sys/arch/sparc/sparc/pmap.c +++ b/sys/arch/sparc/sparc/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.156 2010/06/30 20:35:03 miod Exp $ */ +/* $OpenBSD: pmap.c,v 1.157 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: pmap.c,v 1.118 1998/05/19 19:00:18 thorpej Exp $ */ /* @@ -384,7 +384,7 @@ vaddr_t pagetables_start, pagetables_end; static void pmap_page_upload(void); void pmap_release(pmap_t); -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) int mmu_has_hole; #endif @@ -428,12 +428,12 @@ static u_long segfixmask = 0xffffffff; /* all bits valid to start */ ? setcontext4m(c) \ : setcontext4(c) ) -#define getsegmap(va) (CPU_ISSUN4C \ - ? lduba(va, ASI_SEGMAP) \ - : (lduha(va, ASI_SEGMAP) & segfixmask)) -#define setsegmap(va, pmeg) (CPU_ISSUN4C \ - ? stba(va, ASI_SEGMAP, pmeg) \ - : stha(va, ASI_SEGMAP, pmeg)) +#define getsegmap(va) (CPU_ISSUN4 \ + ? (lduha(va, ASI_SEGMAP) & segfixmask) \ + : lduba(va, ASI_SEGMAP)) +#define setsegmap(va, pmeg) (CPU_ISSUN4 \ + ? stha(va, ASI_SEGMAP, pmeg) \ + : stba(va, ASI_SEGMAP, pmeg)) /* 3-level sun4 MMU only: */ #define getregmap(va) ((unsigned)lduha((va)+2, ASI_REGMAP) >> 8) @@ -447,7 +447,7 @@ static __inline void setpgt4m(int *, int); void setpte4m(vaddr_t va, int pte); #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) #define getpte4(va) lda(va, ASI_PTE) #define setpte4(va, pte) sta(va, ASI_PTE, pte) #endif @@ -483,7 +483,7 @@ int pv_link4m(struct pvlist *, struct pmap *, vaddr_t, int); void pv_unlink4m(struct pvlist *, struct pmap *, vaddr_t); #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void mmu_reservemon4_4c(int *, int *); void pmap_rmk4_4c(struct pmap *, vaddr_t, vaddr_t, int, int); void pmap_rmu4_4c(struct pmap *, vaddr_t, vaddr_t, int, int); @@ -497,11 +497,11 @@ int pv_link4_4c(struct pvlist *, struct pmap *, vaddr_t, int); void pv_unlink4_4c(struct pvlist *, struct pmap *, vaddr_t); #endif -#if !defined(SUN4M) && (defined(SUN4) || defined(SUN4C)) +#if !(defined(SUN4D) || defined(SUN4M)) && (defined(SUN4) || defined(SUN4C) || defined(SUN4E)) #define pmap_rmk pmap_rmk4_4c #define pmap_rmu pmap_rmu4_4c -#elif defined(SUN4M) && !(defined(SUN4) || defined(SUN4C)) +#elif (defined(SUN4D) || defined(SUN4M)) && !(defined(SUN4) || defined(SUN4C) || defined(SUN4E)) #define pmap_rmk pmap_rmk4m #define pmap_rmu pmap_rmu4m @@ -720,14 +720,14 @@ sparc_protection_init4m(void) #define CTX_USABLE(pm,rp) ((pm)->pm_ctx != NULL ) #endif -#define GAP_WIDEN(pm,vr) do if (CPU_ISSUN4OR4C) { \ +#define GAP_WIDEN(pm,vr) do if (CPU_ISSUN4OR4COR4E) { \ if (vr + 1 == pm->pm_gap_start) \ pm->pm_gap_start = vr; \ if (vr == pm->pm_gap_end) \ pm->pm_gap_end = vr + 1; \ } while (0) -#define GAP_SHRINK(pm,vr) do if (CPU_ISSUN4OR4C) { \ +#define GAP_SHRINK(pm,vr) do if (CPU_ISSUN4OR4COR4E) { \ int x; \ x = pm->pm_gap_start + (pm->pm_gap_end - pm->pm_gap_start) / 2; \ if (vr > x) { \ @@ -923,7 +923,7 @@ pmap_pa_exists(paddr_t pa) * description of *free* virtual memory. Rather than invert this, we * resort to two magic constants from the PROM vector description file. */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void mmu_reservemon4_4c(nrp, nsp) int *nrp, *nsp; @@ -941,8 +941,8 @@ mmu_reservemon4_4c(nrp, nsp) prom_vend = eva = OLDMON_ENDVADDR; } #endif -#if defined(SUN4C) - if (CPU_ISSUN4C) { +#if defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4C || CPU_ISSUN4E) { prom_vstart = va = OPENPROM_STARTVADDR; prom_vend = eva = OPENPROM_ENDVADDR; } @@ -1232,10 +1232,8 @@ mmu_setup4m_L3(pagtblptd, sp) /* * MMU management. */ -struct mmuentry *me_alloc(struct mmuhd *, struct pmap *, int, int); -void me_free(struct pmap *, u_int); -struct mmuentry *region_alloc(struct mmuhd *, struct pmap *, int); -void region_free(struct pmap *, u_int); + +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* This is old sun MMU stuff */ /* * Change contexts. We need the old context number as well as the new @@ -1246,10 +1244,14 @@ void region_free(struct pmap *, u_int); #define CHANGE_CONTEXTS(old, new) \ if ((old) != (new)) { \ write_user_windows(); \ - setcontext(new); \ + setcontext4(new); \ } -#if defined(SUN4) || defined(SUN4C) /* This is old sun MMU stuff */ +struct mmuentry *me_alloc(struct mmuhd *, struct pmap *, int, int); +void me_free(struct pmap *, u_int); +struct mmuentry *region_alloc(struct mmuhd *, struct pmap *, int); +void region_free(struct pmap *, u_int); + /* * Allocate an MMU entry (i.e., a PMEG). * If necessary, steal one from someone else. @@ -1669,6 +1671,7 @@ printf("mmu_pagein: kernel wants map at va 0x%x, vr %d, vs %d\n", va, vr, vs); /* return 0 if we have no PMEGs to load */ if (rp->rg_segmap == NULL) return (0); + #if defined(SUN4_MMU3L) if (HASSUN4_MMU3L && rp->rg_smeg == reginval) { smeg_t smeg; @@ -1709,7 +1712,7 @@ printf("mmu_pagein: kernel wants map at va 0x%x, vr %d, vs %d\n", va, vr, vs); splx(s); return (1); } -#endif /* defined SUN4 or SUN4C */ +#endif /* SUN4 || SUN4C || SUN4E */ /* * Allocate a context. If necessary, steal one from someone else. @@ -1734,7 +1737,7 @@ ctx_alloc(pm) if (pmapdebug & PDB_CTX_ALLOC) printf("ctx_alloc(%p)\n", pm); #endif - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { gap_start = pm->pm_gap_start; gap_end = pm->pm_gap_end; } @@ -1762,7 +1765,7 @@ ctx_alloc(pm) #endif c->c_pmap->pm_ctx = NULL; doflush = (CACHEINFO.c_vactype != VAC_NONE); - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { if (gap_start < c->c_pmap->pm_gap_start) gap_start = c->c_pmap->pm_gap_start; if (gap_end > c->c_pmap->pm_gap_end) @@ -1774,7 +1777,7 @@ ctx_alloc(pm) pm->pm_ctx = c; pm->pm_ctxnum = cnum; - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { /* * Write pmap's region (3-level MMU) or segment table into * the MMU. @@ -1899,6 +1902,7 @@ ctx_free(pm) setcontext4m(0); #endif } else { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) oldc = getcontext4(); if (CACHEINFO.c_vactype != VAC_NONE) { newc = pm->pm_ctxnum; @@ -1908,6 +1912,7 @@ ctx_free(pm) } else { CHANGE_CONTEXTS(oldc, 0); } +#endif } c->c_nextfree = ctx_freelist; @@ -1952,7 +1957,7 @@ ctx_free(pm) * status stick. */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void pv_changepte4_4c(pv0, bis, bic) @@ -2625,14 +2630,14 @@ pg_flushcache(struct vm_page *pg) * At last, pmap code. */ -#if defined(SUN4) && defined(SUN4C) +#if (defined(SUN4) || defined(SUN4E)) && defined(SUN4C) int nptesg; #endif #if defined(SUN4M) static void pmap_bootstrap4m(void *); #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) static void pmap_bootstrap4_4c(void *, int, int, int); #endif @@ -2656,7 +2661,7 @@ pmap_bootstrap(int nctx, int nregion, int nsegment) uvmexp.pagesize = nbpg; uvm_setpagesize(); -#if defined(SUN4) && (defined(SUN4C) || defined(SUN4M)) +#if (defined(SUN4) || defined(SUN4E)) && (defined(SUN4C) || defined(SUN4D) || defined(SUN4M)) /* In this case NPTESG is not a #define */ nptesg = (NBPSG >> uvmexp.pageshift); #endif @@ -2675,8 +2680,8 @@ pmap_bootstrap(int nctx, int nregion, int nsegment) #if defined(SUN4M) pmap_bootstrap4m(p); #endif - } else if (CPU_ISSUN4OR4C) { -#if defined(SUN4) || defined(SUN4C) + } else if (CPU_ISSUN4OR4COR4E) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) pmap_bootstrap4_4c(p, nctx, nregion, nsegment); #endif } @@ -2684,7 +2689,7 @@ pmap_bootstrap(int nctx, int nregion, int nsegment) pmap_page_upload(); } -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void pmap_bootstrap4_4c(void *top, int nctx, int nregion, int nsegment) { @@ -2716,6 +2721,7 @@ pmap_bootstrap4_4c(void *top, int nctx, int nregion, int nsegment) switch (cputyp) { case CPU_SUN4C: + case CPU_SUN4E: mmu_has_hole = 1; break; case CPU_SUN4: @@ -3094,7 +3100,7 @@ pmap_bootstrap4m(void *top) */ va2pa_offset = (vaddr_t)kernel_text - VA2PA(kernel_text); -#if defined(SUN4) || defined(SUN4C) /* setup 4M fn. ptrs for dual-arch kernel */ +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* setup 4M fn. ptrs for dual-arch kernel */ pmap_clear_modify_p = pmap_clear_modify4m; pmap_clear_reference_p = pmap_clear_reference4m; pmap_copy_page_p = pmap_copy_page4m; @@ -3109,7 +3115,7 @@ pmap_bootstrap4m(void *top) pmap_changeprot_p = pmap_changeprot4m; pmap_rmk_p = pmap_rmk4m; pmap_rmu_p = pmap_rmu4m; -#endif /* defined Sun4/Sun4c */ +#endif /* SUN4 || SUN4C || SUN4E */ /* * Initialize the kernel pmap. @@ -3560,7 +3566,7 @@ pmap_create() pm->pm_refcount = 1; pm->pm_regmap = urp; - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { TAILQ_INIT(&pm->pm_seglist); #if defined(SUN4_MMU3L) TAILQ_INIT(&pm->pm_reglist); @@ -3646,7 +3652,7 @@ pmap_release(pm) printf("pmap_release(%p)\n", pm); #endif - if (CPU_ISSUN4OR4C) { + if (CPU_ISSUN4OR4COR4E) { #if defined(SUN4_MMU3L) if (!TAILQ_EMPTY(&pm->pm_reglist)) panic("pmap_release: region list not empty"); @@ -3829,7 +3835,7 @@ pmap_kremove(va, len) * These are egregiously complicated routines. */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* remove from kernel */ void @@ -4026,7 +4032,7 @@ pmap_rmk4m(pm, va, endva, vr, vs) #define PMAP_RMU_MAGIC 4 /* if > magic, use cache_flush_segment */ #endif -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* remove from user */ void @@ -4312,7 +4318,7 @@ pmap_rmu4m(pm, va, endva, vr, vs) * to read-only (in which case pv_changepte does the trick). */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void pmap_page_protect4_4c(struct vm_page *pg, vm_prot_t prot) { @@ -4984,7 +4990,7 @@ out: * XXX should have different entry points for changing! */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) int pmap_enter4_4c(pm, va, pa, prot, flags) @@ -5712,7 +5718,7 @@ pmap_unwire(pm, va) * GRR, the vm code knows; we should not have to do this! */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) boolean_t pmap_extract4_4c(pm, va, pa) struct pmap *pm; @@ -5848,7 +5854,7 @@ pmap_extract4m(pm, va, pa) } #endif /* sun4m */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * Clear the modify bit for the given physical page. @@ -5994,7 +6000,7 @@ pmap_is_referenced4m(struct vm_page *pg) * XXX might be faster to use destination's context and allow cache to fill? */ -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) void pmap_zero_page4_4c(struct vm_page *pg) @@ -6198,7 +6204,7 @@ kvm_setcache(va, npages, cached) #endif } else { -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) ctx = getcontext4(); setcontext4(0); for (; --npages >= 0; va += NBPG) { @@ -6241,7 +6247,7 @@ pmap_prefer(foff, vap) vaddr_t va = *vap; long d, m; -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) if (VA_INHOLE(va)) va = MMU_HOLE_END; #endif @@ -6258,7 +6264,7 @@ pmap_prefer(foff, vap) void pmap_remove_holes(struct vm_map *map) { -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) if (mmu_has_hole) { vaddr_t shole, ehole; @@ -6285,8 +6291,8 @@ pmap_redzone() return; } #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4OR4C) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { setpte4(KERNBASE, 0); return; } @@ -6498,7 +6504,7 @@ pmap_dumpsize() sz = ALIGN(sizeof(kcore_seg_t)) + ALIGN(sizeof(cpu_kcore_hdr_t)); sz += npmemarr * sizeof(phys_ram_seg_t); - if (CPU_ISSUN4OR4C) + if (CPU_ISSUN4OR4COR4E) sz += (seginval + 1) * NPTESG * sizeof(int); return (atop(sz)); @@ -6521,7 +6527,7 @@ pmap_dumpmmu(dump, blkno) int i, memsegoffset, pmegoffset; int buffer[dbtob(1) / sizeof(int)]; int *bp, *ep; -#if defined(SUN4C) || defined(SUN4) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) int pmeg; #endif @@ -6558,7 +6564,7 @@ pmap_dumpmmu(dump, blkno) kcpup->cputype = cputyp; kcpup->nmemseg = npmemarr; kcpup->memsegoffset = memsegoffset = ALIGN(sizeof(cpu_kcore_hdr_t)); - kcpup->npmeg = (CPU_ISSUN4OR4C) ? seginval + 1 : 0; + kcpup->npmeg = (CPU_ISSUN4OR4COR4E) ? seginval + 1 : 0; kcpup->pmegoffset = pmegoffset = memsegoffset + npmemarr * sizeof(phys_ram_seg_t); @@ -6580,7 +6586,7 @@ pmap_dumpmmu(dump, blkno) if (CPU_ISSUN4M) goto out; -#if defined(SUN4C) || defined(SUN4) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) /* * dump page table entries * @@ -6651,8 +6657,8 @@ pmap_writetext(dst, ch) setpgt4m(ptep, pte0); } #endif -#if defined(SUN4) || defined(SUN4C) - if (CPU_ISSUN4C || CPU_ISSUN4) { +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) + if (CPU_ISSUN4OR4COR4E) { pte0 = getpte4(va); if ((pte0 & PG_V) == 0) { splx(s); diff --git a/sys/arch/sparc/sparc/trap.c b/sys/arch/sparc/sparc/trap.c index f9790fb4c2b..71e425a0944 100644 --- a/sys/arch/sparc/sparc/trap.c +++ b/sys/arch/sparc/sparc/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.53 2008/01/06 21:15:58 miod Exp $ */ +/* $OpenBSD: trap.c,v 1.54 2010/07/10 19:32:25 miod Exp $ */ /* $NetBSD: trap.c,v 1.58 1997/09/12 08:55:01 pk Exp $ */ /* @@ -628,7 +628,7 @@ mem_access_fault(type, ser, v, pc, psr, tf) int pc, psr; struct trapframe *tf; { -#if defined(SUN4) || defined(SUN4C) +#if defined(SUN4) || defined(SUN4C) || defined(SUN4E) struct proc *p; struct vmspace *vm; vaddr_t va; @@ -760,7 +760,7 @@ out: userret(p); share_fpu(p, tf); } -#endif /* Sun4/Sun4C */ +#endif /* SUN4 || SUN4C || SUN4E */ } #if defined(SUN4M) /* 4m version of mem_access_fault() follows */ |