Add PMM stubs.
[seabios.git] / src / pmm.c
1 // Post memory manager (PMM) calls
2 //
3 // Copyright (C) 2009  Kevin O'Connor <kevin@koconnor.net>
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
10 struct pmmheader {
11     u32 signature;
12     u8 version;
13     u8 length;
14     u8 checksum;
15     u16 entry_offset;
16     u16 entry_seg;
17     u8 reserved[5];
18 } PACKED;
19
20 extern struct pmmheader PMMHEADER;
21
22 #define PMM_SIGNATURE 0x4d4d5024 // $PMM
23
24 #if CONFIG_PMM
25 struct pmmheader PMMHEADER __aligned(16) VAR16EXPORT = {
26     .version = 0x01,
27     .length = sizeof(PMMHEADER),
28     .entry_seg = SEG_BIOS,
29 };
30 #endif
31
32 #define FUNCTION_NOT_SUPPORTED 0xffffffff
33
34 // PMM - allocate
35 static u32
36 handle_pmm00(u16 *args)
37 {
38     u32 length = *(u32*)&args[1], handle = *(u32*)&args[3];
39     u16 flags = args[5];
40     dprintf(1, "pmm00: length=%x handle=%x flags=%x\n"
41             , length, handle, flags);
42     // XXX
43     return 0;
44 }
45
46 // PMM - find
47 static u32
48 handle_pmm01(u16 *args)
49 {
50     u32 handle = *(u32*)&args[1];
51     dprintf(1, "pmm01: handle=%x\n", handle);
52     // XXX
53     return 0;
54 }
55
56 // PMM - deallocate
57 static u32
58 handle_pmm02(u16 *args)
59 {
60     u32 buffer = *(u32*)&args[1];
61     dprintf(1, "pmm02: buffer=%x\n", buffer);
62     // XXX
63     return 0;
64 }
65
66 static u32
67 handle_pmmXX(u16 *args)
68 {
69     return FUNCTION_NOT_SUPPORTED;
70 }
71
72 u32 VISIBLE16
73 handle_pmm(u16 *args)
74 {
75     if (! CONFIG_PMM)
76         return FUNCTION_NOT_SUPPORTED;
77
78     u16 arg1 = args[0];
79     dprintf(DEBUG_HDL_pmm, "pmm call arg1=%x\n", arg1);
80
81     switch (arg1) {
82     case 0x00: return handle_pmm00(args);
83     case 0x01: return handle_pmm01(args);
84     case 0x02: return handle_pmm02(args);
85     default:   return handle_pmmXX(args);
86     }
87 }
88
89 // romlayout.S
90 extern void entry_pmm();
91
92 void
93 pmm_setup()
94 {
95     if (! CONFIG_PMM)
96         return;
97
98     dprintf(3, "init PMM\n");
99
100     PMMHEADER.signature = PMM_SIGNATURE;
101     PMMHEADER.entry_offset = (u32)entry_pmm - BUILD_BIOS_ADDR;
102     PMMHEADER.checksum -= checksum(&PMMHEADER, sizeof(PMMHEADER));
103 }
104
105 void
106 pmm_finalize()
107 {
108     if (! CONFIG_PMM)
109         return;
110
111     dprintf(3, "finalize PMM\n");
112
113     PMMHEADER.signature = 0;
114     PMMHEADER.entry_offset = 0;
115
116     // XXX - zero low-memory allocations.
117 }