|
|
1.1 root 1: // PNP BIOS calls
2: //
3: // Copyright (C) 2008 Kevin O'Connor <[email protected]>
4: //
5: // This file may be distributed under the terms of the GNU LGPLv3 license.
6:
7: #include "util.h" // checksum
8: #include "config.h" // BUILD_BIOS_ADDR
9: #include "farptr.h" // SET_FARVAR
10:
11: struct pnpheader {
12: u32 signature;
13: u8 version;
14: u8 length;
15: u16 control;
16: u8 checksum;
17: u32 eventloc;
18: u16 real_ip;
19: u16 real_cs;
20: u16 prot_ip;
21: u32 prot_base;
22: u32 oemid;
23: u16 real_ds;
24: u32 prot_database;
25: } PACKED;
26:
27: extern struct pnpheader PNPHEADER;
28: extern char pnp_string[];
29:
30: #if CONFIG_PNPBIOS
31: struct pnpheader PNPHEADER __aligned(16) VAR16EXPORT = {
32: .signature = PNP_SIGNATURE,
33: .version = 0x10,
34: .length = sizeof(PNPHEADER),
35: .real_cs = SEG_BIOS,
36: .prot_base = BUILD_BIOS_ADDR,
37: .real_ds = SEG_BIOS,
38: .prot_database = BUILD_BIOS_ADDR,
39: };
40: #else
41: // We need a copy of this string in the 0xf000 segment, but we are not
42: // actually a PnP BIOS, so make sure it is *not* aligned, so OSes will
43: // not see it if they scan.
44: char pnp_string[] __aligned(2) VAR16VISIBLE = " $PnP";
45: #endif
46:
47: #define FUNCTION_NOT_SUPPORTED 0x82
48:
49: // BBS - Get Version and Installation Check
50: static u16
51: handle_pnp60(u16 *args)
52: {
53: u16 version_ptr = args[1];
54: u16 version_seg = args[2];
55: SET_FARVAR(version_seg, *(u16*)(version_ptr+0), 0x0101);
56: return 0;
57: }
58:
59: static u16
60: handle_pnpXX(u16 *args)
61: {
62: return FUNCTION_NOT_SUPPORTED;
63: }
64:
65: u16 VISIBLE16
66: handle_pnp(u16 *args)
67: {
68: if (! CONFIG_PNPBIOS)
69: return FUNCTION_NOT_SUPPORTED;
70:
71: u16 arg1 = args[0];
72: dprintf(DEBUG_HDL_pnp, "pnp call arg1=%x\n", arg1);
73:
74: switch (arg1) {
75: case 0x60: return handle_pnp60(args);
76: default: return handle_pnpXX(args);
77: }
78: }
79:
80: u16
1.1.1.2 ! root 81: get_pnp_offset(void)
1.1 root 82: {
83: if (! CONFIG_PNPBIOS)
84: return (u32)pnp_string + 1 - BUILD_BIOS_ADDR;
85: return (u32)&PNPHEADER - BUILD_BIOS_ADDR;
86: }
87:
88: // romlayout.S
1.1.1.2 ! root 89: extern void entry_pnp_real(void);
! 90: extern void entry_pnp_prot(void);
1.1 root 91:
92: void
1.1.1.2 ! root 93: pnp_setup(void)
1.1 root 94: {
95: if (! CONFIG_PNPBIOS)
96: return;
97:
98: dprintf(3, "init PNPBIOS table\n");
99:
100: PNPHEADER.real_ip = (u32)entry_pnp_real - BUILD_BIOS_ADDR;
101: PNPHEADER.prot_ip = (u32)entry_pnp_prot - BUILD_BIOS_ADDR;
102: PNPHEADER.checksum -= checksum(&PNPHEADER, sizeof(PNPHEADER));
103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.