| ;; -*- fundamental -*- --------------------------------------------------- |
| ;; |
| ;; Copyright 2008 H. Peter Anvin - All Rights Reserved |
| ;; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin |
| ;; |
| ;; This program is free software; you can redistribute it and/or modify |
| ;; it under the terms of the GNU General Public License as published by |
| ;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
| ;; Boston MA 02110-1301, USA; either version 2 of the License, or |
| ;; (at your option) any later version; incorporated herein by reference. |
| ;; |
| ;; ----------------------------------------------------------------------- |
| |
| section .text16 |
| TICKS_TO_IDLE equ 4 ; Also in idle.c |
| |
| reset_idle: |
| push eax |
| mov eax,[cs:__jiffies] |
| mov [cs:_IdleTimer],eax |
| pop eax |
| sti ; Guard against BIOS/PXE brokenness... |
| ret |
| |
| do_idle: |
| push eax |
| push ds |
| push es |
| mov ax,cs |
| mov ds,ax |
| mov es,ax |
| pushf |
| pop ax |
| test ah,2 |
| jnz .ok |
| push si |
| push cx |
| mov si,hlt_err |
| call writestr |
| mov si,sp |
| add si,10 |
| mov cx,16 |
| .errloop: |
| ss lodsw |
| call writehex4 |
| dec cx |
| jz .endloop |
| mov al,' ' |
| call writechr |
| jmp .errloop |
| .endloop: |
| call crlf |
| pop cx |
| pop si |
| sti |
| .ok: |
| ; Don't spend time jumping to PM unless we're actually idle... |
| |
| mov eax,[__jiffies] |
| sub eax,[_IdleTimer] |
| cmp eax,TICKS_TO_IDLE |
| jb .done |
| |
| extern __idle |
| pm_call __idle |
| .done: |
| pop es |
| pop ds |
| pop eax |
| .ret: ret |
| |
| section .data16 |
| alignz 4 |
| global _IdleTimer |
| _IdleTimer dd 0 |
| global NoHalt |
| NoHalt dw 0 |
| |
| hlt_err db 'ERROR: idle with IF=0', CR, LF, 0 |
| |
| section .text16 |