Page 1 of 1

UEFI :: PIC problems

Posted: Sat Mar 09, 2024 2:59 pm
by SanderR
Hello everyone,

I have a question about UEFI and PIC.
I have 6 testing computers, where 3 of them have UEFI.
I test UEFI with qemu too.

On QEMU and 2 of me real hardware,

Code: Select all

    #define PIC1		0x20		/* IO base address for master PIC */
    #define PIC2		0xA0		/* IO base address for slave PIC */
    #define PIC1_COMMAND	PIC1
    #define PIC1_DATA	(PIC1+1)
    #define PIC2_COMMAND	PIC2
    #define PIC2_DATA	(PIC2+1)

    #define ICW1_ICW4	0x01		/* ICW4 (not) needed */
    #define ICW1_SINGLE	0x02		/* Single (cascade) mode */
    #define ICW1_INTERVAL4	0x04		/* Call address interval 4 (8) */
    #define ICW1_LEVEL	0x08		/* Level triggered (edge) mode */
    #define ICW1_INIT	0x10		/* Initialization - required! */
 
    #define ICW4_8086	0x01		/* 8086/88 (MCS-80/85) mode */
    #define ICW4_AUTO	0x02		/* Auto (normal) EOI */
    #define ICW4_BUF_SLAVE	0x08		/* Buffered mode/slave */
    #define ICW4_BUF_MASTER	0x0C		/* Buffered mode/master */
    #define ICW4_SFNM	0x10		/* Special fully nested (not) */

    uint8_t idtoffsetcode = 0x20;

    uint8_t oldpic1 = inportb(PIC1_DATA);
    uint8_t oldpic2 = inportb(PIC2_DATA);
    
    outportb(PIC1, 0x11);
    outportb(PIC2, 0x11);
    outportb(PIC1_DATA, idtoffsetcode);
    outportb(PIC2_DATA, idtoffsetcode + 8);
    outportb(PIC1_DATA, ICW1_INTERVAL4);
    outportb(PIC2_DATA, ICW1_SINGLE);
    outportb(PIC1_DATA, ICW1_ICW4);
    outportb(PIC2_DATA, ICW1_ICW4);
    outportb(PIC1_DATA, 0x0);
    outportb(PIC2_DATA, 0x0);
    outportb(PIC1_DATA,oldpic1);
    outportb(PIC2_DATA,oldpic2);
works perfectly. but on one hardware it does trigger a tripple fault and resets.
Does anyone have a idea how this is possible?

Re: UEFI :: PIC problems

Posted: Sat Mar 09, 2024 3:16 pm
by Octocontrabass
If you haven't called ExitBootServices(), you can't touch the PIC because the firmware might be using it.

If ACPI says there isn't a PIC, you can't touch the PIC because it doesn't exist.
SanderR wrote:

Code: Select all

    outportb(PIC1_DATA,oldpic1);
    outportb(PIC2_DATA,oldpic2);
You're reusing the firmware's interrupt mask instead of setting your own. You might receive an interrupt that you're not prepared to handle.

Re: UEFI :: PIC problems

Posted: Sun Mar 10, 2024 2:06 am
by SanderR
Yes!
The reusing of the firmwares interrupt mask was the problem!
Thanks allot!

I set them all to 0 and enable it whenever I use it, and its working now!

Code: Select all

outportb(PIC1_DATA, 0);
outportb(PIC2_DATA, 0);