Subject: Panic on MP sparc.
To: None <port-sparc@netbsd.org>
From: None <ragge@ludd.luth.se>
List: port-sparc
Date: 02/01/2003 14:06:48
The small and simple program below will crash the kernel on a
four-CPU 4/670 immediately. It's running -current of last monday,
but the problem seems more generic than that.
Nothing useable, at least not for me, is gotten from it.
It don't jump into DDB when breaked, by some strange reason.
panic message:
Sat Feb 1 13:54:28 CET 2003
NetBSD/sparc (sister) (console)
login: data fault: pc=0xf018120c addr=0x0 sfsr=326<PERR=0,LVL=3,AT=1,FT=1,FAV,OW>
xcall(cpu3,0xf0263bc4): couldn't ping cpus: cpu0panic: kernel faultxcall(cpu3,0xf0263bc4): couldn't ping cpus:
cpu0syncing disks... xcall(cpu3,0xf0263bc4): couldn't ping cpus:~stopping on keyboard abort
Type 'go' to resume
Type help for more information
<#0> ok sync
panic: PROM sync command
Frame pointer is at 0xf02eabe0
Call traceback:
pc = 0xf0266618 args = (0xf0002000, 0xfe01c010, 0x0, 0x0, 0xf02ead08, 0x0, 0xf02eac50) fp = 0xf02eac50
pc = 0xf0193a08 args = (0x104, 0x0, 0xfe012000, 0xf032c000, 0xffff, 0xf032bc9c, 0xf02eacc0) fp = 0xf02eacc0
pc = 0xf0261ad8 args = (0xf02d2e50, 0xf032c000, 0xf032c000, 0x104, 0xffef201c, 0x0, 0xf02ead28) fp = 0xf02ead28
pc = 0xffd549e8 args = (0xffef53d0, 0x3e3bc3b3, 0x0, 0x0, 0x0, 0x0, 0xf02ead90) fp = 0xf02ead90
pc = 0xf022ecb4 args = (0xf02fbe64, 0xffd40f40, 0xf02f7400, 0xf032c000, 0x1fffff, 0xfffffffc, 0xf02eadf0) fp = 0xf02eadf0
pc = 0xf0230f0c args = (0x0, 0x100, 0xf03055b8, 0x0, 0x11, 0x1, 0xf02eae58) fp = 0xf02eae58
pc = 0xf022f24c args = (0xf086ae70, 0x0, 0xf0230e84, 0x634f, 0x0, 0x0, 0xf02eaec8) fp = 0xf02eaec8
pc = 0xf022e7c0 args = (0x8, 0xf07f0e90, 0xfe024000, 0xf0002000, 0xffff, 0xe, 0xf02eaf30) fp = 0xf02eaf30
pc = 0xf0008b10 args = (0x0, 0xf022e780, 0xd00, 0x118000e7, 0x200, 0xe, 0xf02eaf98) fp = 0xf02eaf98
pc = 0xf0221010 args = (0x400400, 0x0, 0xb00, 0x0, 0xe8f, 0xf032bc9c, 0xf66643b0) fp = 0xf66643b0
dump to dev 7,1 not possible
xcall(cpu0,0xf0263bc4): couldn't ping cpus: cpu1 cpu2 cpu3xcall(cpu0,0xf0263bc4): couldn't ping cpus: cpu1 cpu2 cpu3xcall(cpu0,0xf0263bc4): couldn't ping cpus: cpu1 cpu2 cpu3xcall(cpu0,0xf0263bc4): couldn't ping cpus: cpu1 cpu2 cpu3rebooting
Resetting ...
The following small program from Jens Nilsson causes the panic:
/*
* This program panics NetBSD/i386 20011117 in nathanw_sa branch
* running in vmware 2.0.
*
* It also seems to panic NetBSD/sparc MP current 20030201 .
*
* Start the program and press enter, within a second and the
* kernel will panic.
*/
#include <sys/types.h>
#include <err.h>
#include <poll.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#define WAKE_DELAY 1000
static int wake_fd;
static void *wake_thread(void *);
int
main(int argc, char *argv[])
{
struct pollfd pfds[2];
pthread_t wake_tid;
int fd[2], wake_read_fd, e;
char b[100];
if (pipe(fd) != 0)
err(1, "pipe");
wake_fd = fd[1];
wake_read_fd = fd[0];
memset(pfds, 0, sizeof(struct pollfd) * 2);
pfds[0].fd = wake_read_fd;
pfds[0].events = POLLIN;
pfds[1].fd = STDIN_FILENO;
pfds[1].events = POLLIN;
e = pthread_create(&wake_tid, NULL, wake_thread, "wake_thread");
if (e != 0)
errx(1, "pthread_create: %s", strerror(e));
for ( ;; ) {
warnx("main: waiting for IO");
if (poll(pfds, 2, INFTIM) == -1)
err(1, "poll");
if (pfds[0].revents) {
warnx("awakened by wake_thread, revents 0x%x",
(int)pfds[0].revents);
if (read(wake_read_fd, b, sizeof(b)) == -1)
err(1, "main: read wake_read_fd");
}
if (pfds[1].revents) {
warnx("got input from stdin, revents 0x%x",
(int)pfds[1].revents);
if (read(STDIN_FILENO, b, sizeof(b)) == -1)
err(1, "main: read stdin");
}
}
}
static void *
wake_thread(void *arg)
{
struct pollfd pfd;
char *name;
char b;
name = arg;
memset(&pfd, 0, sizeof(struct pollfd));
for ( ;; ) {
/*
* For some reason "poll(NULL, 0, WAKE_DELAY)"
* didn't work, but I suppose that's another issue.
*/
if (poll(&pfd, 1, WAKE_DELAY) == -1)
err(1, "%s: poll", name);
warnx("%s: wakening main", name);
if (write(wake_fd, &b, 1) != 1)
err(1, "%s: write", name);
}
}