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;