Browse Source

[comboot] Propagate carry flag from COMBOOT API

COMBOOT API calls set the carry flag on failure.  This was not being
propagated because the COMBOOT interrupt handler used iret to return
with EFLAGS restored from the stack.  This patch propagates CF before
returning from the interrupt.

Reported-by: Geoff Lywood <glywood@vmware.com>
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Signed-off-by: Marty Connor <mdc@etherboot.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Stefan Hajnoczi 14 years ago
parent
commit
0d108681ac

+ 38
- 0
src/arch/i386/core/patch_cf.S View File

1
+/*
2
+ * Copyright (C) 2009 H. Peter Anvin <hpa@zytor.com>
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License
6
+ * as published by the Free Software Foundation; either version 2
7
+ * of the License, or (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17
+ */
18
+
19
+FILE_LICENCE ( GPL2_OR_LATER )
20
+
21
+	.text
22
+	.arch i386
23
+	.code16
24
+
25
+/****************************************************************************
26
+ * Set/clear CF on the stack as appropriate, assumes stack is as it should
27
+ * be immediately before IRET
28
+ ****************************************************************************
29
+ */
30
+	.section ".text16", "ax", @progbits
31
+	.globl patch_cf
32
+patch_cf:
33
+	pushw	%bp
34
+	movw	%sp, %bp
35
+	setc	8(%bp)	/* Set/reset CF; clears PF, AF, ZF, SF */
36
+	popw	%bp
37
+	ret
38
+	.size patch_cf, . - patch_cf

+ 0
- 12
src/arch/i386/firmware/pcbios/e820mangler.S View File

492
 	ret
492
 	ret
493
 	.size get_mangled_e820, . - get_mangled_e820
493
 	.size get_mangled_e820, . - get_mangled_e820
494
 
494
 
495
-/****************************************************************************
496
- * Set/clear CF on the stack as appropriate, assumes stack is as it should
497
- * be immediately before IRET
498
- ****************************************************************************
499
- */
500
-patch_cf:
501
-	pushw	%bp
502
-	movw	%sp, %bp
503
-	setc	8(%bp)	/* Set/reset CF; clears PF, AF, ZF, SF */
504
-	popw	%bp
505
-	ret
506
-
507
 /****************************************************************************
495
 /****************************************************************************
508
  * INT 15,e820 handler
496
  * INT 15,e820 handler
509
  ****************************************************************************
497
  ****************************************************************************

+ 3
- 0
src/arch/i386/interface/syslinux/comboot_call.c View File

669
 		              "pushw %%cs\n\t"
669
 		              "pushw %%cs\n\t"
670
 		              "call prot_call\n\t"
670
 		              "call prot_call\n\t"
671
 		              "addw $4, %%sp\n\t"
671
 		              "addw $4, %%sp\n\t"
672
+			      "call patch_cf\n\t"
672
 		              "iret\n\t" )
673
 		              "iret\n\t" )
673
 		          : : "i" ( int20 ) );
674
 		          : : "i" ( int20 ) );
674
 
675
 
681
 		              "pushw %%cs\n\t"
682
 		              "pushw %%cs\n\t"
682
 		              "call prot_call\n\t"
683
 		              "call prot_call\n\t"
683
 		              "addw $4, %%sp\n\t"
684
 		              "addw $4, %%sp\n\t"
685
+			      "call patch_cf\n\t"
684
 		              "iret\n\t" )
686
 		              "iret\n\t" )
685
 		          : : "i" ( int21 ) );
687
 		          : : "i" ( int21 ) );
686
 
688
 
693
 		              "pushw %%cs\n\t"
695
 		              "pushw %%cs\n\t"
694
 		              "call prot_call\n\t"
696
 		              "call prot_call\n\t"
695
 		              "addw $4, %%sp\n\t"
697
 		              "addw $4, %%sp\n\t"
698
+			      "call patch_cf\n\t"
696
 		              "iret\n\t" )
699
 		              "iret\n\t" )
697
 		          : : "i" ( int22) );
700
 		          : : "i" ( int22) );
698
 
701
 

Loading…
Cancel
Save