32void*
operator new(
size_t s)
52void*
operator new(
size_t s, std::align_val_t a)
68void operator delete(
void* p)
81void operator delete(
void *p, std::align_val_t a)
129 if (!
access(buff, quanti,
false,
false)) {
130 flog(
LOG_WARN,
"writeconsole: parametri non validi: %p, %lu:", buff, quanti);
136 for (
natq i = 0; i < quanti; i++)
139 if (quanti > 0 && buff[quanti - 1] ==
'\n')
142 flog(
LOG_USR,
"%.*s",
static_cast<int>(quanti), buff);
174 if (!
access(buff, quanti,
true)) {
175 flog(
LOG_WARN,
"readconsole: parametri non validi: %p, %lu:", buff, quanti);
269 flog(
LOG_ERR,
"kbd: impossibile creare estern_kbd");
294 flog(
LOG_ERR,
"console: impossibile creare mutex");
298 flog(
LOG_ERR,
"console: impossibile creare sincr");
360 d->
prd[i - 1] |= 0x80000000;
391 flog(
LOG_WARN,
"readhd_n: parametri non validi: %p, %d", vetti, quanti);
433 flog(
LOG_WARN,
"writehd_n: parametri non validi: %p, %d", vetto, quanti);
456 flog(
LOG_ERR,
"dmastarthd_in: numero di PRD insufficiente");
482 flog(
LOG_WARN,
"readhd_n: quanti %d troppo grande", quanti);
487 flog(
LOG_WARN,
"dmareadhd_n: parametri non validi: %p, %d", vetti, quanti);
510 flog(
LOG_ERR,
"dmastarthd_out: numero di PRD insufficiente");
536 flog(
LOG_WARN,
"readhd_n: quanti %d troppo grande", quanti);
541 flog(
LOG_WARN,
"dmawritehd_n: parametri non validi: %p, %d", vetto, quanti);
590 natb bus = 0, dev = 0, fun = 0;
609 if ( (d->
prd = new (std::align_val_t{65536})
natl[2 *
MAX_PRD]) ==
nullptr) {
610 flog(
LOG_WARN,
"hd: impossibile allocare vettore di PRD");
618 if (
id == 0xFFFFFFFF) {
619 flog(
LOG_ERR,
"hd: impossibile creare proc. esterno");
658 flog(
LOG_ERR,
"impossible creare semaforo ioheap_mutex");
670 flog(
LOG_INFO,
"Inizializzo la gestione dell'hard disk");
672 flog(
LOG_ERR,
"inizializzazione hard disk fallita");
File incluso da tutti i moduli, sia nella parte C++ che nella parte assembler.
#define INTR_TIPO_KBD
tastiera
#define DIM_IO_HEAP
dimensione dello heap del modulo I/O
#define MIN_EXT_PRIO
priorità minima dei processi esterni
#define INTR_TIPO_HD
hard disk
#define MAX_PRD
numero massimo di PRD usati da dmaread/dmawrite
void dmastarthd_in(des_ata *d, natb vetti[], natl primo, natb quanti)
Avvia una operazione di ingresso in DMA dall'hard disk.
void starthd_out(des_ata *d, natb vetto[], natl primo, natb quanti)
Avvia una operazione di uscita verso l'hard disk.
void estern_hd(natq)
Processo esterno per le richieste di interruzione dell'hard disk.
const natb HD_IRQ
Piedino dell'APIC per le richieste di interruzione dell'hard disk.
bool prepare_prd(des_ata *d, natb *vett, natb quanti)
Prepara i descrittori per il Bus Mastering.
bool hd_init()
Inizializza il sottosistema per la gestione dell'hard disk.
void starthd_in(des_ata *d, natb vetti[], natl primo, natb quanti)
Avvia una operazione di ingresso dall'hard disk.
void dmastarthd_out(des_ata *d, natb vetto[], natl primo, natb quanti)
Avvia una operazione di uscita in DMA verso l'hard disk.
des_ata hard_disk
Descrittore dell'unico hard disk installato nel sistema.
void c_dmareadhd_n(natb vetti[], natl primo, natb quanti)
Parte C++ della primitiva dmareadhd_n().
void c_readhd_n(natb vetti[], natl primo, natb quanti)
Parte C++ della primitiva readhd_n().
void c_dmawritehd_n(natb vetto[], natl primo, natb quanti)
Parte C++ della primitiva dmawritehd_n().
void c_writehd_n(natb vetto[], natl primo, natb quanti)
Parte C++ della primitiva writehd_n().
des_console console
Unica istanza di des_console.
bool kbd_init()
Inizializza la tastiera.
bool vid_init()
Inizializza il video (modalità testo)
void estern_kbd(natq)
Processo esterno associato alla tastiera.
void startkbd_in(des_console *d, char *buff, natq dim)
Avvia una operazione di lettura dalla tastiera.
const int KBD_IRQ
Piedino dell'APIC per le richieste di interruzione della tastiera.
bool console_init()
Inizializza la console (tastiera + video)
natq c_readconsole(char *buff, natq quanti)
Parte C++ della primitiva readconsole()
void c_iniconsole(natb cc)
Parte C++ della primitiva iniconsole()
void c_writeconsole(const char *buff, natq quanti)
Parte C+++ della primitiva writeconsole()
void * alloc_aligned(size_t dim, std::align_val_t align)
void heap_init(void *start, size_t size)
natq c_getiomeminfo()
Parte C++ della primitiva getiomeminfo()
natl ioheap_mutex
Indice del semaforo di mutua esclusione per lo heap I/O.
void main_io(natq p)
Corpo del processo main I/O.
char _end[]
Ultimo indirizzo utilizzato dal modulo I/O (fornito dal collegatore)
bool fill_io_gates()
Riempie i gate della IDT relativi alle primitive fornite dal modulo I/O.
void flog(log_sev sev, const char *fmt,...)
static T * allinea_ptr(T *p, natq a)
static To * ptr_cast(From v)
paddr trasforma(paddr root_tab, vaddr v)
Primitive fornite dal modulo I/O.
bool find(natb &bus, natb &dev, natb &fun)
void init(natb bus, natb dev, natb fun)
void prepare(paddr prd, bool write)
void output_sect(natb *buf)
void input_sect(natb *buf)
void start_cmd(natl lba, natb quanti, cmd cmd)
void str_write(const char str[])
Descrittore di interfaccia ATA.
natb * punt
Da dove leggere/dove scrivere il prossimo settore.
natl * prd
Array dei descrittori per il Bus Mastering.
natl sincr
Indice di un semaforo di sincronizzazione.
natb comando
Ultimo comando inviato all'interfaccia.
natb cont
Quanti settori resta da leggere o scrivere.
natl mutex
Indice di un semaforo di mutua esclusione.
Descrittore della console.
natq dim
Dimensione del buffer passato a readconsole()
natl mutex
Semaforo di mutua esclusione per l'accesso alla console.
natl sincr
Semafor di sincronizzazione (per le letture da tastiera)
natq cont
Quanti caratteri resta da leggere.
char * punt
Dove scrivere il prossimo carattere letto.
Primitive comuni definite dal modulo sistema.
natl sem_ini(int val)
Crea un nuovo semaforo.
void sem_wait(natl sem)
Estrae un gettone da un semaforo.
void abort_p()
Abortisce il processo corrente.
void sem_signal(natl sem)
Inserisce un gettone in un semaforo.
void terminate_p()
Termina il processo corrente.
Primitive realizzate dal modulo sistema e riservate al modulo I/O.
void phys_dealloc(void *ptr)
Dealloca memoria allocata tramite phys_alloc().
natl activate_pe(void f(natq), natq a, natl prio, natl liv, natb irq)
Crea un processo esterno.
bool access(const void *start, natq dim, bool writeable, bool shared=true)
Verifica dei problemi di Cavallo di Troia.
void * phys_alloc(size_t size, std::align_val_t align)
Alloca memoria che sia allineata in memoria fisica.
void wfi()
Attende la prossima richiesta di interruzione.