mirror of
https://github.com/0xAX/linux-insides.git
synced 2024-12-22 22:58:08 +00:00
fix order of calling set_bios_mode()
Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
This commit is contained in:
parent
5880a60e6e
commit
b4f824db27
@ -358,6 +358,24 @@ if (cpu_level < req_level) {
|
|||||||
|
|
||||||
The `check_cpu` function checks the CPU's flags, the presence of [long mode](http://en.wikipedia.org/wiki/Long_mode) in the case of x86_64(64-bit) CPU, checks the processor's vendor and makes preparations for certain vendors like turning off SSE+SSE2 for AMD if they are missing, etc.
|
The `check_cpu` function checks the CPU's flags, the presence of [long mode](http://en.wikipedia.org/wiki/Long_mode) in the case of x86_64(64-bit) CPU, checks the processor's vendor and makes preparations for certain vendors like turning off SSE+SSE2 for AMD if they are missing, etc.
|
||||||
|
|
||||||
|
at the next step, we may see a call to the `set_bios_mode` function after setup code found that a CPU is suitable. As we may see, this function is implemented only for the `x86_64` mode:
|
||||||
|
|
||||||
|
```C
|
||||||
|
static void set_bios_mode(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
struct biosregs ireg;
|
||||||
|
|
||||||
|
initregs(&ireg);
|
||||||
|
ireg.ax = 0xec00;
|
||||||
|
ireg.bx = 2;
|
||||||
|
intcall(0x15, &ireg, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `set_bios_mode` function executes the `0x15` BIOS interrupt to tell the BIOS that [long mode](https://en.wikipedia.org/wiki/Long_mode) (if `bx == 2`) will be used.
|
||||||
|
|
||||||
Memory detection
|
Memory detection
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -404,24 +422,6 @@ You can see the result of this in the `dmesg` output, something like:
|
|||||||
[ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
|
[ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, we may see a call to the `set_bios_mode` function. As we may see, this function is implemented only for the `x86_64` mode:
|
|
||||||
|
|
||||||
```C
|
|
||||||
static void set_bios_mode(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
struct biosregs ireg;
|
|
||||||
|
|
||||||
initregs(&ireg);
|
|
||||||
ireg.ax = 0xec00;
|
|
||||||
ireg.bx = 2;
|
|
||||||
intcall(0x15, &ireg, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The `set_bios_mode` function executes the `0x15` BIOS interrupt to tell the BIOS that [long mode](https://en.wikipedia.org/wiki/Long_mode) (if `bx == 2`) will be used.
|
|
||||||
|
|
||||||
Keyboard initialization
|
Keyboard initialization
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user