返回列表 发帖

S3下去,控制权如何切换到BIOS?

目前,我知道应该是通过SMI方式,将控制权从OS OSPM切换到BIOS。

该smi应该是在asl code里面发的,但是我始终没有找到Store(xxx, SMIC)的字样。

请高人点拨,谢谢!!

进S3触发的SMI不是SW SMI,是SX,用EFI_SMM_SX_DISPATCH_PROTOCOL中的register注册的

TOP

在SPTS中有两种做法:一种直接把SLP_SMI disable由asl去让系统进入sleep;
一种是enable SLP_SMI,触发sleep smi让跳到bios中register的sx dispatcher中通过写
sleep type and sleep enable让系统进入sleep
note:这里涉及到slp_en的控制,当SLP_SMI enable时,置位slp_en是触发sx sleep,如果disable,置位slp_en就会根据sleep type中的值,把系统置位某种sleep状态,故在当在SPTS中要先enable slp_smi,然后由ospm来触发sx sleep,进到bios中的sx dispatcher就会先disable slp_smi ,再置位slp_en来让系统进入sx sleep状态
As long as you have faith,everything that looks unreachable will be possible!

TOP

S3会把控制权给BIOS?

TOP

回复 4# 小萝卜头

这个。。。睡前发SMI执行biso中注册的handler

TOP

你們都沒有回答人家的問題,其實我現在也疑惑,ASL是如何發SMI執行SMM code
的,瞭解的不妨指教一下。

TOP

sleep SMI
简单即美!
bitcoin Address:
12fBF2hp9CF4tirU6pqwWsRZYoypVrRdMx

TOP

sleep SMI
wj0225 发表于 2011-8-17 11:36



    这个我也知道,但是就是在code里找不到,在哪儿触发的。

TOP

sleep SMI
wj0225 发表于 2011-8-17 11:36



    这个我也知道,但是就是在code里找不到,在哪儿触发的。

TOP

回复 9# Future


    操作系统自己写的吧,ACPI table会告诉OS 相关bit的位置

TOP

去翻PCH的Spec吧,查找"causes", 应该可以找到causes smi/sci类似的文字,sleep应该是触发硬件smi,在asl code里找不到也就不奇怪了,我猜的~~~

Espruino: 运行在单片机上的JavaScript解释器。
http://www.espruino.cn

TOP

本帖最后由 AllenHu 于 2011-9-20 09:04 编辑

追了一下Linux  Kernel  Code: 执行流程大致如下
HWsleep.c
一.  函数 acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
       1.  /* _PSW methods could be run here to enable wake-on keyboard, LAN, etc. */
       2.  _PTS
       3.  _SST

二.  函数 acpi_status acpi_enter_sleep_state(u8 sleep_state)
       1. /* Clear wake status */
  //     2. /* Clear wake status */
       3   /* Clear all fixed and general purpose status bits */
       4   /*
            * 1) Disable/Clear all GPEs
            * 2) Enable all wakeup GPEs
         */
       5   /* Execute the _GTS method */
       6   /* Get current value of PM1A control */           //PM1_CNT  
       7   /* Clear the SLP_EN and SLP_TYP fields */
       8   /* Flush caches, as per ACPI specification */
          ......

       9  /* Write #2: Write both SLP_TYP + SLP_EN */     
   所以应该是OS Code 自己做的 SLP_TYPE 和SLP_EN   ,不在ASL  code
  ,写完这个寄存器应该就是HW  SMI  切到bios  执行SMM code吧?

TOP

向LS致敬,LS是一個真正的軟件工程師。

TOP

回复 13# SmartFish
        谢谢,过奖啦,互相学习

TOP

回复 12# AllenHu


    你太强大了!!

TOP

学习ing

TOP

應該是用 io trap 在對io 下sleep or shutdown的時候,trap到之後就馬上到sbios smi runtime handler.
(不對的話,請不要罵我@@)

TOP

基本上以efi的spec是有一個sleep smi的東西可以注冊 注冊下去之後進s3會用asl code發sleep smi將控制權丟回給bios這邊

TOP

回复 18# irwin


    硬件发的SMI

TOP

回复 12# AllenHu


    OS中会填slp_en和slp_type,bios中也会填只是目的不一样,os在填之前通过asl先enable slp_smi,这样当os在写slp_en时就会产生sleep smi,A家bios中asl code中会先执行这样的语句(在进S3 S4之前enable sleep smi     
    Method (SPTS, 1) {
        Store(One, SLPX)        // Clear SLP_SMI Status
        Store(One, SLPE)        // Enable SLP_SMI
    }

     当os产生sleep smi后,进入到smm把控制权给到bios,bios会先读slp_type(由刚刚os所填),然后disable sleep smi,填slp_type 和 slp_en 让系统进入SX的状态。

TOP

返回列表