Fixed bug with sysenter not restoring interrupts. Cleaned up mistakenly left in debug...
authorPaul Pearce <pearce@eecs.berkeley.edu>
Mon, 15 Jun 2009 04:28:59 +0000 (21:28 -0700)
committerKevin Klues <klueska@eecs.berkeley.edu>
Wed, 1 Jul 2009 20:32:50 +0000 (13:32 -0700)
Sysenter, somewhat covertly, disables the IF bit in the eflags register upon its invokation. This is
described only in the RTL, not the functional description. The result of this is upon entering userland,
if syscalls were serviced by the sysenter facility, interrupts would be disabled and not come back online.
The fix is to force the IF bit back  on as soon as we get inside the syscall wrapper.

Also removed some debugging stuff from rl8168.c.

kern/src/rl8168.c

index 3f5bb11..1a301c4 100644 (file)
@@ -312,17 +312,18 @@ void init_nic() {
 */
 
        //poll_rx_descriptors();
-       udelay(3000000);
+       //udelay(3000000);
                                
        // Trigger sw based nic interrupt
-       outb(io_base_addr + 0x38, 0x1);
-       udelay(3000000);
+       //outb(io_base_addr + 0x38, 0x1);
+       //udelay(3000000);
        
        //nic_debug("Triggered NIC interrupt.\n");
        
        return;
        
 }
+
 // We need to evaluate this routine in terms of concurrency.
 // We also need to figure out whats up with different core interrupts
 void nic_interrupt_handler(trapframe_t *tf, void* data) {
@@ -531,11 +532,8 @@ int send_packet(const char *data, size_t len) {
        
        nic_packet_debug("-->Sent packet.\n");
        
-       
        outb(io_base_addr + RL_TX_CTRL_REG, RL_TX_SEND_MASK);
        
-       
-       
        return len;
 }