Commit 1f62d9383f9236cd9cf8f017371800cdfe56a195
1 parent
7727994d
fixed PCI config default write permissions
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@878 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
48 additions
and
14 deletions
hw/pci.c
@@ -255,21 +255,49 @@ void pci_default_write_config(PCIDevice *d, | @@ -255,21 +255,49 @@ void pci_default_write_config(PCIDevice *d, | ||
255 | addr = address; | 255 | addr = address; |
256 | for(i = 0; i < len; i++) { | 256 | for(i = 0; i < len; i++) { |
257 | /* default read/write accesses */ | 257 | /* default read/write accesses */ |
258 | - switch(addr) { | 258 | + switch(d->config[0x0e]) { |
259 | case 0x00: | 259 | case 0x00: |
260 | - case 0x01: | ||
261 | - case 0x02: | ||
262 | - case 0x03: | ||
263 | - case 0x08: | ||
264 | - case 0x09: | ||
265 | - case 0x0a: | ||
266 | - case 0x0b: | ||
267 | - case 0x0e: | ||
268 | - case 0x3d: | ||
269 | - can_write = 0; | 260 | + case 0x80: |
261 | + switch(addr) { | ||
262 | + case 0x00: | ||
263 | + case 0x01: | ||
264 | + case 0x02: | ||
265 | + case 0x03: | ||
266 | + case 0x08: | ||
267 | + case 0x09: | ||
268 | + case 0x0a: | ||
269 | + case 0x0b: | ||
270 | + case 0x0e: | ||
271 | + case 0x10 ... 0x27: /* base */ | ||
272 | + case 0x30 ... 0x33: /* rom */ | ||
273 | + case 0x3d: | ||
274 | + can_write = 0; | ||
275 | + break; | ||
276 | + default: | ||
277 | + can_write = 1; | ||
278 | + break; | ||
279 | + } | ||
270 | break; | 280 | break; |
271 | default: | 281 | default: |
272 | - can_write = 1; | 282 | + case 0x01: |
283 | + switch(addr) { | ||
284 | + case 0x00: | ||
285 | + case 0x01: | ||
286 | + case 0x02: | ||
287 | + case 0x03: | ||
288 | + case 0x08: | ||
289 | + case 0x09: | ||
290 | + case 0x0a: | ||
291 | + case 0x0b: | ||
292 | + case 0x0e: | ||
293 | + case 0x38 ... 0x3b: /* rom */ | ||
294 | + case 0x3d: | ||
295 | + can_write = 0; | ||
296 | + break; | ||
297 | + default: | ||
298 | + can_write = 1; | ||
299 | + break; | ||
300 | + } | ||
273 | break; | 301 | break; |
274 | } | 302 | } |
275 | if (can_write) { | 303 | if (can_write) { |
@@ -986,10 +1014,10 @@ static void pci_bios_init_device(PCIDevice *d) | @@ -986,10 +1014,10 @@ static void pci_bios_init_device(PCIDevice *d) | ||
986 | int i, pin, pic_irq, vendor_id, device_id; | 1014 | int i, pin, pic_irq, vendor_id, device_id; |
987 | 1015 | ||
988 | class = pci_config_readw(d, PCI_CLASS_DEVICE); | 1016 | class = pci_config_readw(d, PCI_CLASS_DEVICE); |
1017 | + vendor_id = pci_config_readw(d, PCI_VENDOR_ID); | ||
1018 | + device_id = pci_config_readw(d, PCI_DEVICE_ID); | ||
989 | switch(class) { | 1019 | switch(class) { |
990 | case 0x0101: | 1020 | case 0x0101: |
991 | - vendor_id = pci_config_readw(d, PCI_VENDOR_ID); | ||
992 | - device_id = pci_config_readw(d, PCI_DEVICE_ID); | ||
993 | if (vendor_id == 0x8086 && device_id == 0x7010) { | 1021 | if (vendor_id == 0x8086 && device_id == 0x7010) { |
994 | /* PIIX3 IDE */ | 1022 | /* PIIX3 IDE */ |
995 | pci_config_writew(d, PCI_COMMAND, PCI_COMMAND_IO); | 1023 | pci_config_writew(d, PCI_COMMAND, PCI_COMMAND_IO); |
@@ -1006,6 +1034,12 @@ static void pci_bios_init_device(PCIDevice *d) | @@ -1006,6 +1034,12 @@ static void pci_bios_init_device(PCIDevice *d) | ||
1006 | /* VGA: map frame buffer to default Bochs VBE address */ | 1034 | /* VGA: map frame buffer to default Bochs VBE address */ |
1007 | pci_set_io_region_addr(d, 0, 0xE0000000); | 1035 | pci_set_io_region_addr(d, 0, 0xE0000000); |
1008 | break; | 1036 | break; |
1037 | + case 0xff00: | ||
1038 | + if (vendor_id == 0x0106b && device_id == 0x0017) { | ||
1039 | + /* macio bridge */ | ||
1040 | + pci_set_io_region_addr(d, 0, 0x80800000); | ||
1041 | + } | ||
1042 | + break; | ||
1009 | default: | 1043 | default: |
1010 | /* default memory mappings */ | 1044 | /* default memory mappings */ |
1011 | for(i = 0; i < PCI_NUM_REGIONS; i++) { | 1045 | for(i = 0; i < PCI_NUM_REGIONS; i++) { |