Changeset 149d14e5 in mainline


Ignore:
Timestamp:
2009-04-06T16:18:41Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
13a638d
Parents:
415d272
Message:

ia32, amd64: do not reboot via a triple fault (which is nasty), but use the i8042 controller to trigger CPU reset

Location:
kernel
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/amd64.c

    r415d272 r149d14e5  
    282282}
    283283
     284void arch_reboot(void)
     285{
     286#ifdef CONFIG_PC_KBD
     287        i8042_cpu_reset((i8042_t *) I8042_BASE);
     288#endif
     289}
     290
    284291/** @}
    285292 */
  • kernel/arch/amd64/src/pm.c

    r415d272 r149d14e5  
    231231}
    232232
    233 /* Reboot the machine by initiating
    234  * a triple fault
    235  */
    236 void arch_reboot(void)
    237 {
    238         preemption_disable();
    239         ipl_t ipl = interrupts_disable();
    240        
    241         memsetb(idt, sizeof(idt), 0);
    242         idtr_load(&idtr);
    243        
    244         interrupts_restore(ipl);
    245         asm volatile (
    246                 "int $0x03\n"
    247                 "cli\n"
    248                 "hlt\n"
    249         );
    250 }
    251 
    252233/** @}
    253234 */
  • kernel/arch/ia32/src/ia32.c

    r415d272 r149d14e5  
    238238}
    239239
     240void arch_reboot(void)
     241{
     242#ifdef CONFIG_PC_KBD
     243        i8042_cpu_reset((i8042_t *) I8042_BASE);
     244#endif
     245}
     246
    240247/** @}
    241248 */
  • kernel/arch/ia32/src/pm.c

    r415d272 r149d14e5  
    233233}
    234234
    235 /* Reboot the machine by initiating
    236  * a triple fault
    237  */
    238 void arch_reboot(void)
    239 {
    240         preemption_disable();
    241         ipl_t ipl = interrupts_disable();
    242        
    243         memsetb(idt, sizeof(idt), 0);
    244        
    245         ptr_16_32_t idtr;
    246         idtr.limit = sizeof(idt);
    247         idtr.base = (uintptr_t) idt;
    248         idtr_load(&idtr);
    249        
    250         interrupts_restore(ipl);
    251         asm volatile (
    252                 "int $0x03\n"
    253                 "cli\n"
    254                 "hlt\n"
    255         );
    256 }
    257 
    258235/** @}
    259236 */
  • kernel/genarch/include/drivers/i8042/i8042.h

    r415d272 r149d14e5  
    5454
    5555extern indev_t *i8042_init(i8042_t *, inr_t);
     56extern void i8042_cpu_reset(i8042_t *);
    5657
    5758#endif
  • kernel/genarch/src/drivers/i8042/i8042.c

    r415d272 r149d14e5  
    5151#define i8042_SET_COMMAND  0x60
    5252#define i8042_COMMAND      0x69
     53#define i8042_CPU_RESET    0xfe
    5354
    5455#define i8042_BUFFER_FULL_MASK  0x01
     
    9899        irq_register(&instance->irq);
    99100       
    100         /*
    101          * Clear input buffer.
    102          */
     101        /* Clear input buffer */
    103102        while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
    104103                (void) pio_read_8(&dev->data);
     
    107106}
    108107
     108/* Reset CPU by pulsing pin 0 */
     109void i8042_cpu_reset(i8042_t *dev)
     110{
     111        interrupts_disable();
     112       
     113        /* Clear input buffer */
     114        while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
     115                (void) pio_read_8(&dev->data);
     116       
     117        /* Reset CPU */
     118        pio_write_8(&dev->status, i8042_CPU_RESET);
     119}
     120
    109121/** @}
    110122 */
Note: See TracChangeset for help on using the changeset viewer.