/branches/fs/kernel/genarch/src/kbd/i8042.c |
---|
74,8 → 74,8 |
#define i8042_COMMAND 0x69 |
#define i8042_BUFFER_FULL_MASK 0x01 |
#define i8042_WAIT_MASK 0x02 |
#define i8042_MOUSE_DATA 0x20 |
#define i8042_WAIT_MASK 0x02 |
#define i8042_MOUSE_DATA 0x20 |
static void i8042_suspend(chardev_t *); |
static void i8042_resume(chardev_t *); |
90,23 → 90,10 |
static irq_t i8042_kbd_irq; |
static irq_t i8042_mouse_irq; |
/** Wait until the controller reads its data. */ |
static void i8042_wait(void) { |
while (i8042_status_read() & i8042_WAIT_MASK) { |
/* wait */ |
} |
} |
void i8042_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
i8042_wait(); |
i8042_command_write(i8042_SET_COMMAND); |
i8042_wait(); |
i8042_data_write(i8042_COMMAND); |
i8042_wait(); |
spinlock_lock(&i8042_kbd_irq.lock); |
i8042_kbd_irq.notif_cfg.notify = false; |
spinlock_unlock(&i8042_kbd_irq.lock); |
140,34 → 127,28 |
return IRQ_ACCEPT; |
} |
static void i8042_kbd_irq_handler(irq_t *irq, void *arg, ...) |
static void i8042_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
ipc_irq_send_notif(irq); |
else { |
uint8_t x; |
uint8_t data; |
uint8_t status; |
while (((status = i8042_status_read()) & i8042_BUFFER_FULL_MASK)) { |
x = i8042_data_read(); |
data = i8042_data_read(); |
if ((status & i8042_MOUSE_DATA)) |
continue; |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
if (data & KEY_RELEASE) |
key_released(data ^ KEY_RELEASE); |
else |
key_pressed(x); |
key_pressed(data); |
} |
} |
} |
static void i8042_mouse_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
ipc_irq_send_notif(irq); |
} |
/** Initialize i8042. */ |
void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr) |
{ |
178,7 → 159,7 |
i8042_kbd_irq.devno = kbd_devno; |
i8042_kbd_irq.inr = kbd_inr; |
i8042_kbd_irq.claim = i8042_claim; |
i8042_kbd_irq.handler = i8042_kbd_irq_handler; |
i8042_kbd_irq.handler = i8042_irq_handler; |
irq_register(&i8042_kbd_irq); |
irq_initialize(&i8042_mouse_irq); |
185,7 → 166,7 |
i8042_mouse_irq.devno = mouse_devno; |
i8042_mouse_irq.inr = mouse_inr; |
i8042_mouse_irq.claim = i8042_claim; |
i8042_mouse_irq.handler = i8042_mouse_irq_handler; |
i8042_mouse_irq.handler = i8042_irq_handler; |
irq_register(&i8042_mouse_irq); |
trap_virtual_enable_irqs(1 << kbd_inr); |
/branches/fs/kernel/genarch/src/fb/fb.c |
---|
511,8 → 511,6 |
sysinfo_set_item_val("fb.scanline", NULL, scan); |
sysinfo_set_item_val("fb.visual", NULL, visual); |
sysinfo_set_item_val("fb.address.physical", NULL, addr); |
sysinfo_set_item_val("fb.address.color", NULL, |
PAGE_COLOR((uintptr_t) fbaddress)); |
sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
/* Allocate double buffer */ |
/branches/fs/kernel/genarch/src/mm/asid.c |
---|
62,15 → 62,9 |
#include <arch/mm/asid.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <arch.h> |
#include <adt/list.h> |
#include <debug.h> |
/** |
* asidlock protects the asids_allocated counter. |
*/ |
SPINLOCK_INITIALIZE(asidlock); |
static count_t asids_allocated = 0; |
/** Allocate free address space identifier. |
90,7 → 84,6 |
* Check if there is an unallocated ASID. |
*/ |
spinlock_lock(&asidlock); |
if (asids_allocated == ASIDS_ALLOCABLE) { |
/* |
108,7 → 101,6 |
list_remove(tmp); |
as = list_get_instance(tmp, as_t, inactive_as_with_asid_link); |
mutex_lock_active(&as->lock); |
/* |
* Steal the ASID. |
130,8 → 122,6 |
*/ |
as_invalidate_translation_cache(as, 0, (count_t) -1); |
mutex_unlock(&as->lock); |
/* |
* Get the system rid of the stolen ASID. |
*/ |
156,8 → 146,6 |
tlb_shootdown_finalize(); |
} |
spinlock_unlock(&asidlock); |
return asid; |
} |
170,16 → 158,8 |
*/ |
void asid_put(asid_t asid) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&asidlock); |
asids_allocated--; |
asid_put_arch(asid); |
spinlock_unlock(&asidlock); |
interrupts_restore(ipl); |
} |
/** @} |
/branches/fs/kernel/genarch/src/mm/page_ht.c |
---|
55,7 → 55,8 |
static bool compare(unative_t key[], count_t keys, link_t *item); |
static void remove_callback(link_t *item); |
static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags); |
static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, |
int flags); |
static void ht_mapping_remove(as_t *as, uintptr_t page); |
static pte_t *ht_mapping_find(as_t *as, uintptr_t page); |
103,7 → 104,7 |
* of occurring. Least significant bits of VPN compose the |
* hash index. |
*/ |
index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES-1)); |
index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES - 1)); |
/* |
* Address space structures are likely to be allocated from |
110,7 → 111,7 |
* similar addresses. Least significant bits compose the |
* hash index. |
*/ |
index |= ((unative_t) as) & (PAGE_HT_ENTRIES-1); |
index |= ((unative_t) as) & (PAGE_HT_ENTRIES - 1); |
return index; |
} |
136,7 → 137,8 |
t = hash_table_get_instance(item, pte_t, link); |
if (keys == PAGE_HT_KEYS) { |
return (key[KEY_AS] == (uintptr_t) t->as) && (key[KEY_PAGE] == t->page); |
return (key[KEY_AS] == (uintptr_t) t->as) && |
(key[KEY_PAGE] == t->page); |
} else { |
return (key[KEY_AS] == (uintptr_t) t->as); |
} |
175,7 → 177,10 |
void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
{ |
pte_t *t; |
unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
if (!hash_table_find(&page_ht, key)) { |
t = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC); |
209,7 → 214,10 |
*/ |
void ht_mapping_remove(as_t *as, uintptr_t page) |
{ |
unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
/* |
* Note that removed PTE's will be freed |
234,7 → 242,10 |
{ |
link_t *hlp; |
pte_t *t = NULL; |
unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
hlp = hash_table_find(&page_ht, key); |
if (hlp) |
/branches/fs/kernel/genarch/src/acpi/acpi.c |
---|
88,7 → 88,7 |
static void map_sdt(struct acpi_sdt_header *sdt) |
{ |
page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE); |
page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
map_structure((uintptr_t) sdt, sdt->length); |
} |