Problems with ACPI tables in BIOS FLT2.0.46.01.00

Moderator: Andrey.Mazlin

Gatbb
Posts: 6
Joined: Fri Jan 11, 2019 1:41 am

Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by Gatbb »

I'm currently developing an application which uses the embedded real-time OS "RTOS-32" by On-Time.

This relies on several data structures obtained from the BIOS/UEFI firmware to correctly intialize the system's hardware. One of these tables is the "MP Floating Pointer Table" which describes the PCI/PCIe interrupt routing for the APICs used.

The table in the fitlet2's BIOS (date 2018-09-17) seems to be faulty insofar as it contains entries that use an invalid APIC.

This is a textual dump of the table, created with a tool supplied by the RTOS' vendor:

Code: Select all

> Found MP Floating Pointer Structure at 401036E0
> Conf Table at: 00000000
> Length       : 0
> Revision     : 0
> ConfType     : 0
> IMCR         : not present
>
> Table Header at: 401036F0
> Length         : 0
> Revision       : 0
> OEMID          :
> Product        :
> OEM Table Addr : 00000000
> Entry Count    : 39
> Local APIC Addr: FEE00000
>
> Bus 0: PCI
> Bus 99: PCI
> Bus 1: PCI
> Bus 2: PCI
> Bus 100: ISA
> IOAPIC, Id:32 at FEC00000, Flags: 01
> CPU with APIC Id: 0, Flags: 01, Sig: 00000000, Features: 00000200
> CPU with APIC Id: 2, Flags: 01, Sig: 00000000, Features: 00000200
> CPU with APIC Id: 4, Flags: 01, Sig: 00000000, Features: 00000200
> CPU with APIC Id: 6, Flags: 01, Sig: 00000000, Features: 00000200
> I/O Int 32: 2, Vectored, Bus 100, IRQ 0, Flags: [Edge, Active High]
> I/O Int 32: 9, Vectored, Bus 100, IRQ 9, Flags: [Level, Active Low]
> I/O Int 32:19, Vectored, Bus 0, Dev 2, Int A, Flags: [Level, Active Low]
> I/O Int 33: 1, Vectored, Bus 0, Dev 14, Int A, Flags: [Level, Active Low]
> I/O Int 32:20, Vectored, Bus 0, Dev 15, Int A, Flags: [Level, Active Low]
> I/O Int 32:19, Vectored, Bus 0, Dev 18, Int A, Flags: [Level, Active Low]
> I/O Int 32:22, Vectored, Bus 0, Dev 19, Int A, Flags: [Level, Active Low]
> I/O Int 32:23, Vectored, Bus 0, Dev 19, Int B, Flags: [Level, Active Low]
> I/O Int 32:20, Vectored, Bus 0, Dev 19, Int C, Flags: [Level, Active Low]
> I/O Int 32:21, Vectored, Bus 0, Dev 19, Int D, Flags: [Level, Active Low]
> I/O Int 32:17, Vectored, Bus 0, Dev 21, Int A, Flags: [Level, Active Low]
> I/O Int 33: 3, Vectored, Bus 0, Dev 22, Int A, Flags: [Level, Active Low]
> I/O Int 33: 4, Vectored, Bus 0, Dev 22, Int B, Flags: [Level, Active Low]
> I/O Int 33: 5, Vectored, Bus 0, Dev 22, Int C, Flags: [Level, Active Low]
> I/O Int 33: 6, Vectored, Bus 0, Dev 22, Int D, Flags: [Level, Active Low]
> I/O Int 33: 7, Vectored, Bus 0, Dev 23, Int A, Flags: [Level, Active Low]
> I/O Int 33: 8, Vectored, Bus 0, Dev 23, Int B, Flags: [Level, Active Low]
> I/O Int 33: 9, Vectored, Bus 0, Dev 23, Int C, Flags: [Level, Active Low]
> I/O Int 33:10, Vectored, Bus 0, Dev 23, Int D, Flags: [Level, Active Low]
> I/O Int 32: 4, Vectored, Bus 0, Dev 24, Int A, Flags: [Level, Active Low]
> I/O Int 32: 5, Vectored, Bus 0, Dev 24, Int B, Flags: [Level, Active Low]
> I/O Int 32: 6, Vectored, Bus 0, Dev 24, Int C, Flags: [Level, Active Low]
> I/O Int 32: 7, Vectored, Bus 0, Dev 24, Int D, Flags: [Level, Active Low]
> I/O Int 32: 3, Vectored, Bus 0, Dev 27, Int A, Flags: [Level, Active Low]
> I/O Int 33:15, Vectored, Bus 0, Dev 28, Int A, Flags: [Level, Active Low]
> I/O Int 33:18, Vectored, Bus 0, Dev 30, Int A, Flags: [Level, Active Low]
> I/O Int 32:20, Vectored, Bus 0, Dev 31, Int A, Flags: [Level, Active Low]
> I/O Int 32:23, Vectored, Bus 1, Dev 0, Int A, Flags: [Level, Active Low]
> I/O Int 32:20, Vectored, Bus 2, Dev 0, Int A, Flags: [Level, Active Low]
The numbers following "I/O Int" specifiy the APIC and the APIC's interrupt number. 32 stands for the first APIC in the system, 33 is faulty, since the table does not contain a definition for that APIC.

