On 30/05/2020 00:19, Jason A. Donenfeld wrote:

> Note that you need to run this with `-nographic`, because the kernel
> crashes when trying to use vgafb on sparc64/qemu. I've witnessed two
> varieties crashes:
> 
> - https://data.zx2c4.com/openbsd-6.7-sparc64-vga-panic-miniroot67.png
> This happens when booting up miniroot67.fs
> 
> - https://data.zx2c4.com/openbsd-6.7-sparc64-vga-panic-after-installation.png
> This happens after installation openbsd onto disk properly, and then
> booting up into it.
> 
> Passing `-nographic` prevents these from happening, since vgafb doesn't
> bind to anything.
> 
> I don't have a bsd.gdb in order to addr2line this, but if the miniroot
> panic is related to the normal panic, and we then assume alignment
> issues in fb_get_console_metrics, then I wonder if the below patch would
> make a difference. On the other hand, a "data access fault" makes it
> seem more likely that OF_interpret is just getting bogus addresses from
> buggy qemu firmware.
> 
> I probably have another two hours to go in waiting for this thing to
> build...
> 
> Jason
> 
> --- a/sys/arch/sparc64/dev/fb.c
> +++ b/sys/arch/sparc64/dev/fb.c
> @@ -507,6 +507,7 @@ int
>  fb_get_console_metrics(int *fontwidth, int *fontheight, int *wtop, int 
> *wleft)
>  {
>       cell_t romheight, romwidth, windowtop, windowleft;
> +     uint64_t romheight_64, romwidth_64, windowtop_64, windowleft_64;
> 
>       /*
>        * Get the PROM font metrics and address
> @@ -520,10 +521,15 @@ fb_get_console_metrics(int *fontwidth, int *fontheight, 
> int *wtop, int *wleft)
>           windowtop == 0 || windowleft == 0)
>               return (1);
> 
> -     *fontwidth = (int)*(uint64_t *)romwidth;
> -     *fontheight = (int)*(uint64_t *)romheight;
> -     *wtop = (int)*(uint64_t *)windowtop;
> -     *wleft = (int)*(uint64_t *)windowleft;
> +     memcpy(&romheight_64, (void *)romheight, sizeof(romheight_64));
> +     memcpy(&romwidth_64, (void *)romwidth, sizeof(romwidth_64));
> +     memcpy(&windowtop_64, (void *)windowtop, sizeof(windowtop_64));
> +     memcpy(&windowleft_64, (void *)windowleft, sizeof(windowleft_64));
> +
> +     *fontwidth = (int)romwidth_64;
> +     *fontheight = (int)romheight_64;
> +     *wtop = (int)windowtop_64;
> +     *wleft = (int)windowleft_64;
> 
>       return (0);
>  }

AFAICT the problem here is the Forth being used at
https://github.com/openbsd/src/blob/master/sys/arch/sparc64/dev/fb.c#L511: 
since the
addr word isn't part of the IEEE-1275 specification, it is currently 
unimplemented in
OpenBIOS.

Why is addr needed here? Does the fb.c driver try and change these values 
rather than
just read them?


ATB,

Mark.

Reply via email to