2 * Extended boot option ROM support.
4 * Copyright IBM, Corp. 2007
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
19 /* Extended Boot ROM suport */
40 static void get_translated_chs(BlockDriverState
*bs
, int *c
, int *h
, int *s
)
42 bdrv_get_geometry_hint(bs
, c
, h
, s
);
47 } else if (*c
<= 2048) {
50 } else if (*c
<= 4096) {
53 } else if (*c
<= 8192) {
61 /* what is the correct algorithm for this?? */
68 static void extboot_write_cmd(void *opaque
, uint32_t addr
, uint32_t value
)
70 union extboot_cmd cmd
;
71 BlockDriverState
*bs
= opaque
;
72 int cylinders
, heads
, sectors
, err
;
74 target_phys_addr_t pa
= 0;
78 cpu_physical_memory_read((value
& 0xFFFF) << 4, (uint8_t *)&cmd
,
81 if (cmd
.type
== 0x01 || cmd
.type
== 0x02) {
82 pa
= cmd
.xfer
.segment
* 16 + cmd
.xfer
.offset
;
83 blen
= cmd
.xfer
.nb_sectors
* 512;
84 buf
= qemu_memalign(512, blen
);
89 get_translated_chs(bs
, &cylinders
, &heads
, §ors
);
90 bdrv_get_geometry(bs
, &nb_sectors
);
91 cmd
.query_geometry
.cylinders
= cylinders
;
92 cmd
.query_geometry
.heads
= heads
;
93 cmd
.query_geometry
.sectors
= sectors
;
94 cmd
.query_geometry
.nb_sectors
= nb_sectors
;
97 err
= bdrv_read(bs
, cmd
.xfer
.sector
, buf
, cmd
.xfer
.nb_sectors
);
99 printf("Read failed\n");
101 cpu_physical_memory_write(pa
, buf
, blen
);
105 cpu_physical_memory_read(pa
, buf
, blen
);
107 err
= bdrv_write(bs
, cmd
.xfer
.sector
, buf
, cmd
.xfer
.nb_sectors
);
109 printf("Write failed\n");
114 cpu_physical_memory_write((value
& 0xFFFF) << 4, (uint8_t *)&cmd
,
120 void extboot_init(BlockDriverState
*bs
)
122 register_ioport_write(0x405, 1, 2, extboot_write_cmd
, bs
);