Annotation of qemu/roms/seabios/src/apm.c, revision 1.1

1.1     ! root        1: // Basic support for apmbios callbacks.
        !             2: //
        !             3: // Copyright (C) 2008  Kevin O'Connor <[email protected]>
        !             4: // Copyright (C) 2005 Struan Bartlett
        !             5: // Copyright (C) 2004 Fabrice Bellard
        !             6: //
        !             7: // This file may be distributed under the terms of the GNU LGPLv3 license.
        !             8: 
        !             9: #include "farptr.h" // GET_VAR
        !            10: #include "bregs.h" // struct bregs
        !            11: #include "ioport.h" // outb
        !            12: #include "util.h" // wait_irq
        !            13: #include "config.h" // CONFIG_*
        !            14: #include "biosvar.h" // GET_GLOBAL
        !            15: 
        !            16: static void
        !            17: out_str(const char *str_cs)
        !            18: {
        !            19:     if (CONFIG_COREBOOT) {
        !            20:         dprintf(1, "APM request '%s'\n", str_cs);
        !            21:         return;
        !            22:     }
        !            23: 
        !            24:     u8 *s = (u8*)str_cs;
        !            25:     for (;;) {
        !            26:         u8 c = GET_GLOBAL(*s);
        !            27:         if (!c)
        !            28:             break;
        !            29:         outb(c, PORT_BIOS_APM);
        !            30:         s++;
        !            31:     }
        !            32: }
        !            33: 
        !            34: // APM installation check
        !            35: static void
        !            36: handle_155300(struct bregs *regs)
        !            37: {
        !            38:     regs->ah = 1; // APM major version
        !            39:     regs->al = 2; // APM minor version
        !            40:     regs->bh = 'P';
        !            41:     regs->bl = 'M';
        !            42:     // bit 0 : 16 bit interface supported
        !            43:     // bit 1 : 32 bit interface supported
        !            44:     regs->cx = 0x03;
        !            45:     set_success(regs);
        !            46: }
        !            47: 
        !            48: // APM real mode interface connect
        !            49: static void
        !            50: handle_155301(struct bregs *regs)
        !            51: {
        !            52:     set_success(regs);
        !            53: }
        !            54: 
        !            55: // Assembler entry points defined in romlayout.S
        !            56: extern void apm16protected_entry();
        !            57: extern void apm32protected_entry();
        !            58: 
        !            59: // APM 16 bit protected mode interface connect
        !            60: static void
        !            61: handle_155302(struct bregs *regs)
        !            62: {
        !            63:     regs->bx = (u32)apm16protected_entry;
        !            64:     regs->ax = SEG_BIOS; // 16 bit code segment base
        !            65:     regs->si = 0xfff0;   // 16 bit code segment size
        !            66:     regs->cx = SEG_BIOS; // data segment address
        !            67:     regs->di = 0xfff0;   // data segment length
        !            68:     set_success(regs);
        !            69: }
        !            70: 
        !            71: // APM 32 bit protected mode interface connect
        !            72: static void
        !            73: handle_155303(struct bregs *regs)
        !            74: {
        !            75:     regs->ax = SEG_BIOS; // 32 bit code segment base
        !            76:     regs->ebx = (u32)apm32protected_entry;
        !            77:     regs->cx = SEG_BIOS; // 16 bit code segment base
        !            78:     // 32 bit code segment size (low 16 bits)
        !            79:     // 16 bit code segment size (high 16 bits)
        !            80:     regs->esi = 0xfff0fff0;
        !            81:     regs->dx = SEG_BIOS; // data segment address
        !            82:     regs->di = 0xfff0; // data segment length
        !            83:     set_success(regs);
        !            84: }
        !            85: 
        !            86: // APM interface disconnect
        !            87: static void
        !            88: handle_155304(struct bregs *regs)
        !            89: {
        !            90:     set_success(regs);
        !            91: }
        !            92: 
        !            93: // APM cpu idle
        !            94: static void
        !            95: handle_155305(struct bregs *regs)
        !            96: {
        !            97:     wait_irq();
        !            98:     set_success(regs);
        !            99: }
        !           100: 
        !           101: // APM cpu busy
        !           102: static void
        !           103: handle_155306(struct bregs *regs)
        !           104: {
        !           105:     set_success(regs);
        !           106: }
        !           107: 
        !           108: // APM Set Power State
        !           109: static void
        !           110: handle_155307(struct bregs *regs)
        !           111: {
        !           112:     if (regs->bx != 1) {
        !           113:         set_success(regs);
        !           114:         return;
        !           115:     }
        !           116:     switch (regs->cx) {
        !           117:     case 1:
        !           118:         out_str("Standby");
        !           119:         break;
        !           120:     case 2:
        !           121:         out_str("Suspend");
        !           122:         break;
        !           123:     case 3:
        !           124:         irq_disable();
        !           125:         out_str("Shutdown");
        !           126:         for (;;)
        !           127:             hlt();
        !           128:         break;
        !           129:     }
        !           130:     set_success(regs);
        !           131: }
        !           132: 
        !           133: static void
        !           134: handle_155308(struct bregs *regs)
        !           135: {
        !           136:     set_success(regs);
        !           137: }
        !           138: 
        !           139: // Get Power Status
        !           140: static void
        !           141: handle_15530a(struct bregs *regs)
        !           142: {
        !           143:     regs->bh = 0x01; // on line
        !           144:     regs->bl = 0xff; // unknown battery status
        !           145:     regs->ch = 0x80; // no system battery
        !           146:     regs->cl = 0xff; // unknown remaining time
        !           147:     regs->dx = 0xffff; // unknown remaining time
        !           148:     regs->si = 0x00; // zero battery
        !           149:     set_success(regs);
        !           150: }
        !           151: 
        !           152: #define RET_ENOEVENT 0x80
        !           153: 
        !           154: // Get PM Event
        !           155: static void
        !           156: handle_15530b(struct bregs *regs)
        !           157: {
        !           158:     set_code_invalid_silent(regs, RET_ENOEVENT);
        !           159: }
        !           160: 
        !           161: // APM Driver Version
        !           162: static void
        !           163: handle_15530e(struct bregs *regs)
        !           164: {
        !           165:     regs->ah = 1;
        !           166:     regs->al = 2;
        !           167:     set_success(regs);
        !           168: }
        !           169: 
        !           170: // APM Engage / Disengage
        !           171: static void
        !           172: handle_15530f(struct bregs *regs)
        !           173: {
        !           174:     set_success(regs);
        !           175: }
        !           176: 
        !           177: // APM Get Capabilities
        !           178: static void
        !           179: handle_155310(struct bregs *regs)
        !           180: {
        !           181:     regs->bl = 0;
        !           182:     regs->cx = 0;
        !           183:     set_success(regs);
        !           184: }
        !           185: 
        !           186: static void
        !           187: handle_1553XX(struct bregs *regs)
        !           188: {
        !           189:     set_unimplemented(regs);
        !           190: }
        !           191: 
        !           192: void VISIBLE16
        !           193: handle_1553(struct bregs *regs)
        !           194: {
        !           195:     if (! CONFIG_APMBIOS) {
        !           196:         set_code_invalid(regs, RET_EUNSUPPORTED);
        !           197:         return;
        !           198:     }
        !           199: 
        !           200:     //debug_stub(regs);
        !           201:     switch (regs->al) {
        !           202:     case 0x00: handle_155300(regs); break;
        !           203:     case 0x01: handle_155301(regs); break;
        !           204:     case 0x02: handle_155302(regs); break;
        !           205:     case 0x03: handle_155303(regs); break;
        !           206:     case 0x04: handle_155304(regs); break;
        !           207:     case 0x05: handle_155305(regs); break;
        !           208:     case 0x06: handle_155306(regs); break;
        !           209:     case 0x07: handle_155307(regs); break;
        !           210:     case 0x08: handle_155308(regs); break;
        !           211:     case 0x0a: handle_15530a(regs); break;
        !           212:     case 0x0b: handle_15530b(regs); break;
        !           213:     case 0x0e: handle_15530e(regs); break;
        !           214:     case 0x0f: handle_15530f(regs); break;
        !           215:     case 0x10: handle_155310(regs); break;
        !           216:     default:   handle_1553XX(regs); break;
        !           217:     }
        !           218: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.