/kernel/trunk/genarch/src/mm/asid_fifo.c |
---|
32,17 → 32,27 |
#include <typedefs.h> |
#include <adt/fifo.h> |
#define FIFO_STATIC_LIMIT 1024 |
#define FIFO_STATIC (ASIDS_ALLOCABLE<FIFO_STATIC_LIMIT) |
/** |
* FIFO queue containing unassigned ASIDs. |
* Can be only accessed when asidlock is held. |
*/ |
FIFO_INITIALIZE(free_asids, asid_t, ASIDS_ALLOCABLE); |
#if FIFO_STATIC |
FIFO_INITIALIZE_STATIC(free_asids, asid_t, ASIDS_ALLOCABLE); |
#else |
FIFO_INITIALIZE_DYNAMIC(free_asids, asid_t, ASIDS_ALLOCABLE); |
#endif |
/** Initialize data structures for O(1) ASID allocation and deallocation. */ |
void asid_fifo_init(void) |
{ |
int i; |
#if (!FIFO_STATIC) |
fifo_create(free_asids); |
#endif |
for (i = 0; i < ASIDS_ALLOCABLE; i++) { |
fifo_push(free_asids, ASID_START + i); |
} |
/kernel/trunk/generic/include/adt/fifo.h |
---|
27,13 → 27,13 |
*/ |
/* |
* This implementation of FIFO stores values in a statically |
* allocated array created on each FIFO's initialization. |
* As such, these FIFOs have upper bound on number of values |
* they can store. Push and pop operations are done via accessing |
* the array through head and tail indices. Because of better |
* operation ordering in fifo_pop(), the access policy for these |
* two indices is to 'increment (mod size of FIFO) and use'. |
* This implementation of FIFO stores values in an array |
* (static or dynamic). As such, these FIFOs have upper bound |
* on number of values they can store. Push and pop operations |
* are done via accessing the array through head and tail indices. |
* Because of better operation ordering in fifo_pop(), the access |
* policy for these two indices is to 'increment (mod size of FIFO) |
* and use'. |
*/ |
#ifndef __FIFO_H__ |
40,14 → 40,18 |
#define __FIFO_H__ |
#include <typedefs.h> |
#include <mm/slab.h> |
/** Create and initialize FIFO. |
/** Create and initialize static FIFO. |
* |
* FIFO is allocated statically. |
* This macro is suitable for creating smaller FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE(name, t, itms) \ |
#define FIFO_INITIALIZE_STATIC(name, t, itms) \ |
struct { \ |
t fifo[(itms)]; \ |
count_t items; \ |
59,6 → 63,28 |
.tail = 0 \ |
} |
/** Create and prepare dynamic FIFO. |
* |
* FIFO is allocated dynamically. |
* This macro is suitable for creating larger FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_DYNAMIC(name, t, itms) \ |
struct { \ |
t *fifo; \ |
count_t items; \ |
index_t head; \ |
index_t tail; \ |
} name = { \ |
.fifo = NULL, \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Pop value from head of FIFO. |
* |
* @param name FIFO name. |
77,4 → 103,11 |
#define fifo_push(name, value) \ |
name.fifo[name.tail = (name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) |
/** Allocate memory for dynamic FIFO. |
* |
* @param name FIFO name. |
*/ |
#define fifo_create(name) \ |
name.fifo = malloc(sizeof(*name.fifo) * name.items, 0) |
#endif |
/kernel/trunk/arch/sparc64/src/mm/tlb.c |
---|
28,7 → 28,6 |
#include <arch/mm/tlb.h> |
#include <mm/tlb.h> |
#include <genarch/mm/asid_fifo.h> |
#include <arch/mm/frame.h> |
#include <arch/mm/page.h> |
#include <arch/mm/mmu.h> |
56,8 → 55,6 |
frame_address_t fr; |
page_address_t pg; |
asid_fifo_init(); |
fr.address = config.base; |
pg.address = config.base; |
/kernel/trunk/arch/sparc64/src/mm/as.c |
---|
28,9 → 28,11 |
#include <arch/mm/as.h> |
#include <genarch/mm/as_ht.h> |
#include <genarch/mm/asid_fifo.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_ht_operations; |
asid_fifo_init(); |
} |
/kernel/trunk/arch/ia64/src/mm/as.c |
---|
28,9 → 28,11 |
#include <arch/mm/as.h> |
#include <genarch/mm/as_ht.h> |
#include <genarch/mm/asid_fifo.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_ht_operations; |
asid_fifo_init(); |
} |
/kernel/trunk/arch/mips32/src/mm/tlb.c |
---|
28,7 → 28,6 |
#include <arch/mm/tlb.h> |
#include <mm/asid.h> |
#include <genarch/mm/asid_fifo.h> |
#include <mm/tlb.h> |
#include <mm/page.h> |
#include <mm/as.h> |
58,8 → 57,6 |
{ |
int i; |
asid_fifo_init(); |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
cp0_entry_hi_write(0); |
cp0_entry_lo0_write(0); |
/kernel/trunk/arch/mips32/src/mm/as.c |
---|
28,6 → 28,7 |
#include <arch/mm/as.h> |
#include <genarch/mm/as_pt.h> |
#include <genarch/mm/asid_fifo.h> |
#include <arch/mm/tlb.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
38,6 → 39,7 |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
asid_fifo_init(); |
} |
/** Install address space. |