aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware
diff options
context:
space:
mode:
authorFrediano Ziglio <frediano.ziglio@citrix.com>2012-05-07 13:38:23 +0100
committerFrediano Ziglio <frediano.ziglio@citrix.com>2012-05-07 13:38:23 +0100
commit4da31be1202e9d82f4a0c5b7cb79ec36a941598c (patch)
treec15ef6ed7d6a8a1bb240fe96c7396641c5000206 /tools/firmware
parenta8ceaf5c72e7cd80a393622d047bb17ed7ffab65 (diff)
downloadxen-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.c13
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);
}