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

@@ -0,0 +1,38 @@
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,18 +492,6 @@ get_mangled_e820:
492 492
 	ret
493 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 496
  * INT 15,e820 handler
509 497
  ****************************************************************************

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

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

Loading…
Cancel
Save