multiboot.h (5830B)
1 #ifndef DEMARRAGE_MULTIBOOT_MULTIBOOT_H 2 #define DEMARRAGE_MULTIBOOT_MULTIBOOT_H 3 4 #include <types.h> 5 6 /** 7 * @brief Informations récupérées par grub 8 * 9 * D'abord les sous-structures, puis la structure principale. 10 */ 11 12 /* FIXME : De quoi s'agit-il réellement ? */ 13 typedef uint32 pointeurLointain; 14 15 /** 16 * @brief Disponibilité des informations. 17 */ 18 typedef struct MultibootInfoFlags { 19 bool mem:1; 20 bool bootDevice:1; 21 bool cmdline:1; 22 bool mods:1; 23 bool aout:1; 24 bool elf:1; 25 bool mmap:1; 26 bool drives:1; 27 bool configTable:1; 28 bool bootLoaderName:1; 29 bool apmTable:1; 30 bool vbe:1; 31 uint32 PADDING:20; 32 } PACKED MultibootInfoFlags; 33 34 /** 35 * @brief Média de stockage utilisé lors du démarrage. 36 */ 37 typedef struct MultibootInfoBootDevice { 38 uint8 part1; 39 uint8 part2; 40 uint8 part3; 41 uint8 drive; 42 } PACKED MultibootInfoBootDevice; 43 44 /** 45 * @brief Modules chargés par le chargeur de démarrage. 46 */ 47 typedef struct MultibootInfoModule { 48 void* modStart; 49 void* modEnd; 50 51 StringZ string; 52 53 uint32 reserved; 54 } PACKED MultibootInfoModule; 55 56 /** 57 * @brief Table des symboles a.out . 58 */ 59 typedef struct MultibootInfoAout { 60 uint32 aoutTabSize; 61 uint32 aoutStrSize; 62 63 /* le type de aoutAddr devrait être nlist (cf. standard 64 * multiboot), mais de quoi s'agit-t-il ? */ 65 void* aoutAddr; 66 67 uint32 reserved; 68 } PACKED MultibootInfoAout; 69 70 /** 71 * @brief Table des en-têtes de section pour ELF. 72 */ 73 typedef struct MultibootInfoElf { 74 uint32 num; 75 uint32 size; 76 77 void* addr; 78 79 StringZ* shndx; /* Tableau de StringZ ou de String ? */ 80 } PACKED MultibootInfoElf; 81 82 /** 83 * @brief Cartographie de la mémoire. 84 * 85 * Si type != MultibootInfoMmapRam alors cette mémoire est réservée 86 * (mémoire vidéo, etc.) 87 */ 88 #define MultibootInfoMmapRam = 1; 89 typedef struct MultibootInfoMmap { 90 /* Attention, mmapAddr tel que fourni par grub pointe sur le 2e 91 * champ (baseAddr), il faut donc enlever 4 octets à 92 * l'adresse. */ 93 uint32 size; 94 95 /* Avec 32_low suivi de 32_high, je peux en faire 64. Ne me 96 * seais-je pas trompé dans l'endianisme ? */ 97 uint64 baseAddr; 98 uint64 length; 99 uint32 type; 100 } PACKED MultibootInfoMmap; 101 102 /** 103 * @brief Média de stockage. 104 */ 105 typedef enum { CHS = 0, LBA = 1 } MultibootInfoDriveMode; 106 typedef struct MultibootInfoDrive { 107 uint32 size; 108 109 uint8 driveNumber; 110 111 /* Cela permet-il de contraindre la taille d'un enum ? */ 112 MultibootInfoDriveMode driveMode:8; 113 114 115 uint16 driveCylinders; 116 uint8 driveHeads; 117 uint8 driveSectors; 118 119 /* Et comment je gère cette horreur moi ? */ 120 uint16 drivePorts; 121 } PACKED MultibootInfoDrive; 122 123 /** 124 * @brief Fonction GET CONFIGURATION du BIOS. 125 */ 126 typedef struct MultibootInfoConfigTable { 127 /* Chercher le format de retour de l'appel au BIOS nommé 128 * GET CONFIGURATION */ 129 } PACKED MultibootInfoConfigTable; 130 131 /** 132 * @brief Advanced Power Management. 133 */ 134 typedef struct MultibootInfoApmTable { 135 /* Voir le standard apm pour les types... 136 * http://www.micr.../hwdev/busbios/amp_12.htm 137 * Soit dit en passant, sympa la référence à micr... dans un 138 * standard libre (très mal écrit le standard au fait...) */ 139 uint16 version; 140 uint16 cseg; 141 uint32 offset; 142 uint16 cseg16; 143 uint16 dseg; 144 uint16 flags; 145 uint16 csegLen; 146 uint16 cseg16Len; 147 uint16 dsegLen; 148 } PACKED MultibootInfoApmTable; 149 150 /** 151 * @brief Contrôleur VESA Bios Extension 152 */ 153 typedef struct MultibootInfoVbeControllerInfo{ 154 char signature[4]; /* == "VESA" */ 155 union { 156 uint16 version; 157 struct { 158 uint8 versionMajeure; /* 2 pour VBE 2.* */ 159 uint8 versionMineure; /* 0 pour VBE *.0 */ 160 }; 161 }; 162 /* pointeurLointain ??? */ 163 uint16 oemString[2]; /* Nom du périphérique, donné par le constructeur */ 164 uint32 capabilities; /* Fonctionnalités offertes */ 165 /* pointeurLointain ??? */ 166 uint16 videomodes[2]; /* Liste de modes vidéo */ 167 uint16 totalMemory; /* nombre de blocs de 64ko */ 168 } PACKED MultibootInfoVbeControllerInfo; 169 170 /** 171 * @brief Mode vidéo VESA Bios Extension 172 */ 173 typedef struct MultibootInfoVbeModeInfo { 174 uint16 attributes; 175 uint8 winA,winB; 176 uint16 granularity; 177 uint16 winsize; 178 uint16 segmentA, segmentB; 179 pointeurLointain winFunc; 180 uint16 pitch; /* octets par scanline */ 181 182 uint16 Xres, Yres; 183 uint8 Wchar, Ychar, planes, bpp, banks; 184 uint8 memory_model, bank_size, image_pages; 185 uint8 reserved; 186 187 struct { 188 uint8 maskSize; 189 uint8 fieldPos; 190 } red, green, blue, reservedChannel; 191 uint8 directcolor_attributes; 192 193 void* linearAddress; /* L'adresse du framebuffer linéaire :) */ 194 void* offscreenAddress; 195 uint16 offscreenSizeKB; 196 } PACKED MultibootInfoVbeModeInfo; 197 198 /** 199 * @brief Informations récupérées par grub 200 */ 201 typedef struct MultibootInfo { 202 MultibootInfoFlags flags; 203 204 uint32 memLower; 205 uint32 memUpper; 206 207 MultibootInfoBootDevice bootDevice; 208 209 StringZ cmdline; 210 211 uint32 modsCount; 212 MultibootInfoModule* modsAddr; 213 214 union { 215 MultibootInfoAout aout; 216 MultibootInfoElf elf; 217 } PACKED syms; 218 219 uint32 mmapLength; 220 MultibootInfoMmap* mmapAddr; 221 222 uint32 drivesLength; 223 MultibootInfoDrive* drivesAddr; 224 225 MultibootInfoConfigTable* configTable; 226 227 StringZ bootLoaderName; 228 229 MultibootInfoApmTable* apmTable; 230 231 MultibootInfoVbeControllerInfo* vbeControlInfo; 232 MultibootInfoVbeModeInfo* vbeModeInfo; 233 uint16 vbeMode; 234 uint16 vbeInterfaceSeg; 235 uint16 vbeInterfaceOff; 236 uint16 vbeInterfaceLen; 237 } PACKED MultibootInfo; 238 239 typedef struct EtatMultiboot { 240 MultibootInfo* InfoMultiboot; 241 uint32 magicMultiboot; 242 } EtatMultiboot; 243 244 #endif