On Mon, Dec 10, 2012 at 08:04:11AM +0100, Gerd Hoffmann wrote:
> >>> +        Method(_STA, 0) {
> >>> +            Store(0x10, CMDP)    // APPLESMC_READ_CMD
> >>> +            Store(CMDP, Local0)
> >>> +            If (LEqual(Local0, 0x0c)) {
> > 
> > Also, once you've tickled the CMDP, the SMC internal state is no
> > longer what OS X expects, so it gets all hung up on that later during
> > the boot process. I guess I'll put "gain thorough understanding of the
> > qemu applesmc state machine" on my ToDo list :)
> 
> _STA having side effects isn't exactly nice.  Doing that once in _INI
> instead might work better.

But _INI relies on _STA being evaluated first, so unless I'm missing
something that'd be a catch-22 :(

So, I can think of a couple of alternatives:

        1. have a SMC._STA() method that queries something

                a) could be fw_cfg (may require hacking
                   qemu/hw/applesmc.c *and* fw_cfg.c to make that happen)

                b) could be the emulated SMC itself:

                        - right now, only the Data (0x300) and
                          Command (0x304) ports are ever read/written,
                          so we could set aside a magic qemu-smc-only
                          "port" (e.g. 0x308, but anything within the
                          32-byte range should work) and have it
                          always return a "magic" number when read
                          (via a qemu/hw/applesmc.c patch);

                          _STA() could return 0xB if the magic number
                          is there, or 0x0 otherwise

        2. have a hardcoded SMC._STA() that always returns 0xB

                a) This is where my ACPI n00b-ness starts to show. This
                   would require somehow compiling the DSDT during QEMU
                   startup, once we know whether '-device applesmc' was
                   given on the qemu command line or not.

                b) Kevin mentioned the SSDT and/or "BDAT" as other
                   potential mechanisms to make something like this
                   happen, but I'm not sure whether an SMC device node
                   in the SSDT (as opposed to the DSDT) would be enough
                   to "placate" OS X, aside from the (maybe simple)
                   problem of figuring out how to control whether it
                   gets included or not from the surrounding SeaBIOS
                   and/or QEMU C code.

                   As for BDAT, grepping through the SeaBIOS source
                   only gets me a few lines in acpi.c and
                   acpi-dsdt-pci-crs.dsl, something related to an
                   "operating region", not too clear how I'd
                   get "there" from "here"...

Looking at the above, I think 1.b is my favorite, but then again,
I may be wrong...

Any clue, advice, or feedback much appreciated !

--Gabriel

_______________________________________________
SeaBIOS mailing list
[email protected]
http://www.seabios.org/mailman/listinfo/seabios

Reply via email to