49 natq v = 1ULL << (liv * 9 + 12);
77 return (v + dr - 1) & ~mask;
138 int shift = 12 + (liv - 1) * 9;
139 natq mask = 0x1ffULL << shift;
140 return (v & mask) >> shift;
229 stack *sp() {
return &s[l - 1]; }
230 stack
const *sp()
const {
return &s[l - 1]; }
233 stack *sp(
int lvl) {
return &s[lvl - 1]; }
237 stack *pp() {
return &s[
MAX_LIV]; }
238 stack
const *pp()
const {
return &s[
MAX_LIV]; }
241 bool done()
const {
return !sp()->tab; }
256 vaddr end = beg + dim - 1;
283 operator bool()
const {
309 return max(pp()->cur, sp()->cur);
475 const char* err_msg =
"";
480 fpanic(
"map: ps_lvl %d non ammesso (deve essere compreso tra 1 e %d)",
487 if (begin & (dr - 1)) {
488 fpanic(
"map: begin=%llx non allineato alle pagine di livello %d",
489 static_cast<unsigned long long>(begin), ps_lvl);
491 if (end & (dr - 1)) {
492 fpanic(
"map: end=%llx non allineato alle pagine di livello %d",
493 static_cast<unsigned long long>(end), ps_lvl);
496 if (flags & ~allowed_flags) {
497 fpanic(
"map: flags contiene bit non validi: %llx",
498 static_cast<unsigned long long>(flags & ~allowed_flags));
510 tab_iter it(tab, begin, end - begin);
511 for ( ; it; it.
next()) {
528 err_msg =
"impossibile allocare tabella";
537 err_msg =
"gia' mappato";
544 err_msg =
"gia' mappato";
551 err_msg =
"getpaddr() ha restituito 0";
587 flog(
LOG_WARN,
"map: indirizzo %llx, livello %d: %s",
static_cast<unsigned long long>(v), l, err_msg);
603 return max(v, begin);
611 return map(tab, begin, end, flags, tmp, ps_lvl);
630 tab_iter it(tab, begin, end - begin);
656 if (v < begin || v +
dim_region(l - 1) - 1 > end - 1) {
657 fpanic(
"unmap: tentativo di riumuovere traduzione esterna a [%lx, %lx)",
678 unmap(tab, begin, end, tmp);
Iteratore per la visita di un TRIE.
tab_iter(paddr tab, vaddr beg, natq dim=1)
inzializza un tab_iter per una visita in ordine anticipato.
void post()
inizia una visita in ordine posticipato
void next()
porta l'iteratore alla prossima posizione della visita in ordine anticipato
tab_entry & get_e() const
descrittore corrente
int get_l() const
livello corrente
bool is_leaf() const
fermo su una foglia?
vaddr get_v() const
indirizzo virtuale corrente
static bool valid_interval(vaddr beg, natq dim)
controlla che un intervallo sia valido.
bool right()
prova a spostare l'iteratore di una posizione a destra nell'albero (rimanendo nel livello corrente),...
bool down()
prova a spostare l'iteratore di una posizione in basso nell'albero, se possibile, altrimenti non fa n...
bool up()
prova a spostare l'iteratore di una posizione in alto nell'albero, se possibile, altrimenti non fa ni...
void next_post()
porta l'iteratore alla prossima posizione della visita in ordine posticipato
paddr get_tab() const
tabella corrente
unsigned long vaddr
indirizzo virtuale (64bit)
unsigned long natq
naturale su 8 byte (64bit)
unsigned long paddr
indirizzo fisico (64bit)
unsigned int natl
naturale su 4 byte
void flog(log_sev sev, const char *fmt,...)
Invio di un messaggio formattato sul log.
void fpanic(const char *fmt,...)
Invia un messaggio sul log (severità ERR) ed esegue lo shutdown.
T max(T a, T b)
Restituisce il massimo tra due valori confrontabili.
static To * ptr_cast(From v)
Converte da intero a puntatore non void.
static const int MAX_LIV
numero di livelli del TRIE (4 o 5)
const natq ADDR_MASK
maschera per l'indirizzo
void invalida_TLB()
Invalida tutto il TLB.
natl get_ref(paddr)
invocata per leggere il contatore delle entrate valide di una tabella
natq tab_entry
descrittore di pagina o tabella
static const int MAX_PS_LVL
massimo livello supportato per le pagine di grandi dimensioni
static tab_entry & get_entry(paddr tab, natl i)
Accesso ad un'entrata di una tabella.
void loadCR3(paddr dir)
Carica un nuovo valore in cr3.
static const natq VADDR_MASK
maschera per selezionare i bit significativi di un indirizzo virtuale
const natq BIT_D
bit "dirty"
const natq BIT_PWT
bit Page Wright Through
static constexpr vaddr norm(vaddr a)
Normalizza un indirizzo.
static constexpr natq dim_region(int liv)
Calcola la dimensione di una regione del TRIE dato il livello.
paddr alloca_tab()
invocata quando serve una nuova tabella
void rilascia_tab(paddr)
invocata quando una tabella non serve più
void set_des(paddr dst, natl i, natl n, tab_entry e)
Inizializza (parte dei) descrittori di una tabella.
paddr trasforma(paddr root_tab, vaddr v)
Traduzione di un indirizzo virtuale in fisico.
static constexpr int i_tab(vaddr v, int liv)
Indice nelle tabelle.
const natq BIT_US
bit utente/sistema
static void set_IND_FISICO(tab_entry &e, paddr f)
Imposta l'indirizzo fisico in un descrittore di pagina o tabella.
void set_entry(paddr tab, natl j, tab_entry se)
Scrive una entrata di una tabella.
void dec_ref(paddr)
invocata quando una tabella perde una entrata precedentemente valida
const natq BIT_PCD
bit Page Cache Disable
void inc_ref(paddr)
invocata quando una tabella acquisisce una nuova entrata valida
const natq BIT_PS
bit "page size"
static constexpr paddr extr_IND_FISICO(tab_entry e)
Estrae l'indirizzo fisico da un descrittore di pagina o tabella.
static constexpr vaddr limit(vaddr v, int liv)
Calcola la base della prima regione di un dato livello che giace a destra di un dato indirizzo virtua...
const natq BIT_RW
bit di lettura/scrittura
vaddr map(paddr tab, vaddr begin, vaddr end, natl flags, T &getpaddr, int ps_lvl=1)
Crea tutto il sottoalbero necessario a tradurre tutti gli indirizzi di un intervallo.
static constexpr vaddr base(vaddr v, int liv)
Calcola la base della regione di un dato livello a cui appartiene un dato indirizzo virtuale.
void invalida_entrata_TLB(vaddr v)
Invalida una entrata del TLB.
vaddr readCR2()
Lettura di cr2.
const natq BIT_P
bit di presenza
static const natq VADDR_MSBIT
ultimo bit significativo di un indirizzo virtuale
const natq ACCB_MASK
maschera per il byte di accesso
void copy_des(paddr src, paddr dst, natl i, natl n)
Copia descrittori da una tabella ad un'altra.
const natq BIT_A
bit di accesso
paddr readCR3()
Lettura di cr3.
void unmap(paddr tab, vaddr begin, vaddr end, T &putpaddr)
Elimina tutte le traduzioni di un intervallo.