Browse Source

Use the heap functions to allocate a load buffer.

tags/v0.9.3
Michael Brown 19 years ago
parent
commit
301b2d40f0
1 changed files with 44 additions and 43 deletions
  1. 44
    43
      src/arch/i386/core/load_buffer.c

+ 44
- 43
src/arch/i386/core/load_buffer.c View File

@@ -1,8 +1,6 @@
1
-#include "limits.h"
2 1
 #include "io.h"
3
-#include "memsizes.h"
4
-#include "init.h"
5
-#include "buffer.h"
2
+#include "heap.h"
3
+#include "load_buffer.h"
6 4
 
7 5
 /*
8 6
  * Initialise a buffer in an unused portion of memory, to be used for
@@ -10,55 +8,58 @@
10 8
  *
11 9
  */
12 10
 
13
-/* Under KEEP_IT_REAL, always use 07c0:0000 as the buffer.  Otherwise,
14
- * use a reset_fn that finds the largest available block of RAM.
15
- */
16
-struct buffer load_buffer = {
17
-	.start = 0x7c00,
18
-	.end = 0xa0000,
19
-};
11
+#ifdef KEEP_IT_REAL
20 12
 
21
-#ifndef KEEP_IT_REAL
13
+/*
14
+ * Under KEEP_IT_REAL, always use 07c0:0000 as the load buffer.
15
+ *
16
+ */
22 17
 
23
-extern char _text[];
18
+int init_load_buffer ( struct buffer *buffer ) {
19
+	buffer->start = 0x7c00;
20
+	buffer->end = 0xa0000;
21
+	init_buffer ( buffer );
22
+	return 1;
23
+}
24 24
 
25
-static void init_load_buffer ( void ) {
26
-	unsigned int i;
27
-	unsigned long size = 0;
25
+void trim_load_buffer ( struct buffer *buffer ) {
26
+	/* Nothing to do */
27
+}
28 28
 
29
-	load_buffer.start = 0;
30
-	load_buffer.end = 0;
29
+void done_load_buffer ( struct buffer *buffer ) {
30
+	/* Nothing to do */
31
+}
31 32
 
32
-	/* Find the largest usable segment in memory */
33
-	for ( i = 0 ; i < meminfo.map_count ; i++ ) {
34
-		unsigned long r_start, r_end;
33
+#else /* KEEP_IT_REAL */
35 34
 
36
-		if ( meminfo.map[i].type != E820_RAM )
37
-			continue;
35
+/*
36
+ * Without KEEP_IT_REAL, use all remaining heap space as the load buffer.
37
+ *
38
+ */
39
+int init_load_buffer ( struct buffer *buffer ) {
40
+	void *data;
41
+	size_t size;
42
+	
43
+	data = emalloc_all ( &size );
44
+	if ( ! data )
45
+		return 0;
38 46
 
39
-		if ( meminfo.map[i].addr + meminfo.map[i].size > ULONG_MAX )
40
-			continue;
47
+	buffer->start = virt_to_phys ( data );
48
+	buffer->end = buffer->start + size;
49
+	init_buffer ( buffer );
50
+	return 1;
51
+}
41 52
 
42
-		r_start = meminfo.map[i].addr;
43
-		r_end = meminfo.map[i].size;
53
+void trim_load_buffer ( struct buffer *buffer ) {
54
+	void *new_start;
44 55
 
45
-		/* Avoid overlap with Etherboot.  Etherboot will be
46
-		 * located towards the top of a segment, so we need
47
-		 * only consider one-sided truncation.
48
-		 */
49
-		if ( ( r_start <= virt_to_phys ( _text ) ) &&
50
-		     ( virt_to_phys ( _text ) < r_end ) ) {
51
-			r_end = virt_to_phys ( _text );
52
-		}
56
+	/* Shrink buffer */
57
+	new_start = erealloc ( phys_to_virt ( buffer->start ), buffer->fill );
58
+	buffer->start = virt_to_phys ( new_start );
59
+}
53 60
 
54
-		if ( r_end - r_start > size ) {
55
-			size = r_end - r_start;
56
-			load_buffer.start = r_start;
57
-			load_buffer.end = r_end;
58
-		}
59
-	}
61
+void done_load_buffer ( struct buffer *buffer ) {
62
+	efree ( phys_to_virt ( buffer->start ) );
60 63
 }
61 64
 
62
-INIT_FN ( INIT_HEAP, init_load_buffer, init_load_buffer, NULL );
63
-		 
64 65
 #endif

Loading…
Cancel
Save