[OSy] Stack frame v mips o32 abi

Adam Hraska smudloadam at gmail.com
Wed Nov 10 23:29:39 CET 2010


Dobry den,

v Mips 32-bit ABI (o32) som sa dozvedel ([1] figure 3-21
na 28 strane pdf), ze volajuci musi na stacku vyhradit
miesto pre prve 4 argumenty funkcie, i ked su predavane
v registroch. Volajuci ma povinnost vyhradit taketo
4 * 4B = 16B miesto dokonca i v pripade, ze volana funkcia
ma menej ako 4 parametre (pozri 3-15 v [1]).

GCC s prepinacom "-mabi=32" [2] pritom skutocne generuje
kod, ktory miesto vyuziva. Napr. funkcia _assert() v nasom
kerneli ma takyto prolog:

80002400 <_assert>:
80002400:	27bdffa8 	addiu	sp,sp,-88
80002404:	afbf0054 	sw	ra,84(sp)
80002408:	afb10050 	sw	s1,80(sp)
8000240c:	afb0004c 	sw	s0,76(sp)
80002410:	afa5005c 	sw	a1,92(sp) // <--
80002414:	afa60060 	sw	a2,96(sp) // <--
...

Tutu zaujimavost treba mat na pamati pri inicializacii
stacku pre vstupnu funkciu threadu a pri pisani kuskov
kodu v assembleri, ktore nasledne volaju C-ckove funkcie.

Kalisto 0.8.8 na konvenciu zabuda v init_thread() a
pri funkciach volanych z head.S.


S pozdravom

Adam Hraska

Zdroje:
[1] http://math-atlas.sourceforge.net/devel/assembly/mipsabi32.pdf
[2] http://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html




More information about the NSWI004 mailing list