Though it is possible to manually construct a replacement to this table, this is quite an error-prone process, and has not been necessary on several other systems I'm running my application on.

These systems come with correct ACPI tables, so the problem seems not to be a generic problem of the RTOS.

These systems are the Intel NUC DN2820FYKH (Celeron N2830), the Gigabyte BRIX BACE3000 (Celeron N3000) and the Aaeon UpBoard (Atom x5-z8350).

Apparently the "MP Floating Pointer Table" might be not the only problem, there's also something very strange going on with the system's timers, but that might well be related to my manual replacement of the table.

Is there any hope for an updated BIOS/UEFI firmware that contains corrected APCI tables?

Thanks for any information

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

Forwarded the information to our R&D to investigate.
Will reply as soon as possible.

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

Sent a PM

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

A support request has been initiated with the BIOS vendor.
Could you please state in which mode have you install your OS with - UEFI or Legacy?

Gatbb
Posts: 6
Joined: Fri Jan 11, 2019 1:41 am

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by Gatbb »

The OS itself is a 32-Bit-OS, the UEFI boot code used can handle either x64 or x86 systems.

Here's a description of the boot process:
http://www.on-time.com/rtos-32-docs/rtt ... rget/uefi/

In my current testing environment, the OS can be booted either from the SD card slot or an USB stick - the results (that is, problems) are the same.

Hope that helps

(I already sent this information as a "PM")

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

Please provide the source code of the application that gets the MP floating table.

Gatbb
Posts: 6
Joined: Fri Jan 11, 2019 1:41 am

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by Gatbb »

This is not possible, due to license issues.

But that's not the point, the information the MP floating table is created from is the problem, and the crucial step in the software can be described in simple terms.

The interrupt routing table can be found in the DSDT in a table named AR00. Here is given the PCI source interrupt (effectively, INTA to INTC) for every PCI/PCIe device, and the interrupt used on an IOAPIC.

The (closed source) software scans the table and determines which IOAPIC to use by looking at the interrupt number; if it's in the range 0 to 23, the primary IOAPIC gets used, if it's in the range 24 to 47, a second IOAPIC gets used and so on.

The table found in the firmware for the fitlet2 uses interrupt numbers well above 23, which implies the use of a second IOAPIC.

But the DSDT does not contain information on a secondary IOAPIC.

So either the information on that second IOAPIC is missing or the interrupt routing table itself is faulty.

I've looked at the DSDTs for several systems and have only once seen more than one IOAPIC in use, that was a XEON multiprocessor system made by DELL.

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

Thank you for the information.
We'll communicate this to the BIOS vendor.

tamir
Site Admin
Posts: 419
Joined: Mon Dec 25, 2017 4:21 pm

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by tamir »

The BIOS vendor would like to get the application, not its source code, would that be possible ?

Gatbb
Posts: 6
Joined: Fri Jan 11, 2019 1:41 am

Re: Problems with ACPI tables in BIOS FLT2.0.46.01.00

Post by Gatbb »

The application itself would be quite useless, since it relies on specialized hardware it works with.

I'll work out some kind of test program to demonstrate the problems.

Thanks again for your support

Post Reply

Return to “fitlet2 software”