Linux 实用小代码,操作 CF9 寄存器来重启系统

Intel 的 PCH 中有一个CF9的寄存器

  • 我们可以通过在桥片上面的Reset Control Register (0xcf9)写入对应的值来做操作

    1 大概流程

  • 使能对应的端口
  • 请求reset
    • 热重启(向 IO Port CF9 写 0x06)
    • 冷重启(向 IO Port CF9 写 0x0E)
  • 实际执行reset

2 参考代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* This is a PCH CF9 Reset Control Register reset example.
* Wrote by Sam Lee
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>

int main(int argc, char *argv[]){
printf("## Samlee reset OS directly via CF9 \n");
ioperm(0xcf9, 1, 1);
outb(0x02, 0xcf9);
usleep(50);
outb(0x06, 0xcf9);
return 0; /* never arrive*/
}

3 更多关于CF9 的信息,可以参考 Intel 的 PCH 的datasheet