summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2010-10-05 11:24:28 -0400
committerJeremy Huddleston <jeremyhu@apple.com>2010-10-13 18:42:45 -0700
commitefeb2ebd7e307224a735469ff89a3a6af4cf143b (patch)
tree0871e38e62df56cfd264e3f9e593fa923c1279d8
parente5b19f14eac609e3c315e14e20ca1935de8de0e3 (diff)
vbe: Fix copying the mode info block
Just use memcpy, seriously. Reviewed-by: RĂ©mi Cardona <remi@gentoo.org> Signed-off-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Keith Packard <keithp@keithp.com> (cherry picked from commit 853d7ebfa3e2d281d92890a39010ff5787a00ffd)
-rw-r--r--hw/xfree86/vbe/vbe.c66
1 files changed, 3 insertions, 63 deletions
diff --git a/hw/xfree86/vbe/vbe.c b/hw/xfree86/vbe/vbe.c
index 0b34648e1..7a64a4a71 100644
--- a/hw/xfree86/vbe/vbe.c
+++ b/hw/xfree86/vbe/vbe.c
@@ -527,69 +527,9 @@ VBEGetModeInfo(vbeInfoPtr pVbe, int mode)
527 if (R16(pVbe->pInt10->ax) != 0x4f) 527 if (R16(pVbe->pInt10->ax) != 0x4f)
528 return NULL; 528 return NULL;
529 529
530 block = calloc(sizeof(VbeModeInfoBlock), 1); 530 block = malloc(sizeof(VbeModeInfoBlock));
531 531 if (block)
532 block->ModeAttributes = *(CARD16*)pVbe->memory; 532 memcpy(block, pVbe->memory, sizeof(*block));
533 block->WinAAttributes = ((char*)pVbe->memory)[2];
534 block->WinBAttributes = ((char*)pVbe->memory)[3];
535 block->WinGranularity = *(CARD16*)(((char*)pVbe->memory) + 4);
536 block->WinSize = *(CARD16*)(((char*)pVbe->memory) + 6);
537 block->WinASegment = *(CARD16*)(((char*)pVbe->memory) + 8);
538 block->WinBSegment = *(CARD16*)(((char*)pVbe->memory) + 10);
539 block->WinFuncPtr = *(CARD32*)(((char*)pVbe->memory) + 12);
540 block->BytesPerScanline = *(CARD16*)(((char*)pVbe->memory) + 16);
541
542 /* mandatory information for VBE 1.2 and above */
543 block->XResolution = *(CARD16*)(((char*)pVbe->memory) + 18);
544 block->YResolution = *(CARD16*)(((char*)pVbe->memory) + 20);
545 block->XCharSize = ((char*)pVbe->memory)[22];
546 block->YCharSize = ((char*)pVbe->memory)[23];
547 block->NumberOfPlanes = ((char*)pVbe->memory)[24];
548 block->BitsPerPixel = ((char*)pVbe->memory)[25];
549 block->NumberOfBanks = ((char*)pVbe->memory)[26];
550 block->MemoryModel = ((char*)pVbe->memory)[27];
551 block->BankSize = ((char*)pVbe->memory)[28];
552 block->NumberOfImages = ((char*)pVbe->memory)[29];
553 block->Reserved = ((char*)pVbe->memory)[30];
554
555 /* Direct color fields (required for direct/6 and YUV/7 memory models) */
556 block->RedMaskSize = ((char*)pVbe->memory)[31];
557 block->RedFieldPosition = ((char*)pVbe->memory)[32];
558 block->GreenMaskSize = ((char*)pVbe->memory)[33];
559 block->GreenFieldPosition = ((char*)pVbe->memory)[34];
560 block->BlueMaskSize = ((char*)pVbe->memory)[35];
561 block->BlueFieldPosition = ((char*)pVbe->memory)[36];
562 block->RsvdMaskSize = ((char*)pVbe->memory)[37];
563 block->RsvdFieldPosition = ((char*)pVbe->memory)[38];
564 block->DirectColorModeInfo = ((char*)pVbe->memory)[39];
565
566 /* Mandatory information for VBE 2.0 and above */
567 if (pVbe->version >= 0x200) {
568 block->PhysBasePtr = *(CARD32*)(((char*)pVbe->memory) + 40);
569 block->Reserved32 = *(CARD32*)(((char*)pVbe->memory) + 44);
570 block->Reserved16 = *(CARD16*)(((char*)pVbe->memory) + 48);
571
572 /* Mandatory information for VBE 3.0 and above */
573 if (pVbe->version >= 0x300) {
574 block->LinBytesPerScanLine = *(CARD16*)(((char*)pVbe->memory) + 50);
575 block->BnkNumberOfImagePages = ((char*)pVbe->memory)[52];
576 block->LinNumberOfImagePages = ((char*)pVbe->memory)[53];
577 block->LinRedMaskSize = ((char*)pVbe->memory)[54];
578 block->LinRedFieldPosition = ((char*)pVbe->memory)[55];
579 block->LinGreenMaskSize = ((char*)pVbe->memory)[56];
580 block->LinGreenFieldPosition = ((char*)pVbe->memory)[57];
581 block->LinBlueMaskSize = ((char*)pVbe->memory)[58];
582 block->LinBlueFieldPosition = ((char*)pVbe->memory)[59];
583 block->LinRsvdMaskSize = ((char*)pVbe->memory)[60];
584 block->LinRsvdFieldPosition = ((char*)pVbe->memory)[61];
585 block->MaxPixelClock = *(CARD32*)(((char*)pVbe->memory) + 62);
586 memcpy(&block->Reserved2, ((char*)pVbe->memory) + 66, 188);
587 }
588 else
589 memcpy(&block->LinBytesPerScanLine, ((char*)pVbe->memory) + 50, 206);
590 }
591 else
592 memcpy(&block->PhysBasePtr, ((char*)pVbe->memory) + 40, 216);
593 533
594 return block; 534 return block;
595} 535}