Uživatel:FroxDev/Btcode
Z 8.B8 wiki
(Rozdíly mezi verzemi)
(Založena nová stránka: == head.S == === entry point === * vloží do registru sp adresu na strukturu init_task_union, resp. na její poslední volné místo * vynuluje prostor pro statické prom…) |
m (Stránka FroxDev/Btcode přemístěna na stránku Uživatel:FroxDev/Btcode: jsem blb) |
Verze z 23. 5. 2010, 18:37
Obsah |
head.S
entry point
- vloží do registru sp adresu na strukturu init_task_union, resp. na její poslední volné místo
- vynuluje prostor pro statické proměnné bootloaderu, následovaný za code segmentem
- zavolá init_arch()
exception_matrix
- přečte registr CP0_CAUSE a podle kódu výjimky zavolá příslušný handler v poli exception_handlers
setup.c
init_arch
- v registru CP0_STATUS vypne mód 64bit a ostatní koprocesory, zapne pouze CP0
- zavolá start_kernel()
setup_arch
- nastaví ST0_BEV v CP0_STATUS na 0 - bootstrap mode a zapne přerušení 0, 2, 3, 4, 5 ??ST0_BEV význam?
traps.c
flush_icache
- za zastavených přerušení nastaví druhý bit CP0_XCONTEXT na 0 a pak na 1 ?? efekt?
flush_dcache
- za zastavených přerušení nastaví první bit CP0_XCONTEXT na 0 a pak na 1 ?? efekt?
main.c
start_kernel
- flush_icache() a flush_dcache()
- setup_arch()
- exception_init()
- init_IRQ()
- rtl_outl - GPIO F data - 0
- check_cpu_speed() - uloží do lokální proměnné
- set_bridge_clock() na zjištěnou rychlost
- rtl_outl - GPIO F data - 1
- cli - vypne všechna přerušení
- uart1_init() na zjištenou rychlost
uart1_init
- rtl_outb - UART_LCR - 8bit words, no parity, one stop bit
- rtl_outb - UART_DLM, UART_DLL - nastasvení baudrate v závislosti na rychlosti cpu
- rtl_outb - UART_LCR, UART_FCR - vypnutí FIFO a reset, znovu nastavení 8bit words
- prázdná smyčka, 4096 opakování
- rtl_outb - UART_FCR, UART_MCR - vynulování, disable flow control
- prom_printf() - oznámení načtení uart
set_bridge_clock
- nastaví v registru BDGCR hodnoty dělení rychlosti jednotlivých sběrnic, v závislosti na rychlosti cpu a hodnoty 0xBD01010C ??význam?
misc.c
prom_printf
- vsprintf() - pouze předání argumentů, buffer je null
vsprintf
- projde celý řetězec fmt pro každý znak, dokud není null
- když přečtený znak není %, tak
- když buffer není null, tak se do něj tento znak vloží
- jinak se na daný znak volá putchar - serial_outc()
- jinak se pomocí zjednodušených algoritmů přečtou znaky a vyhodnotí, využívá funkci SprintF()
- vrací počet vepsaných znaků
SprintF
- vsprintf() - stejné argumenty
irq.c
exception_init
- clear_cp0_status - bit ST0_BEV
- set_except_vector() - vepíše do všech vyjímkových handlerů (32) funkci do_reserved()
- memcpy() - zkopíruje kód exception_matrix na adresu 0x80000080 - místo příjmu výjimky
- flush_icache()
- sti - zapíná přerušení
set_except_vector
- vloží adresu na danou metodu na určený index pole exception_handlers - ovladače pro chytání jednotlivých výjimek
clear_cp0_status
- na označené bity v masce uloží hodnotu 0
do_reserved
- prom_printf() - vypíše chybu a uvízne v nekonečném cyklu
init_IRQ
- ExceptionToIrq_setup()
request_IRQ
- ověří jestli číslo přerušení je menší než jejich počet - 64, jinak vrací -1
- vloží předané dev_id do předané struktury
- setup_IRQ() na dané hodnoty
- unmask_IRQ() na dané číslo přerušení
- vrací hodnotu GIMR0
setup_IRQ
- save_and_cli
- do pole irq_action nastaví na příslušný index přerušení zadanou strukturu
- restore_flags
free_IRQ
- mask_IRQ()
mask_IRQ
- vypne bit přerušení v GIMR0
unmask_IRQ
- zapne přerušení daného čísla v GIMR0 - speciální registr pro konfiguraci přerušení
ExceptionToIrq_setup
- change_cp0_status() - CP0_IM - vypíná přerušení
- set_except_vector() - jako handler pro výjimky typu přerušení nastavuje IRQ_finder
- change_cp0_status() - zapíná přerušení
change_cp0_status
- podle masky aktualizuje hodnotu v registru CP0_STATUS
monitor.c
check_cpu_speed
- request_IRQ() - žádá o timer interrupt na strukturu irq_timer, kde je handler timer_interrupt()
- timer_init()
- algoritmicky spočítá, kolik instrukcí je provedeno v jednom 10ms bloku
- vypne přerušení timeru (registry TCCNR, TCIR)
- free_IRQ() - uvolní timer interrupt
- vrací rychlost procesoru v MHz
timer_interrupt
- inkrementuje jiffies
timer_init
- zapne nultý časovač jako timer, nastaví data na 35B60, čili 10ms a zapne přerušení (registry TCCNR, TC0DATA, TCIR)