Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 827 → Rev 830

/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.