Skip to content

Commit 2ed40e2

Browse files
committed
pit: fix initialization
init_pit() should send first to the command port the value for the chosen configuration, not 0. This 0 value is due to an error in how the value is set using bits. Signed-off-by: Daniele Ahmed <ahmeddan@amazon.com> Reported-By: Mathias Krause <minipli@grsecurity.net>
1 parent a6ff573 commit 2ed40e2

2 files changed

Lines changed: 11 additions & 12 deletions

File tree

drivers/pit.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232

3333
void init_pit(uint8_t dst_cpus) {
3434
printk("Initializing PIT\n");
35-
outb(PIT_COMMAND_PORT,
36-
PIT_CHANNEL_0 & PIT_ACCESS_MODE_LH & PIT_OP_MODE_RATE & PIT_BCD_MODE);
35+
outb(PIT_COMMAND_PORT, PIT_CHANNEL_0 | PIT_ACCESS_MODE_LH | PIT_OP_MODE_RATE);
3736
outb(PIT_DATA_PORT_CH0, PIT_FREQUENCY & 0xFF); /* send low byte */
3837
outb(PIT_DATA_PORT_CH0, (PIT_FREQUENCY & 0xFF00) >> 8); /* send high byte */
3938
configure_isa_irq(PIT_IRQ, PIT_IRQ0_OFFSET, IOAPIC_DEST_MODE_PHYSICAL, dst_cpus);

include/drivers/pit.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,24 @@
3737
#define PIT_DATA_PORT_CH0 0x40
3838
#define PIT_COMMAND_PORT 0x43
3939

40-
#define PIT_CHANNEL_0 (~((1 << 7) | (1 << 6)))
40+
#define PIT_CHANNEL_0 0
4141
#define PIT_ACCESS_MODE_LOW (1 << 4)
4242
#define PIT_ACCESS_MODE_HIGH (1 << 5)
4343
#define PIT_ACCESS_MODE_LH (PIT_ACCESS_MODE_LOW | PIT_ACCESS_MODE_HIGH)
4444

4545
enum pit_operational_mode {
46-
PIT_OP_MODE_COUNT = 0x00, /* interrupt on terminal count */
47-
PIT_OP_MODE_ONE_SHOT = 0x01, /* hardware re-triggerable one-shot */
48-
PIT_OP_MODE_RATE = 0x02, /* rate generator */
49-
PIT_OP_MODE_WAVE = 0x03, /* square wave generator */
50-
PIT_OP_MODE_SW_STROBE = 0x04, /* software triggered strobe */
51-
PIT_OP_MODE_HW_STROBE = 0x05, /* hardware triggered strobe */
52-
PIT_OP_MODE_RATE_6 = 0x06, /* rate generator */
53-
PIT_OP_MODE_WAVE_7 = 0x07 /* square wave generator */
46+
PIT_OP_MODE_COUNT = 0x00 << 1, /* interrupt on terminal count */
47+
PIT_OP_MODE_ONE_SHOT = 0x01 << 1, /* hardware re-triggerable one-shot */
48+
PIT_OP_MODE_RATE = 0x02 << 1, /* rate generator */
49+
PIT_OP_MODE_WAVE = 0x03 << 1, /* square wave generator */
50+
PIT_OP_MODE_SW_STROBE = 0x04 << 1, /* software triggered strobe */
51+
PIT_OP_MODE_HW_STROBE = 0x05 << 1, /* hardware triggered strobe */
52+
PIT_OP_MODE_RATE_6 = 0x06 << 1, /* rate generator */
53+
PIT_OP_MODE_WAVE_7 = 0x07 << 1 /* square wave generator */
5454
};
5555
typedef enum pit_operational_mode pit_operational_mode_t;
5656

57-
#define PIT_BCD_MODE (~(1 << 0))
57+
#define PIT_BCD_MODE 1
5858

5959
extern void init_pit(uint8_t dst_cpus);
6060
extern void pit_disable(void);

0 commit comments

Comments
 (0)