Annotation of qemu/hw/firmware_abi.h, revision 1.1

1.1     ! root        1: #ifndef FIRMWARE_ABI_H
        !             2: #define FIRMWARE_ABI_H
        !             3: 
        !             4: #ifndef __ASSEMBLY__
        !             5: /* Open Hack'Ware NVRAM configuration structure */
        !             6: 
        !             7: /* Version 3 */
        !             8: typedef struct ohwcfg_v3_t ohwcfg_v3_t;
        !             9: struct ohwcfg_v3_t {
        !            10:     /* 0x00: structure identifier                    */
        !            11:     uint8_t  struct_ident[0x10];
        !            12:     /* 0x10: structure version and NVRAM description */
        !            13:     uint32_t struct_version;
        !            14:     uint16_t nvram_size;
        !            15:     uint16_t pad0;
        !            16:     uint16_t nvram_arch_ptr;
        !            17:     uint16_t nvram_arch_size;
        !            18:     uint16_t nvram_arch_crc;
        !            19:     uint8_t  pad1[0x02];
        !            20:     /* 0x20: host architecture                       */
        !            21:     uint8_t  arch[0x10];
        !            22:     /* 0x30: RAM/ROM description                     */
        !            23:     uint64_t RAM0_base;
        !            24:     uint64_t RAM0_size;
        !            25:     uint64_t RAM1_base;
        !            26:     uint64_t RAM1_size;
        !            27:     uint64_t RAM2_base;
        !            28:     uint64_t RAM2_size;
        !            29:     uint64_t RAM3_base;
        !            30:     uint64_t RAM3_size;
        !            31:     uint64_t ROM_base;
        !            32:     uint64_t ROM_size;
        !            33:     /* 0x80: Kernel description                      */
        !            34:     uint64_t kernel_image;
        !            35:     uint64_t kernel_size;
        !            36:     /* 0x90: Kernel command line                     */
        !            37:     uint64_t cmdline;
        !            38:     uint64_t cmdline_size;
        !            39:     /* 0xA0: Kernel boot image                       */
        !            40:     uint64_t initrd_image;
        !            41:     uint64_t initrd_size;
        !            42:     /* 0xB0: NVRAM image                             */
        !            43:     uint64_t NVRAM_image;
        !            44:     uint8_t  pad2[8];
        !            45:     /* 0xC0: graphic configuration                   */
        !            46:     uint16_t width;
        !            47:     uint16_t height;
        !            48:     uint16_t depth;
        !            49:     uint16_t graphic_flags;
        !            50:     /* 0xC8: CPUs description                        */
        !            51:     uint8_t  nb_cpus;
        !            52:     uint8_t  boot_cpu;
        !            53:     uint8_t  nboot_devices;
        !            54:     uint8_t  pad3[5];
        !            55:     /* 0xD0: boot devices                            */
        !            56:     uint8_t  boot_devices[0x10];
        !            57:     /* 0xE0                                          */
        !            58:     uint8_t  pad4[0x1C]; /* 28 */
        !            59:     /* 0xFC: checksum                                */
        !            60:     uint16_t crc;
        !            61:     uint8_t  pad5[0x02];
        !            62: } __attribute__ (( packed ));
        !            63: 
        !            64: #define OHW_GF_NOGRAPHICS 0x0001
        !            65: 
        !            66: static inline uint16_t
        !            67: OHW_crc_update (uint16_t prev, uint16_t value)
        !            68: {
        !            69:     uint16_t tmp;
        !            70:     uint16_t pd, pd1, pd2;
        !            71: 
        !            72:     tmp = prev >> 8;
        !            73:     pd = prev ^ value;
        !            74:     pd1 = pd & 0x000F;
        !            75:     pd2 = ((pd >> 4) & 0x000F) ^ pd1;
        !            76:     tmp ^= (pd1 << 3) | (pd1 << 8);
        !            77:     tmp ^= pd2 | (pd2 << 7) | (pd2 << 12);
        !            78: 
        !            79:     return tmp;
        !            80: }
        !            81: 
        !            82: static inline uint16_t
        !            83: OHW_compute_crc (ohwcfg_v3_t *header, uint32_t start, uint32_t count)
        !            84: {
        !            85:     uint32_t i;
        !            86:     uint16_t crc = 0xFFFF;
        !            87:     uint8_t *ptr = (uint8_t *)header;
        !            88:     int odd;
        !            89: 
        !            90:     odd = count & 1;
        !            91:     count &= ~1;
        !            92:     for (i = 0; i != count; i++) {
        !            93:         crc = OHW_crc_update(crc, (ptr[start + i] << 8) | ptr[start + i + 1]);
        !            94:     }
        !            95:     if (odd) {
        !            96:         crc = OHW_crc_update(crc, ptr[start + i] << 8);
        !            97:     }
        !            98: 
        !            99:     return crc;
        !           100: }
        !           101: 
        !           102: /* Sparc32 runtime NVRAM structure for SMP CPU boot */
        !           103: struct sparc_arch_cfg {
        !           104:     uint32_t smp_ctx;
        !           105:     uint32_t smp_ctxtbl;
        !           106:     uint32_t smp_entry;
        !           107:     uint8_t valid;
        !           108:     uint8_t unused[51];
        !           109: };
        !           110: 
        !           111: /* OpenBIOS NVRAM partition */
        !           112: struct OpenBIOS_nvpart_v1 {
        !           113:     uint8_t signature;
        !           114:     uint8_t checksum;
        !           115:     uint16_t len; // BE, length divided by 16
        !           116:     char name[12];
        !           117: };
        !           118: 
        !           119: #define OPENBIOS_PART_SYSTEM 0x70
        !           120: #define OPENBIOS_PART_FREE 0x7f
        !           121: 
        !           122: static inline void
        !           123: OpenBIOS_finish_partition(struct OpenBIOS_nvpart_v1 *header, uint32_t size)
        !           124: {
        !           125:     unsigned int i, sum;
        !           126:     uint8_t *tmpptr;
        !           127: 
        !           128:     // Length divided by 16
        !           129:     header->len = cpu_to_be16(size >> 4);
        !           130: 
        !           131:     // Checksum
        !           132:     tmpptr = (uint8_t *)header;
        !           133:     sum = *tmpptr;
        !           134:     for (i = 0; i < 14; i++) {
        !           135:         sum += tmpptr[2 + i];
        !           136:         sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
        !           137:     }
        !           138:     header->checksum = sum & 0xff;
        !           139: }
        !           140: 
        !           141: static inline uint32_t
        !           142: OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const unsigned char *str)
        !           143: {
        !           144:     uint32_t len;
        !           145: 
        !           146:     len = strlen(str) + 1;
        !           147:     memcpy(&nvram[addr], str, len);
        !           148: 
        !           149:     return addr + len;
        !           150: }
        !           151: 
        !           152: /* Sun IDPROM structure at the end of NVRAM */
        !           153: struct Sun_nvram {
        !           154:     uint8_t type;
        !           155:     uint8_t machine_id;
        !           156:     uint8_t macaddr[6];
        !           157:     uint8_t unused[7];
        !           158:     uint8_t checksum;
        !           159: };
        !           160: 
        !           161: static inline void
        !           162: Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id)
        !           163: {
        !           164:     uint8_t tmp, *tmpptr;
        !           165:     unsigned int i;
        !           166: 
        !           167:     header->type = 1;
        !           168:     header->machine_id = machine_id & 0xff;
        !           169:     memcpy(&header->macaddr, macaddr, 6);
        !           170:     /* Calculate checksum */
        !           171:     tmp = 0;
        !           172:     tmpptr = (uint8_t *)header;
        !           173:     for (i = 0; i < 15; i++)
        !           174:         tmp ^= tmpptr[i];
        !           175: 
        !           176:     header->checksum = tmp;
        !           177: }
        !           178: 
        !           179: #else /* __ASSEMBLY__ */
        !           180: 
        !           181: /* Structure offsets for asm use */
        !           182: 
        !           183: /* Open Hack'Ware NVRAM configuration structure */
        !           184: #define OHW_ARCH_PTR   0x18
        !           185: #define OHW_RAM_SIZE   0x38
        !           186: #define OHW_BOOT_CPU   0xC9
        !           187: 
        !           188: /* Sparc32 runtime NVRAM structure for SMP CPU boot */
        !           189: #define SPARC_SMP_CTX    0x0
        !           190: #define SPARC_SMP_CTXTBL 0x4
        !           191: #define SPARC_SMP_ENTRY  0x8
        !           192: #define SPARC_SMP_VALID  0xc
        !           193: 
        !           194: /* Sun IDPROM structure at the end of NVRAM */
        !           195: #define SPARC_MACHINE_ID 0x1fd9
        !           196: 
        !           197: #endif /* __ASSEMBLY__ */
        !           198: #endif /* FIRMWARE_ABI_H */

unix.superglobalmegacorp.com