diff options
author | Frediano Ziglio <frediano.ziglio@citrix.com> | 2012-05-07 13:38:23 +0100 |
---|---|---|
committer | Frediano Ziglio <frediano.ziglio@citrix.com> | 2012-05-07 13:38:23 +0100 |
commit | 4da31be1202e9d82f4a0c5b7cb79ec36a941598c (patch) | |
tree | c15ef6ed7d6a8a1bb240fe96c7396641c5000206 /tools/firmware | |
parent | a8ceaf5c72e7cd80a393622d047bb17ed7ffab65 (diff) | |
download | xen-4da31be1202e9d82f4a0c5b7cb79ec36a941598c.tar.gz xen-4da31be1202e9d82f4a0c5b7cb79ec36a941598c.tar.bz2 xen-4da31be1202e9d82f4a0c5b7cb79ec36a941598c.zip |
vgabios: Reduce stack usage getting mode informations
Informations are stored in a structure that is smaller than final one.
Previous code copy this structure to stack extending with zeroes then
update it and copy to caller while now the not-extended version is
copied into stack and then is extended during copy reducing stack
usage.
Signed-off-by: Frediano Ziglio <frediano.ziglio@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'tools/firmware')
-rw-r--r-- | tools/firmware/vgabios/vbe.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/tools/firmware/vgabios/vbe.c b/tools/firmware/vgabios/vbe.c index dd795354a7..15f44a8491 100644 --- a/tools/firmware/vgabios/vbe.c +++ b/tools/firmware/vgabios/vbe.c @@ -912,9 +912,9 @@ Bit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI; // error by default is 0x014f which means supported but error Bit16u result=0x014f; Bit16u ss=get_SS(); - ModeInfoBlock info; ModeInfoListItem *cur_info; Boolean using_lfb; + ModeInfoBlockCompact info; #ifdef DEBUG printf("VBE vbe_biosfn_return_mode_information ES%x DI%x CX%x\n",ES,DI,CX); @@ -931,7 +931,6 @@ Bit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI; #ifdef DEBUG printf("VBE found mode %x\n",CX); #endif - memsetb(ss, &info, 0, sizeof(ModeInfoBlock)); memcpyb(ss, &info, 0xc000, &(cur_info->info), sizeof(ModeInfoBlockCompact)); if (using_lfb) { info.NumberOfBanks = 1; @@ -948,6 +947,10 @@ Bit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI; info.PhysBasePtr |= inw(VBE_DISPI_IOPORT_DATA); #endif result = 0x4f; + + // copy updates in mode_info_block back + memsetb(ES, DI, 0, sizeof(ModeInfoBlock)); + memcpyb(ES, DI, ss, &info, sizeof(info)); } else { @@ -955,12 +958,6 @@ Bit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI; printf("VBE *NOT* found mode %x\n",CX); #endif } - - if (result == 0x4f) - { - // copy updates in mode_info_block back - memcpyb(ES, DI, ss, &info, sizeof(info)); - } write_word(ss, AX, result); } |