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 uint32_t extboot_read(void *opaque
, uint32_t addr
)
74 static void extboot_write_cmd(void *opaque
, uint32_t addr
, uint32_t value
)
76 union extboot_cmd
*cmd
= (void *)(phys_ram_base
+ ((value
& 0xFFFF) << 4));
77 BlockDriverState
*bs
= opaque
;
78 int cylinders
, heads
, sectors
, err
;
81 get_translated_chs(bs
, &cylinders
, &heads
, §ors
);
83 if (cmd
->type
== 0x01 || cmd
->type
== 0x02) {
84 target_ulong pa
= cmd
->xfer
.segment
* 16 + cmd
->xfer
.segment
;
86 /* possible buffer overflow */
87 if ((pa
+ cmd
->xfer
.nb_sectors
* 512) > phys_ram_size
)
93 bdrv_get_geometry(bs
, &nb_sectors
);
94 cmd
->query_geometry
.cylinders
= cylinders
;
95 cmd
->query_geometry
.heads
= heads
;
96 cmd
->query_geometry
.sectors
= sectors
;
97 cmd
->query_geometry
.nb_sectors
= nb_sectors
;
98 cpu_physical_memory_set_dirty((value
& 0xFFFF) << 4);
101 err
= bdrv_read(bs
, cmd
->xfer
.sector
, phys_ram_base
+
102 cmd
->xfer
.segment
* 16 + cmd
->xfer
.offset
,
103 cmd
->xfer
.nb_sectors
);
105 printf("Read failed\n");
108 err
= bdrv_write(bs
, cmd
->xfer
.sector
, phys_ram_base
+
109 cmd
->xfer
.segment
* 16 + cmd
->xfer
.offset
,
110 cmd
->xfer
.nb_sectors
);
112 printf("Write failed\n");
114 cpu_physical_memory_set_dirty(cmd
->xfer
.segment
* 16 + cmd
->xfer
.offset
);
119 void extboot_init(BlockDriverState
*bs
, int cmd
)
123 pcmd
= qemu_mallocz(sizeof(int));
125 fprintf(stderr
, "Error allocating memory\n");
130 register_ioport_read(0x404, 1, 1, extboot_read
, pcmd
);
131 register_ioport_write(0x405, 1, 2, extboot_write_cmd
, bs
);