diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2023-03-11 20:56:02 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2023-03-11 20:56:02 +0000 |
commit | 74df3414ce11c4e90d3e50573c4faad07b9260d8 (patch) | |
tree | c488f4f9ec0703f5702736cb94f3c7811ea8a281 | |
parent | 012e0cf3a9007c10f4ea89bb3abe16f3ca866190 (diff) |
New alpha secondary boot blocks using the MI code base. Not linked to the
build yet.
-rw-r--r-- | sys/arch/alpha/stand/nboot/Makefile | 67 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/conf.c | 70 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/devopen.c | 43 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/disk.c | 166 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/libsa.h | 36 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/machdep.c | 218 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/prom.c | 74 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/prom_swpal.S | 136 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/promcons.c | 96 | ||||
-rw-r--r-- | sys/arch/alpha/stand/nboot/rpcc.S | 10 |
10 files changed, 916 insertions, 0 deletions
diff --git a/sys/arch/alpha/stand/nboot/Makefile b/sys/arch/alpha/stand/nboot/Makefile new file mode 100644 index 00000000000..ee2409cead6 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/Makefile @@ -0,0 +1,67 @@ +# $OpenBSD: Makefile,v 1.1 2023/03/11 20:56:01 miod Exp $ +# $NetBSD: Makefile,v 1.17 1997/04/17 07:27:46 thorpej Exp $ + +S= ${.CURDIR}/../../../.. + +PROG= boot +NOMAN= +INSTALL_STRIP= +BINMODE= 444 + +# Needs to be first +SRCS= start.S + +SRCS+= conf.c devopen.c disk.c machdep.c prom.c promcons.c \ + prom_swpal.S rpcc.S + +BOOT_RELOC = ${SECONDARY_LOAD_ADDRESS} + +CLEANFILES+= ${PROG}.sym ${PROG}.nosym + +.PATH: ${.CURDIR}/.. +SRCS+= OSFpal.c loadfile_subr.c prom_disp.S + +.PATH: ${S}/stand/boot +SRCS+= boot.c cmd.c vars.c + +.PATH: ${S}/lib/libkern/arch/alpha ${S}/lib/libkern +SRCS+= __divlu.S __remqu.S __reml.S strlen.c bzero.c __divl.S __divqu.S \ + __remlu.S __divq.S __remq.S +SRCS+= strlcpy.c + +.PATH: ${S}/lib/libkern/arch/alpha ${S}/lib/libsa +SRCS+= loadfile.c arc4.c ctime.c hexdump.c strtol.c strtoll.c ufs2.c + +DEFNS= -DCOMPAT_UFS + +AFLAGS += -DASSEMBLER ${DEFNS} -fno-pie +CPPFLAGS += -I${.CURDIR}/../.. -I${.CURDIR} -I${S} ${DEFNS} +CFLAGS = -Oz -Werror -mno-fp-regs -fno-pie -msmall-data -msmall-text + +${PROG}.nosym: ${PROG}.sym + cp ${PROG}.sym ${PROG}.nosym + ${STRIP} ${PROG}.nosym + +${PROG}: ${PROG}.nosym + ${OBJCOPY} --output-target=binary ${PROG}.nosym ${PROG} + +.include <bsd.prog.mk> + +### find out what to use for libz +Z_AS= library +ZDST= ${.CURDIR}/../libz/${__objdir} +.include "${.CURDIR}/../libz/Makefile.inc" +LIBZ= ${ZLIB} + +### find out what to use for libsa +SA_AS= library +SADST= ${.CURDIR}/../libsa/${__objdir} +SAREL= +SA_ZLIB= yes +.include "${.CURDIR}/../libsa/Makefile.inc" +LIBSA= ${SALIB} + +${PROG}.sym: ${OBJS} ${LIBSA} ${LIBZ} + ${LD} -nopie -znorelro -Ttext ${BOOT_RELOC} -N -e start \ + -o ${PROG}.sym ${OBJS} ${LIBSA} ${LIBZ} ${LIBSA} + size ${PROG}.sym diff --git a/sys/arch/alpha/stand/nboot/conf.c b/sys/arch/alpha/stand/nboot/conf.c new file mode 100644 index 00000000000..d4ebe809cc3 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/conf.c @@ -0,0 +1,70 @@ +/* $OpenBSD: conf.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: conf.c,v 1.3 1995/11/23 02:39:31 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Ralph Campbell. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)conf.c 8.1 (Berkeley) 6/10/93 + */ + +#include "libsa.h" + +#include <lib/libsa/ufs.h> +#include <lib/libsa/ufs2.h> +#include <lib/libsa/cd9660.h> +#include <dev/cons.h> + +const char version[] = "2.0"; +#ifdef DEBUG +int debug = 0; +#endif + +struct fs_ops file_system[] = { + { ufs_open, ufs_close, ufs_read, ufs_write, + ufs_seek, ufs_stat, ufs_readdir, ufs_fchmod }, + { ufs2_open, ufs2_close, ufs2_read, ufs2_write, + ufs2_seek, ufs2_stat, ufs2_readdir, ufs2_fchmod }, + { cd9660_open, cd9660_close, cd9660_read, cd9660_write, + cd9660_seek, cd9660_stat, cd9660_readdir } +}; +int nfsys = sizeof(file_system) / sizeof(file_system[0]); + +struct devsw devsw[] = { + { "disk", + diskstrategy, diskopen, diskclose, diskioctl } +}; +int ndevs = sizeof(devsw) / sizeof(devsw[0]); + +struct consdev constab[] = { + { prom_cnprobe, prom_cninit, prom_cngetc, prom_cnputc }, + { NULL } +}; +struct consdev *cn_tab; diff --git a/sys/arch/alpha/stand/nboot/devopen.c b/sys/arch/alpha/stand/nboot/devopen.c new file mode 100644 index 00000000000..d6c9ed90175 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/devopen.c @@ -0,0 +1,43 @@ +/* $OpenBSD: devopen.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ + +/* + * Copyright (c) 2023 Miodrag Vallat. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "libsa.h" + +int +devopen(struct open_file *f, const char *fname, char **file) +{ + struct devsw *dp; + const char *s; + + /* + * Unfortunately for us, the BOOTDEF_DEV environment variable + * contents does not match the DKA/DQA/DRA/DVA/MKA/EWA... SRM + * device names, and we can't convert between them. + * So we can only boot files from the same device the boot loader + * was loaded from, and ignore any device specification here. + */ + s = strchr(fname, ':'); + if (s != NULL) + *file = (char *)++s; + else + *file = (char *)fname; + + dp = &devsw[0]; + f->f_dev = dp; + return (*dp->dv_open)(f); +} diff --git a/sys/arch/alpha/stand/nboot/disk.c b/sys/arch/alpha/stand/nboot/disk.c new file mode 100644 index 00000000000..2f0d83d0031 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/disk.c @@ -0,0 +1,166 @@ +/* $OpenBSD: disk.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: disk.c,v 1.6 1997/04/06 08:40:33 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Van Jacobson of Lawrence Berkeley Laboratory and Ralph Campbell. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rz.c 8.1 (Berkeley) 6/10/93 + */ + +#include "libsa.h" + +#include <sys/param.h> +#include <sys/disklabel.h> + +#include <machine/rpb.h> +#include <machine/prom.h> + +struct disk_softc { + int sc_fd; /* PROM channel number */ + int sc_part; /* disk partition number */ + struct disklabel sc_label; /* disk label for this disk */ +}; + +int +diskstrategy(void *devdata, int rw, daddr_t bn, size_t reqcnt, void *addrvoid, + size_t *cnt) +{ + char *addr = addrvoid; + struct disk_softc *sc; + struct partition *pp; + prom_return_t ret; + int s; + +#ifdef DEBUG + if ((reqcnt & 0xffffff) != reqcnt || reqcnt == 0) + asm("call_pal 0"); +#endif + + twiddle(); + + /* Partial-block transfers not handled. */ + if (reqcnt & (DEV_BSIZE - 1)) { + *cnt = 0; + return (EINVAL); + } + + sc = (struct disk_softc *)devdata; + pp = &sc->sc_label.d_partitions[sc->sc_part]; + bn += DL_GETPOFFSET(pp); + + if (rw == F_READ) + ret.bits = prom_read(sc->sc_fd, reqcnt, addr, bn); + else + ret.bits = prom_write(sc->sc_fd, reqcnt, addr, bn); + if (ret.u.status) + return (EIO); + if (cnt) + *cnt = ret.u.retval; + return (0); +} + +int +diskopen(struct open_file *f, ...) +{ + struct disklabel *lp; + prom_return_t ret; + size_t cnt, devlen; + int i; + char *msg, buf[DEV_BSIZE]; + struct disk_softc *sc; + va_list ap; + unsigned int part = 0; + char devname[128]; + + /* See devopen() - we always use the device we're booted off here. */ + ret.bits = prom_getenv(PROM_E_BOOTED_DEV, devname, sizeof(devname)); + devlen = ret.u.retval; + + ret.bits = prom_open((u_int64_t)devname, devlen); + if (ret.u.status == 2) + return (ENXIO); + if (ret.u.status == 3) + return (EIO); + + sc = alloc(sizeof(struct disk_softc)); + bzero(sc, sizeof(struct disk_softc)); + f->f_devdata = (void *)sc; + + sc->sc_fd = ret.u.retval; + sc->sc_part = part; + + /* Try to read disk label and partition table information. */ + lp = &sc->sc_label; + lp->d_secsize = DEV_BSIZE; + lp->d_secpercyl = 1; + lp->d_npartitions = MAXPARTITIONS; + DL_SETPOFFSET(&lp->d_partitions[part], 0); + DL_SETPSIZE(&lp->d_partitions[part], -1LL); + i = diskstrategy(sc, F_READ, LABELSECTOR, DEV_BSIZE, buf, &cnt); + if (i || cnt != DEV_BSIZE) { + printf("%s: error reading disk label\n", __func__); + goto bad; + } else if (((struct disklabel *)(buf + LABELOFFSET))->d_magic != + DISKMAGIC) { + /* No label at all. Fake all partitions as whole disk. */ + for (i = 0; i < MAXPARTITIONS; i++) { + DL_SETPOFFSET(&lp->d_partitions[part], 0); + DL_SETPSIZE(&lp->d_partitions[part], -1LL); + } + } else { + msg = getdisklabel(buf + LABELOFFSET, lp); + if (msg) { + printf("%s: %s\n", __func__, msg); + goto bad; + } + } + + if (part >= lp->d_npartitions || + DL_GETPSIZE(&lp->d_partitions[part]) == 0) { +bad: + free(sc, sizeof(struct disk_softc)); + return (ENXIO); + } + return (0); +} + +int +diskclose(struct open_file *f) +{ + struct disk_softc *sc; + + sc = f->f_devdata; + (void)prom_close(sc->sc_fd); + + free(sc, sizeof(struct disk_softc)); + f->f_devdata = NULL; + return (0); +} diff --git a/sys/arch/alpha/stand/nboot/libsa.h b/sys/arch/alpha/stand/nboot/libsa.h new file mode 100644 index 00000000000..ff34856d6c7 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/libsa.h @@ -0,0 +1,36 @@ +/* $OpenBSD: libsa.h,v 1.1 2023/03/11 20:56:01 miod Exp $ */ + +/* + * Copyright (c) 2023 Miodrag Vallat. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <lib/libsa/stand.h> + +/* + * MD interfaces for MI boot(9) + */ +void devboot(dev_t, char *); +void machdep(void); +void run_loadfile(uint64_t *, int); + +int diskopen(struct open_file *, ...); +int diskstrategy(void *, int, daddr_t, size_t, void *, size_t *); +int diskclose(struct open_file *); +#define diskioctl noioctl + +void prom_cnprobe(struct consdev *); +void prom_cninit(struct consdev *); +int prom_cngetc(dev_t); +void prom_cnputc(dev_t, int); diff --git a/sys/arch/alpha/stand/nboot/machdep.c b/sys/arch/alpha/stand/nboot/machdep.c new file mode 100644 index 00000000000..7f7b25a09c4 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/machdep.c @@ -0,0 +1,218 @@ +/* $OpenBSD: machdep.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: boot.c,v 1.10 1997/01/18 01:58:33 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Ralph Campbell. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)boot.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <lib/libkern/libkern.h> +#include <lib/libsa/stand.h> +#include <lib/libsa/loadfile.h> +#include <stand/boot/cmd.h> + +#include <sys/exec.h> +#include <sys/stat.h> +#include <sys/reboot.h> + +#include <machine/rpb.h> +#include <machine/prom.h> +#include <machine/autoconf.h> + +void init_prom_calls(void); +void OSFpal(void); +void halt(void); +long alpha_rpcc(void); + +int +main() +{ +#ifdef DEBUG + struct rpb *r; + struct mddt *mddtp; + struct mddt_cluster *memc; + int i; +#endif + static char boot_file[128]; + extern char *kernelfile; + char *s; + int uppercase = 1; + + /* Init prom callback vector. */ + init_prom_calls(); + + cninit(); + + /* switch to OSF pal code. */ + OSFpal(); + +#ifdef DEBUG + r = (struct rpb *)HWRPB_ADDR; + mddtp = (struct mddt *)(HWRPB_ADDR + r->rpb_memdat_off); + printf("%d memory clusters\n", mddtp->mddt_cluster_cnt); + for (i = 0; i < mddtp->mddt_cluster_cnt; i++) { + memc = &mddtp->mddt_clusters[i]; + printf("%d: (%d) %lx-%lx\n", i, memc->mddt_usage, + memc->mddt_pfn << PAGE_SHIFT, + (memc->mddt_pfn + memc->mddt_pg_cnt) << PAGE_SHIFT); + } +#endif + + prom_getenv(PROM_E_BOOTED_FILE, boot_file, sizeof(boot_file)); + + if (boot_file[0] != '\0') { + /* + * If boot_file is all caps, then we are likely on an old + * (DEC 3000) prom which upper cases everything. + */ + for (s = boot_file; *s != '\0'; s++) { + if (islower(*s)) { + uppercase = 0; + break; + } + } + if (uppercase) { + for (s = boot_file; *s != '\0'; s++) + *s = tolower(*s); + } + kernelfile = boot_file; + /* + * Unfortunately there doesn't seem to be a way to tell apart + * a kernel file provided via "boot -fi" (in which case we + * ought to boot immediately by setting bootprompt to zero) + * from a kernel file provided via the SRM environment (in + * which case we want to default to interactive operation). + */ + } + + boot(0); +} + +void +devboot(dev_t dev /* ignored */, char *path) +{ + /* + * Although there is unfortunately no way to use SRM device names + * here, we need to provide a dummy device name since the boot loader + * code relies upon "device:path" syntax. + */ + snprintf(path, BOOTDEVLEN, "disk"); +} + +void +machdep() +{ + /* Nothing to do - everything done in main() already */ +} + +void +run_loadfile(uint64_t *marks, int howto) +{ + extern paddr_t ptbr_save; + static struct bootinfo_v1 bootinfo_v1; + u_int64_t entry; + char boot_flags[128]; + + /* + * Fill in the bootinfo for the kernel. + */ + bzero(&bootinfo_v1, sizeof(bootinfo_v1)); + bootinfo_v1.ssym = marks[MARK_SYM]; + bootinfo_v1.esym = marks[MARK_END]; +// bcopy(name, bootinfo_v1.booted_kernel, +// sizeof(bootinfo_v1.booted_kernel)); + prom_getenv(PROM_E_BOOTED_OSFLAGS, boot_flags, sizeof(boot_flags)); + bcopy(boot_flags, bootinfo_v1.boot_flags, + sizeof(bootinfo_v1.boot_flags)); + bootinfo_v1.hwrpb = (void *)HWRPB_ADDR; + bootinfo_v1.hwrpbsize = ((struct rpb *)HWRPB_ADDR)->rpb_size; + bootinfo_v1.cngetc = NULL; + bootinfo_v1.cnputc = NULL; + bootinfo_v1.cnpollc = NULL; + bootinfo_v1.howto = howto; + + entry = marks[MARK_START]; + (*(void (*)(u_int64_t, u_int64_t, u_int64_t, void *, u_int64_t, + u_int64_t))entry)(0, ptbr_save, BOOTINFO_MAGIC, &bootinfo_v1, 1, 0); +} + +/* + * "machine tty" command to select a different console is not supported, + */ + +int +cnspeed(dev_t dev, int sp) +{ + return 9600; +} + +char * +ttyname(int fd) +{ + return "console"; +} + +dev_t +ttydev(char *name) +{ + return NODEV; +} + +time_t +getsecs() +{ + static long tnsec; + static long lastpcc, wrapsecs; + long curpcc; + + if (tnsec == 0) { + tnsec = 1; + lastpcc = alpha_rpcc() & 0xffffffff; + wrapsecs = (0xffffffff / + ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq) + 1; + +#if 0 + printf("getsecs: cc freq = %d, time to wrap = %d\n", + ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq, wrapsecs); +#endif + } + + curpcc = alpha_rpcc() & 0xffffffff; + if (curpcc < lastpcc) + curpcc += 0x100000000; + + tnsec += ((curpcc - lastpcc) * 1000000000) / ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq; + lastpcc = curpcc; + + return (tnsec / 1000000000); +} diff --git a/sys/arch/alpha/stand/nboot/prom.c b/sys/arch/alpha/stand/nboot/prom.c new file mode 100644 index 00000000000..df8c867b523 --- /dev/null +++ b/sys/arch/alpha/stand/nboot/prom.c @@ -0,0 +1,74 @@ +/* $OpenBSD: prom.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: prom.c,v 1.2 1996/11/25 16:18:16 cgd Exp $ */ + +/* + * Mach Operating System + * Copyright (c) 1992 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ + +#include <lib/libsa/stand.h> + +#include <sys/types.h> +#include <machine/rpb.h> +#include <machine/prom.h> + +void +init_prom_calls() +{ + extern struct prom_vec prom_dispatch_v; + struct rpb *r; + struct crb *c; + + r = (struct rpb *)HWRPB_ADDR; + c = (struct crb *)((u_int8_t *)r + r->rpb_crb_off); + + prom_dispatch_v.routine_arg = c->crb_v_dispatch; + prom_dispatch_v.routine = c->crb_v_dispatch->entry_va; +} + +int +prom_getenv(id, buf, len) + int id, len; + char *buf; +{ + /* + * On at least some systems, the GETENV call requires a + * 8-byte-aligned buffer, or it bails out with a "kernel stack + * not valid halt". Provide a local, aligned buffer here and + * then copy to the caller's buffer. + */ + static char abuf[128] __attribute__ ((aligned (8))); + prom_return_t ret; + + ret.bits = prom_dispatch(PROM_R_GETENV, id, (u_int64_t)abuf, 128, 0); + if (ret.u.status & 0x4) + ret.u.retval = 0; + len--; + if (len > ret.u.retval) + len = ret.u.retval; + memcpy(buf, abuf, len); + buf[len] = '\0'; + + return (len); +} diff --git a/sys/arch/alpha/stand/nboot/prom_swpal.S b/sys/arch/alpha/stand/nboot/prom_swpal.S new file mode 100644 index 00000000000..8fc1707856e --- /dev/null +++ b/sys/arch/alpha/stand/nboot/prom_swpal.S @@ -0,0 +1,136 @@ +/* $OpenBSD: prom_swpal.S,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: prom_swpal.S,v 1.4 1996/10/17 02:50:41 cgd Exp $ */ + +/* + * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Keith Bostic + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include "../../include/asm.h" +#include "../../include/prom.h" +#include "../../include/rpb.h" + +/* Offsets from base of HWRPB. */ +#define RPB_SELFREF 0x00 +#define RPB_SLOTSIZE 0x98 +#define RPB_PERCPU_OFF 0xA0 + +/* Offsets in a boot PCB. */ +#define PCB_KSP 0x00 +#define PCB_PTBR 0x10 +#define PCB_ASN 0x1c +#define PCB_FEN 0x28 + +/* Pal values. */ +#define PAL_RESERVED 0 /* Reserved to Digital. */ +#define PAL_VMS 1 /* VMS */ +#define PAL_OSF 2 /* OSF */ + +/* + * PAL code switch routine. + */ +#define D_RA (7*8) +#define D_S0 (8*8) +#define D_S1 (9*8) +#define D_S2 (10*8) +#define D_S3 (11*8) +#define D_S4 (12*8) +#define D_S5 (13*8) +#define PALSW_FRAME_SIZE (14*8) +#define PALSW_REGS IM_RA|IM_S0|IM_S1|IM_S2|IM_S3|IM_S4|IM_S5 + + .comm ptbr_save,8 + + .text + .align 4 + +NESTED(switch_palcode, 0, PALSW_FRAME_SIZE, ra, PALSW_REGS, 0) + LDGP(pv) +/* ldgp gp, 0(pv)*/ + + lda sp, -PALSW_FRAME_SIZE(sp) + stq ra, D_RA(sp) + stq s0, D_S0(sp) + stq s1, D_S1(sp) + stq s2, D_S2(sp) + stq s3, D_S3(sp) + stq s4, D_S4(sp) + stq s5, D_S5(sp) + + stq pv, 0(sp) + stq gp, 8(sp) + + ldiq s0, HWRPB_ADDR /* s0 HWRPB_ADDR */ + ldq s1, RPB_SLOTSIZE(s0) + call_pal PAL_VMS_mfpr_whami + mulq s1, v0, s1 /* s1 per_cpu offset from base */ + ldq s2, RPB_PERCPU_OFF(s0) + addq s0, s2, s2 + addq s2, s1, s2 /* s2 PCB (virtual) */ + + call_pal PAL_VMS_mfpr_ptbr + stq v0, PCB_PTBR(s2) + stq v0, ptbr_save /* save PTBR for the kernel */ + stl zero, PCB_ASN(s2) + stq zero, PCB_FEN(s2) + stq sp, PCB_KSP(s2) + + ldq t0, RPB_SELFREF(s0) /* HWRBP base (physical) */ + ldq t1, RPB_PERCPU_OFF(s0) + addq t0, t1, t0 + addq t0, s1, t0 /* PCB base (phys) */ + stq t0, 16(sp) + + call_pal PAL_VMS_mfpr_vptb + mov v0, a3 + ldiq a0, PAL_OSF + lda a1, contin + ldq a2, 16(sp) + + call_pal PAL_swppal /* a0, a1, a2, a3 */ + +contin: ldq pv, 0(sp) + ldq gp, 8(sp) + + ldq ra, D_RA(sp) + ldq s0, D_S0(sp) + ldq s1, D_S1(sp) + ldq s2, D_S2(sp) + ldq s3, D_S3(sp) + ldq s4, D_S4(sp) + ldq s5, D_S5(sp) + lda sp, PALSW_FRAME_SIZE(sp) + RET +END(switch_palcode) + +#undef D_RA +#undef D_S0 +#undef D_S1 +#undef D_S2 +#undef D_S3 +#undef D_S4 +#undef D_S5 +#undef PALSW_FRAME_SIZE +#undef PALSW_REGS diff --git a/sys/arch/alpha/stand/nboot/promcons.c b/sys/arch/alpha/stand/nboot/promcons.c new file mode 100644 index 00000000000..aab4cbad9bc --- /dev/null +++ b/sys/arch/alpha/stand/nboot/promcons.c @@ -0,0 +1,96 @@ +/* $OpenBSD: promcons.c,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: prom.c,v 1.2 1996/11/25 16:18:16 cgd Exp $ */ + +/* + * Mach Operating System + * Copyright (c) 1992 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ + +#include <sys/types.h> +#include <machine/rpb.h> +#include <machine/prom.h> +#include <dev/cons.h> + +#include "libsa.h" + +void +prom_cnprobe(struct consdev *cn) +{ + char buf[4]; + int console; + + /* Look for console tty. */ + prom_getenv(PROM_E_TTY_DEV, buf, 4); + console = buf[0] - '0'; + + cn->cn_pri = CN_MIDPRI; + cn->cn_dev = makedev(0, console); +} + +void +prom_cninit(struct consdev *cn) +{ +} + +int +prom_cngetc(dev_t dev) +{ + static int stash = 0; + int unit = dev & ~0x80; + int poll = (dev & 0x80) != 0; + int c; + prom_return_t ret; + + if (stash != 0) { + c = stash; + if (!poll) + stash = 0; + return c; + } + + for (;;) { + ret.bits = prom_dispatch(PROM_R_GETC, unit, 0, 0, 0); + if (ret.u.status == 0 || ret.u.status == 1) { + c = ret.u.retval; + if (poll) + stash = c; + return c; + } + if (poll) + return 0; + } +} + +void +prom_cnputc(dev_t dev, int c) +{ + int unit = dev & ~0x80; + prom_return_t ret; + char cbuf = c; + + do { + ret.bits = prom_dispatch(PROM_R_PUTS, unit, + (u_int64_t)&cbuf, 1, 0); + } while ((ret.u.retval & 1) == 0); +} diff --git a/sys/arch/alpha/stand/nboot/rpcc.S b/sys/arch/alpha/stand/nboot/rpcc.S new file mode 100644 index 00000000000..eebef3b312d --- /dev/null +++ b/sys/arch/alpha/stand/nboot/rpcc.S @@ -0,0 +1,10 @@ +/* $OpenBSD: rpcc.S,v 1.1 2023/03/11 20:56:01 miod Exp $ */ +/* $NetBSD: rpcc.S,v 1.2 1996/10/02 21:18:50 cgd Exp $ */ + +#include <machine/asm.h> + + .text +LEAF(alpha_rpcc,1) + rpcc v0 + RET + END(alpha_rpcc) |