|
@@ -33,20 +33,20 @@
|
33
|
33
|
* @ret max_bus Maximum bus number
|
34
|
34
|
*/
|
35
|
35
|
int pcibios_max_bus ( void ) {
|
36
|
|
- int discard_a;
|
|
36
|
+ int discard_a, discard_D;
|
37
|
37
|
uint8_t max_bus;
|
38
|
38
|
|
39
|
|
- REAL_EXEC ( rm_pcibios_check,
|
40
|
|
- "stc\n\t"
|
41
|
|
- "int $0x1a\n\t"
|
42
|
|
- "jnc 1f\n\t"
|
43
|
|
- "xorw %%cx, %%cx\n\t"
|
44
|
|
- "\n1:\n\t",
|
45
|
|
- 2,
|
46
|
|
- OUT_CONSTRAINTS ( "=a" ( discard_a ), "=c" ( max_bus ) ),
|
47
|
|
- IN_CONSTRAINTS ( "a" ( PCIBIOS_INSTALLATION_CHECK >> 16 )),
|
48
|
|
- CLOBBER ( "ebx", "edx", "edi" ) );
|
49
|
|
-
|
|
39
|
+ __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
|
|
40
|
+ "int $0x1a\n\t"
|
|
41
|
+ "jnc 1f\n\t"
|
|
42
|
+ "xorw %%cx, %%cx\n\t"
|
|
43
|
+ "\n1:\n\t" )
|
|
44
|
+ : "=c" ( max_bus ), "=a" ( discard_a ),
|
|
45
|
+ "=D" ( discard_D )
|
|
46
|
+ : "a" ( PCIBIOS_INSTALLATION_CHECK >> 16 ),
|
|
47
|
+ "D" ( 0 )
|
|
48
|
+ : "ebx", "edx" );
|
|
49
|
+
|
50
|
50
|
return max_bus;
|
51
|
51
|
}
|
52
|
52
|
|
|
@@ -62,22 +62,19 @@ int pcibios_read ( struct pci_device *pci, uint32_t command, uint32_t *value ){
|
62
|
62
|
int discard_b, discard_D;
|
63
|
63
|
int status;
|
64
|
64
|
|
65
|
|
- REAL_EXEC ( rm_pcibios_read,
|
66
|
|
- "stc\n\t"
|
67
|
|
- "int $0x1a\n\t"
|
68
|
|
- "jnc 1f\n\t"
|
69
|
|
- "xorl %%eax, %%eax\n\t"
|
70
|
|
- "decl %%eax\n\t"
|
71
|
|
- "movl %%eax, %%ecx\n\t"
|
72
|
|
- "\n1:\n\t",
|
73
|
|
- 4,
|
74
|
|
- OUT_CONSTRAINTS ( "=a" ( status ), "=b" ( discard_b ),
|
75
|
|
- "=c" ( *value ), "=D" ( discard_D ) ),
|
76
|
|
- IN_CONSTRAINTS ( "a" ( command >> 16 ),
|
77
|
|
- "b" ( ( pci->bus << 8 ) | pci->devfn ),
|
78
|
|
- "D" ( command ) ),
|
79
|
|
- CLOBBER ( "edx" ) );
|
80
|
|
-
|
|
65
|
+ __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
|
|
66
|
+ "int $0x1a\n\t"
|
|
67
|
+ "jnc 1f\n\t"
|
|
68
|
+ "xorl %%eax, %%eax\n\t"
|
|
69
|
+ "decl %%eax\n\t"
|
|
70
|
+ "movl %%eax, %%ecx\n\t"
|
|
71
|
+ "\n1:\n\t" )
|
|
72
|
+ : "=a" ( status ), "=b" ( discard_b ),
|
|
73
|
+ "=c" ( *value ), "=D" ( discard_D )
|
|
74
|
+ : "a" ( command >> 16 ), "D" ( command ),
|
|
75
|
+ "b" ( ( pci->bus << 8 ) | pci->devfn )
|
|
76
|
+ : "edx" );
|
|
77
|
+
|
81
|
78
|
return ( ( status >> 8 ) & 0xff );
|
82
|
79
|
}
|
83
|
80
|
|
|
@@ -93,19 +90,17 @@ int pcibios_write ( struct pci_device *pci, uint32_t command, uint32_t value ){
|
93
|
90
|
int discard_b, discard_c, discard_D;
|
94
|
91
|
int status;
|
95
|
92
|
|
96
|
|
- REAL_EXEC ( rm_pcibios_write,
|
97
|
|
- "stc\n\t"
|
98
|
|
- "int $0x1a\n\t"
|
99
|
|
- "jnc 1f\n\t"
|
100
|
|
- "movb $0xff, %%ah\n\t"
|
101
|
|
- "\n1:\n\t",
|
102
|
|
- 4,
|
103
|
|
- OUT_CONSTRAINTS ( "=a" ( status ), "=b" ( discard_b ),
|
104
|
|
- "=c" ( discard_c ), "=D" ( discard_D ) ),
|
105
|
|
- IN_CONSTRAINTS ( "a" ( command >> 16 ),
|
106
|
|
- "b" ( ( pci->bus << 8 ) | pci->devfn ),
|
107
|
|
- "c" ( value ), "D" ( command ) ),
|
108
|
|
- CLOBBER ( "edx" ) );
|
|
93
|
+ __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
|
|
94
|
+ "int $0x1a\n\t"
|
|
95
|
+ "jnc 1f\n\t"
|
|
96
|
+ "movb $0xff, %%ah\n\t"
|
|
97
|
+ "\n1:\n\t" )
|
|
98
|
+ : "=a" ( status ), "=b" ( discard_b ),
|
|
99
|
+ "=c" ( discard_c ), "=D" ( discard_D )
|
|
100
|
+ : "a" ( command >> 16 ), "D" ( command ),
|
|
101
|
+ "b" ( ( pci->bus << 8 ) | pci->devfn ),
|
|
102
|
+ "c" ( value )
|
|
103
|
+ : "edx" );
|
109
|
104
|
|
110
|
105
|
return ( ( status >> 8 ) & 0xff );
|
111
|
106
|
}
|