Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Nils am 02. January 2008, 11:00

Titel: C -> Pascal
Beitrag von: Nils am 02. January 2008, 11:00
Hi,

ich muss die GDT/IDT von meinem alten C-Kernel auf den neuen Pascal-Kernel übertragen.

Habt ihr eine Idee wie ich das übersetzen könnte ?
Das war mein Zwischenergebnis:
type
  TableRegister = record // IDT/GDT-Register
    Size : Single;
    Long : Double;
  end;
 
  InterruptGate = record // Gate in der IDT
    Offset_Low : Word = 16; // <-- =16 ist sogar nach Syntax verboten, tja
  end;
Hier der Code
typedef struct _TableRegister // IDT/GDT-Register
{

  unsigned short size; // Größe der Tabelle

  unsigned long  base; // Basisadresse der Tabelle

} TableRegister, *pTableRegister;



typedef struct _InterruptGate // Gate in der IDT
{

  unsigned int offset_low : 16; // 1. Word der Funk.-Adresse

  unsigned int selector    : 16; // Selektor aus der GDT

  //unsigned int reserved_1  : 8;  // 0

  unsigned int      : 8;  // 0

  unsigned int type      : 3;  // Zugriffs- und Statusbyte

  unsigned int size      : 1;

  //unsigned int reserved_2  : 1;  // 0

  unsigned int      : 1; // 0

  unsigned int DPL    : 2; // Zugriffslevel

  unsigned int present : 1; // Present im speicher

  unsigned int offset_high : 16; // 2. Word der Funk.-Adresse

} InterruptGate, *pInterruptGate, TrapGate, *pTrapGate;



typedef struct _Gate // Gate in der IDT
{

  unsigned int offset_low : 16; // 1. Word der Funk.-Adresse

  unsigned int selector    : 16; // Selektor aus der GDT

  unsigned int param       : 5;  // Parameter auf dem Stack

  //unsigned int reserved_1  : 3;  // 0

  unsigned int             : 3;  // 0

  unsigned int type        : 4;  // Zugriffs- und Statusbyte

  //unsigned int reserved_2 : 1;  // 0

  unsigned int             : 1; // 0

  unsigned int DPL         : 2;  // Zugriffslevel

  unsigned int present     : 1; // Present im speicher

  unsigned int offset_high : 16; // 2. Word der Funk.-Adresse

} Gate, *pGate, CallGate, *pCallGate;



typedef struct _Descriptor // Descriptor in der GDT
{

  unsigned int size_low  : 16; // 1. Word der Größe

  unsigned int base_low  : 16; // 1. Word der Basisadresse

  unsigned int base_mid : 8;  // 3. Byte der Basisadresse

  unsigned int access    : 1;  // Zugriff & Segmenttyp

  unsigned int type      : 3;  // Zugriff & Segmenttyp

  unsigned int system    : 1;  // Zugriff & Segmenttyp

  unsigned int level     : 2;  // Zugriff & Segmenttyp

  unsigned int present   : 1;  // Zugriff & Segmenttyp

  unsigned int size_high : 4;  // Letztes Nibble der Größe

  unsigned int avl       : 1;  // Zusatz

  unsigned int null      : 1;  // Zusatz

  unsigned int _386      : 1;  // Zusatz

  unsigned int seg_size : 1;  // Zusatz

  unsigned int base_high : 8;  // Letztes Byte der Basisadresse

} Descriptor, *pDescriptor;



pDescriptor    GDT_BASE_POINTER;

pGate          IDT_BASE_POINTER;

pTrapGate      IDT_BASE_POINTER_TRAP_GATE;

pInterruptGate IDT_BASE_POINTER_INTERRUPT_GATE;

pCallGate    IDT_BASE_POINTER_CALL_GATE;



TableRegister gdt, idt;



Titel: Re: C -> Pascal
Beitrag von: kevin am 02. January 2008, 12:07
Pascal kann keine Bitfelder. Du mußt komplette Bytes nehmen und dann mit Bitoperationen darauf arbeiten.
Titel: Re: C -> Pascal
Beitrag von: Nils am 05. January 2008, 10:55
Ich habe was so etwas betrifft mit Pascal noch nicht viel zu tun gehabt. Hast du nur ein ganz kleines Beispiel dafür ? (ob Code oder in Worten ist mir egal, hauptsache ich versteh es)
Titel: Re: C -> Pascal
Beitrag von: FreakyPenguin am 05. January 2008, 12:13
Ich kann zwar nicht wirklich Pascal, aber ich hoffe du siehst trotzdem was gemeint ist. ;-)

InterruptGate = record // Gate in der IDT
Offset_Low : Word;
Selector : Word;
Reserved_0 : Byte;
Attr : Byte;
Offset_High : Word;
end;

Und dann im Code wo du ein Interrupt Gate erstellen willst:
gate.Offset_Low := (handler and 0xFFFF);
gate.Offset_High := (handler shr 16);
gate.Attr := (type or (size shl 1) or (dpl shl 4) or (present shl 6));
Das funktioniert so natürlich nur, wenn or und and auch wirklich bitweise funktionieren in Pascal. ;-)

Titel: Re: C -> Pascal
Beitrag von: kevin am 05. January 2008, 12:22
Das funktioniert so natürlich nur, wenn or und and auch wirklich bitweise funktionieren in Pascal. ;-)
Ja, tun sie, aber dein Code ist anderweitig kaputt, wie dir jeder Compiler feststellen würde. ;)