Module Name: src Committed By: mrg Date: Tue Jan 8 07:46:11 UTC 2019
Modified Files: src/sys/arch/macppc/include: autoconf.h src/sys/arch/ofppc/include: autoconf.h src/sys/arch/powerpc/include: types.h src/sys/arch/powerpc/powerpc: openfirm.c src/sys/dev/ofw: openfirmio.c Log Message: workaround a problem with the pegasos firmware interface: attempting to use /dev/openfirm on this machine hangs hard. this isn't a new problem, and i've been meaning to try to figure it out for years, but it's become a problem since the xf86-video-radeon driver gained code to look for the macppc model using this interface. this is why xorg-server 1.18 and 1.20 hang recently on the pegasosII. this change is fairly ugly but i couldn't think of a less ugly method to avoid /dev/openfirm working just on this one platform. introduce new __OPENFIRMIO_OPEN_CHECK_BROKEN macro and associated __openfirmio_open_check_broken(), and use them in the new openfirmopen() to fail opens. include proplib.h in macppc and ofppc autoconf.h since they use it. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/macppc/include/autoconf.h cvs rdiff -u -r1.15 -r1.16 src/sys/arch/ofppc/include/autoconf.h cvs rdiff -u -r1.56 -r1.57 src/sys/arch/powerpc/include/types.h cvs rdiff -u -r1.26 -r1.27 src/sys/arch/powerpc/powerpc/openfirm.c cvs rdiff -u -r1.13 -r1.14 src/sys/dev/ofw/openfirmio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/macppc/include/autoconf.h diff -u src/sys/arch/macppc/include/autoconf.h:1.18 src/sys/arch/macppc/include/autoconf.h:1.19 --- src/sys/arch/macppc/include/autoconf.h:1.18 Fri Jul 1 21:02:15 2011 +++ src/sys/arch/macppc/include/autoconf.h Tue Jan 8 07:46:10 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.h,v 1.18 2011/07/01 21:02:15 dyoung Exp $ */ +/* $NetBSD: autoconf.h,v 1.19 2019/01/08 07:46:10 mrg Exp $ */ /*- * Copyright (C) 1998 Internet Research Institute, Inc. @@ -34,7 +34,9 @@ #ifndef _MACHINE_AUTOCONF_H_ #define _MACHINE_AUTOCONF_H_ -#include <sys/bus.h> /* for bus_space_tag_t */ +#include <sys/bus.h> + +#include <prop/proplib.h> struct confargs { const char *ca_name; Index: src/sys/arch/ofppc/include/autoconf.h diff -u src/sys/arch/ofppc/include/autoconf.h:1.15 src/sys/arch/ofppc/include/autoconf.h:1.16 --- src/sys/arch/ofppc/include/autoconf.h:1.15 Fri Jul 1 21:02:15 2011 +++ src/sys/arch/ofppc/include/autoconf.h Tue Jan 8 07:46:10 2019 @@ -1,10 +1,12 @@ -/* $NetBSD: autoconf.h,v 1.15 2011/07/01 21:02:15 dyoung Exp $ */ +/* $NetBSD: autoconf.h,v 1.16 2019/01/08 07:46:10 mrg Exp $ */ #ifndef _OFPPC_AUTOCONF_H_ #define _OFPPC_AUTOCONF_H_ #include <sys/bus.h> +#include <prop/proplib.h> + struct confargs { const char *ca_name; u_int ca_node; Index: src/sys/arch/powerpc/include/types.h diff -u src/sys/arch/powerpc/include/types.h:1.56 src/sys/arch/powerpc/include/types.h:1.57 --- src/sys/arch/powerpc/include/types.h:1.56 Fri Jan 27 17:22:39 2017 +++ src/sys/arch/powerpc/include/types.h Tue Jan 8 07:46:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: types.h,v 1.56 2017/01/27 17:22:39 christos Exp $ */ +/* $NetBSD: types.h,v 1.57 2019/01/08 07:46:11 mrg Exp $ */ /*- * Copyright (C) 1995 Wolfgang Solfrank. @@ -87,6 +87,8 @@ typedef __uint32_t tlb_asid_t; /* for b #define __HAVE___LWP_GETTCB_FAST #define __HAVE___LWP_SETTCB #define __HAVE_TLS_VARIANT_I +#define __OPENFIRMIO_OPEN_CHECK_BROKEN +int __openfirmio_open_check_broken(void); #if defined(_KERNEL) || defined(_KMEMUSER) #define PCU_FPU 0 /* FPU */ Index: src/sys/arch/powerpc/powerpc/openfirm.c diff -u src/sys/arch/powerpc/powerpc/openfirm.c:1.26 src/sys/arch/powerpc/powerpc/openfirm.c:1.27 --- src/sys/arch/powerpc/powerpc/openfirm.c:1.26 Mon Sep 3 16:29:26 2018 +++ src/sys/arch/powerpc/powerpc/openfirm.c Tue Jan 8 07:46:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: openfirm.c,v 1.26 2018/09/03 16:29:26 riastradh Exp $ */ +/* $NetBSD: openfirm.c,v 1.27 2019/01/08 07:46:11 mrg Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -34,7 +34,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: openfirm.c,v 1.26 2018/09/03 16:29:26 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: openfirm.c,v 1.27 2019/01/08 07:46:11 mrg Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: openfirm.c,v #include <uvm/uvm_extern.h> #include <machine/psl.h> +#include <machine/autoconf.h> #include <dev/ofw/openfirm.h> @@ -757,3 +758,11 @@ ofbcopy(const void *src, void *dst, size while (len-- > 0) *dp++ = *sp++; } + +#ifdef __OPENFIRMIO_OPEN_CHECK_BROKEN +int +__openfirmio_open_check_broken(void) +{ + return strncmp(model_name, "Pegasos", 7) == 0 ? ENXIO : 0; +} +#endif Index: src/sys/dev/ofw/openfirmio.c diff -u src/sys/dev/ofw/openfirmio.c:1.13 src/sys/dev/ofw/openfirmio.c:1.14 --- src/sys/dev/ofw/openfirmio.c:1.13 Fri Jul 25 08:10:37 2014 +++ src/sys/dev/ofw/openfirmio.c Tue Jan 8 07:46:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: openfirmio.c,v 1.13 2014/07/25 08:10:37 dholland Exp $ */ +/* $NetBSD: openfirmio.c,v 1.14 2019/01/08 07:46:11 mrg Exp $ */ /* * Copyright (c) 1992, 1993 @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: openfirmio.c,v 1.13 2014/07/25 08:10:37 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: openfirmio.c,v 1.14 2019/01/08 07:46:11 mrg Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -63,10 +63,11 @@ static int openfirmgetstr (int, char *, void openfirmattach (int); -dev_type_ioctl(openfirmioctl); +static dev_type_open(openfirmopen); +static dev_type_ioctl(openfirmioctl); const struct cdevsw openfirm_cdevsw = { - .d_open = nullopen, + .d_open = openfirmopen, .d_close = nullclose, .d_read = noread, .d_write = nowrite, @@ -117,7 +118,18 @@ openfirmgetstr(int len, char *user, char return (error); } -int +static int +openfirmopen(dev_t dev, int flag, int mode, struct lwp *l) +{ + +#ifdef __OPENFIRMIO_OPEN_CHECK_BROKEN + return __openfirmio_open_check_broken(); +#else + return 0; +#endif +} + +static int openfirmioctl(dev_t dev, u_long cmd, void *data, int flags, struct lwp *l) { struct ofiocdesc *of;