diff options
author | Adam Jackson <ajax@redhat.com> | 2010-10-05 11:24:28 -0400 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@apple.com> | 2010-10-13 18:42:45 -0700 |
commit | efeb2ebd7e307224a735469ff89a3a6af4cf143b (patch) | |
tree | 0871e38e62df56cfd264e3f9e593fa923c1279d8 | |
parent | e5b19f14eac609e3c315e14e20ca1935de8de0e3 (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.c | 66 |
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 | } |