000
14.11.2015, 13:41 Uhr
Olli
|
Moin,
habe gerade u.A. Probleme den link() Syscall in C zu reimplementieren.
Normalerweise sieht der unter V7 oder SYSIII so aus:
Quellcode: | link() { register struct inode *ip, *xp; register struct a { char *target; char *linkname; } *uap;
[...] u.u_dirp = (caddr_t)uap->linkname; [...] }
|
Problem ist nun, das in WEGA u_dirp im user struct ein saddr_t (long) und kein caddr_t (*char) ist, und ich frage mich wie ich uap->linkname korrekt zugewiesen bekomme.
Quellcode: | typedef union { caddr_t l; struct { unsigned left; unsigned right; } half; } saddr_t; /* segmented address with parts */
|
Der Original-ASM code schaut so aus:
Quellcode: | _link:: { dec fp,#~L2 ldm _stkseg+4(fp),r8,#6 ldl rr8,_u+36 [...] ldl rr2,rr8(#4) ldl rr4,rr2 and r4,#32512 ldl _u+78,rr4 [...]
|
Ich hatte das schonmal vor 7 Jahren, bin damals aber auch zu keiner Lösung gekommen.
http://home.salatschuessel.net/quest/problems.php
Wenn ich inzwischen so drüber nachdenke was da passiert im ASM, will ich das mal hier versuchen zu beschreiben wie ich es verstehe:
1. _u+78 (u.u_dirp) enthällt einen pointer - also wird im Assemblercode hier eine Speicheradresse zugewiesen. 2. Die Adressnotation für Daten in Segmenten auf dem Z8001 sollte 0xSS00XXXX sein, wobei SS die Segmentnummer (0-127) und XXXX die relative Adresse in diesem Segment sind. 3. ANDing den 0xSS00 Teil mit 0x7F00 heisst also, alles was ausserhalb dieses Wertebereiches liegt zu entfernen, um sicherzustellen, das der Teil nur zwischen 0x0000 und 0x7F00 liegen kann.
Und nun frage ich mich.... wie sollte die Zuweisung im C-Code richtigerweise sein?! -- P8000 adventures: http://pofo.de/blog/?/categories/1-P8000 Dieser Beitrag wurde am 14.11.2015 um 13:58 Uhr von Olli editiert. |