source: cmedia/trunk/Lib32/memory.cpp

Last change on this file was 354, checked in by stevenhl, 17 years ago

Import untested baseline cmedia sources, work products and binaries
Binaries and work products should be deleted from repository.
once new builds are verified to work.

File size: 8.5 KB
Line 
1/* $Id: memory.cpp,v 1.3 2000/07/17 18:36:34 sandervl Exp $ */
2
3//******************************************************************************
4// OS/2 implementation of Linux memory kernel services
5//
6// Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl)
7//
8// This program is free software; you can redistribute it and/or
9// modify it under the terms of the GNU General Public License as
10// published by the Free Software Foundation; either version 2 of
11// the License, or (at your option) any later version.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public
19// License along with this program; if not, write to the Free
20// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
21// USA.
22//
23//******************************************************************************
24extern "C" {
25#define INCL_NOPMAPI
26#define INCL_DOSERRORS // for ERROR_INVALID_FUNCTION
27#include <os2.h>
28}
29#include <devhelp.h>
30#include <ossidc.h>
31#include <string.h>
32#ifdef KEE
33#include <kee.h>
34#endif
35
36#pragma off (unreferenced)
37
38#define PAGE_SIZE 4096
39
40extern "C" {
41
42//******************************************************************************
43//NOTE: Assumes memory is continuous!!
44//******************************************************************************
45unsigned long virt_to_phys(void * address)
46{
47#ifdef KEE
48 KEEVMPageList pagelist;
49 ULONG nrpages;
50
51 if(KernLinToPageList(address, PAGE_SIZE, &pagelist, &nrpages)) {
52 DebugInt3();
53 return 0;
54 }
55 return pagelist.addr;
56#else
57 LINEAR addr = (LINEAR)address;
58 PAGELIST pagelist;
59
60 if(DevLinToPageList(addr, PAGE_SIZE, (PAGELIST near *)__StackToFlat((ULONG)&pagelist))) {
61 DebugInt3();
62 return 0;
63 }
64 return pagelist.physaddr;
65#endif
66}
67//******************************************************************************
68//******************************************************************************
69void * phys_to_virt(unsigned long address)
70{
71 DebugInt3();
72 return 0;
73}
74//******************************************************************************
75//******************************************************************************
76void *__get_free_pages(int gfp_mask, unsigned long order)
77{
78 ULONG addr;
79
80 order = (1 << order); //TODO: Is this correct???
81#ifdef KEE
82 SHORT sel;
83
84 if(KernVMAlloc(order*PAGE_SIZE, VMDHA_FIXED|VMDHA_CONTIG,
85 (PVOID*)&addr, (PVOID*)-1, &sel)) {
86#else
87 if(DevVMAlloc(VMDHA_FIXED|VMDHA_CONTIG, order*PAGE_SIZE, (LINEAR)-1, __StackToFlat((ULONG)&addr))) {
88#endif
89 DebugInt3();
90 return 0;
91 }
92//// dprintf(("__get_free_pages %d returned %x", order*PAGE_SIZE, addr));
93 return (void *)addr;
94}
95//******************************************************************************
96//******************************************************************************
97int free_pages(unsigned long addr, unsigned long order)
98{
99#ifdef KEE
100 KernVMFree((PVOID)addr);
101#else
102 DevVMFree((LINEAR)addr);
103#endif
104//// dprintf(("free_pages %x", addr));
105 return 0;
106}
107//******************************************************************************
108//******************************************************************************
109struct page * alloc_pages(int gfp_mask, unsigned long order)
110{
111 DebugInt3();
112 return 0;
113}
114//******************************************************************************
115//******************************************************************************
116int remap_page_range(unsigned long from, unsigned long to, unsigned long size, unsigned long prot)
117{
118 DebugInt3();
119 return 0;
120}
121//******************************************************************************
122//******************************************************************************
123int is_access_ok(int type, void *addr, unsigned long size)
124{
125 return 1;
126}
127//******************************************************************************
128//******************************************************************************
129void __copy_user(void *to, const void *from, unsigned long n)
130{
131 if(to == NULL || from == NULL) {
132 DebugInt3();
133 return;
134 }
135 if(n == 0) return;
136#ifdef KEE
137 memcpy(to, from, n);
138#else
139 _fmemcpy(to, from, n);
140#endif
141}
142//******************************************************************************
143//******************************************************************************
144unsigned long copy_to_user(void *to, const void *from, unsigned long n)
145{
146 if(to == NULL || from == NULL) {
147 DebugInt3();
148 return 0;
149 }
150 if(n == 0) return 0;
151#ifdef KEE
152 memcpy(to, from, n);
153#else
154 _fmemcpy(to, from, n);
155#endif
156 return 0;
157}
158//******************************************************************************
159//******************************************************************************
160void __copy_user_zeroing(void *to, const void *from, unsigned long n)
161{
162 if(to == NULL || from == NULL) {
163 DebugInt3();
164 return;
165 }
166 if(n == 0) return;
167 copy_to_user(to, from, n);
168}
169//******************************************************************************
170//******************************************************************************
171unsigned long copy_from_user(void *to, const void *from, unsigned long n)
172{
173 if(to == NULL || from == NULL) {
174 DebugInt3();
175 return 0;
176 }
177 if(n == 0) return 0;
178#ifdef KEE
179 memcpy(to, from, n);
180#else
181 _fmemcpy(to, from, n);
182#endif
183 return 0;
184}
185//******************************************************************************
186//******************************************************************************
187int get_user(int size, void *dest, void *src)
188{
189 if(size == 0) return 0;
190
191 if(dest == NULL || src == NULL) {
192 DebugInt3();
193 return 0;
194 }
195#ifdef KEE
196 memcpy(dest, src, size);
197#else
198 _fmemcpy(dest, src, size);
199#endif
200 return 0;
201}
202//******************************************************************************
203//******************************************************************************
204int put_user(int x, void *ptr)
205{
206 if(ptr == NULL) {
207 DebugInt3();
208 return 0;
209 }
210
211 *(int *)ptr = x;
212 return 0;
213}
214//******************************************************************************
215//******************************************************************************
216#if 0
217int __put_user(int size, int x, void *ptr)
218{
219#ifdef KEE
220 memcpy(ptr,
221#else
222 _fmemcpy(ptr,
223#endif
224 return 0;
225}
226#endif
227//******************************************************************************
228//******************************************************************************
229void *kmalloc(int size, int flags)
230{
231 char near *addr;
232
233 if(size == 0) {
234 DebugInt3();
235 return NULL;
236 }
237 if(size > 1024) {
238#ifdef KEE
239 SHORT sel;
240
241 if(KernVMAlloc(size+4, VMDHA_FIXED,
242 (PVOID*)&addr, (PVOID*)-1, &sel)) {
243#else
244 if(DevVMAlloc(VMDHA_FIXED, size+4, (LINEAR)-1, __StackToFlat((ULONG)&addr))) {
245#endif
246 DebugInt3();
247 return 0;
248 }
249 *(ULONG *)addr = 0; //flat address
250//// dprintf(("kmalloc %d returned %x", size, addr));
251 return addr+4;
252 }
253 addr = (char near *)CallOSS16(IDC16_MALLOC, size, 0);
254 if(addr == NULL) {
255 DebugInt3();
256 return 0;
257 }
258//// dprintf(("kmalloc %d returned %x", size, addr));
259 return addr+4; //first 4 bytes contain original 16:16 address
260}
261//******************************************************************************
262//******************************************************************************
263void kfree(const void *ptr)
264{
265 ULONG addr;
266
267 addr = (ULONG)ptr;
268 if(addr == NULL) {
269 DebugInt3();
270 return;
271 }
272 addr -= 4; //first 4 bytes contain original 16:16 address or 0 if allocated by VMAlloc
273//// dprintf(("kfree %x", addr));
274 if(*(ULONG near *)addr) {
275 CallOSS16(IDC16_FREE, *(ULONG near *)addr, 0);
276 }
277#ifdef KEE
278 else KernVMFree((PVOID)addr);
279#else
280 else DevVMFree((LINEAR)addr);
281#endif
282}
283//******************************************************************************
284//******************************************************************************
285void kfree_s(const void *ptr, unsigned int size)
286{
287 kfree(ptr);
288}
289//******************************************************************************
290//******************************************************************************
291
292}
Note: See TracBrowser for help on using the repository browser.