tsutsui / netbsd-src

Automatic conversion of the NetBSD src CVS module, use with care. Please submit bugs/changes via https://gnats.netbsd.org
https://www.NetBSD.org
2 stars 0 forks source link

m68k: PR/4265 "crashme freezes NetBSD on an hp433" の調査 #23

Open tsutsui opened 1 month ago

tsutsui commented 1 month ago

https://gnats.netbsd.org/4265 にあるが、NetBSD/hp300 の 68040 で invalid な F line 命令を実行しようとするとハングするという問題が大昔からある。

手元のテストプログラムだと以下:

#include <malloc.h>
#include <stdio.h>
#include <string.h>

#define BUFSIZE 1024

void (*bomb)(void);

static const unsigned char a[] = {
//0xf2, 0x43, 0xf4, 0x7a, // silent hard hang
//0xf2, 0x43, 0xf5, 0x18, // silent hard hang
//0xf2, 0x44, 0xf4, 0x7a, // silent hard hang
//0xf2, 0x44, 0xf0, 0x00, // silent hard hang
//0xf2, 0x44, 0xf0, 0x00, 0x4e, 0x75 //
0xf2, 0x44, 0x00, 0x00, // SIGSEGV

//0xf2, 0x43, 0x4e, 0x75, // SIGSEGV
//0xf2, 0x43, 0x4e, 0x7b, 0x00, 0x02, // SIGSEGV

//0xf6, 0x32, 0xf5, 0x18, // SIGILL
};

int
main(int argc, char *argv[])
{
    unsigned char *p;

    p = malloc(BUFSIZE);
    memset(p, 0, BUFSIZE);
    memcpy(p, a, sizeof(a));
    bomb = (void *)p;
    printf("address = %p\n", p);
    (*bomb)();

    return 0;
}

この問題について、PRにあるとおり「XC68040 では再現するが MC68040 では再現しない」という仮説がある。

https://www.nxp.com/docs/en/errata/MC68040DE_D.txt のエラッタを確認するところからだが、まずは MC68040 を入手してあるので HP9000/380 とかに挿してみて XC68040 の HP300/382 との差異を確認するところから。