OSDev.org
https://forum.osdev.org/

UEFI :: PIC problems
https://forum.osdev.org/viewtopic.php?f=1&t=57153
Page 1 of 1

Author:  SanderR [ Sat Mar 09, 2024 2:59 pm ]
Post subject:  UEFI :: PIC problems

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:
    #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?

Author:  Octocontrabass [ Sat Mar 09, 2024 3:16 pm ]
Post subject:  Re: UEFI :: PIC problems

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:
    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.

Author:  SanderR [ Sun Mar 10, 2024 2:06 am ]
Post subject:  Re: UEFI :: PIC problems

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:
outportb(PIC1_DATA, 0);
outportb(PIC2_DATA, 0);

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/