Skip to content

Commit 350c616

Browse files
authored
Merge pull request #2763 from ghaerr/pmmeminfo
[kernel,cmds] Show physical memory address in meminfo for PM XMS allocations
2 parents 7bd8445 + 9363f6d commit 350c616

5 files changed

Lines changed: 65 additions & 32 deletions

File tree

elks/arch/i86/mm/malloc.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ static segment_s * seg_split (segment_s * s1, SELEXT_T size0)
7878
if (size2 >= SEG_MIN_SIZE) {
7979

8080
// TODO: use pool_alloc
81-
segment_s * s2 = (segment_s *) heap_alloc (sizeof (segment_s), HEAP_TAG_SEG);
81+
segment_s * s2 = (segment_s *) heap_alloc (sizeof (segment_s),
82+
HEAP_TAG_SEG | HEAP_TAG_CLEAR);
8283
if (!s2)
8384
return 0; // heap_alloc gives heap full message
8485

@@ -287,6 +288,7 @@ void mm_get_usage (struct mem_usage *mu)
287288
{
288289
unsigned int free = 0;
289290
unsigned int used = 0;
291+
unsigned long xmsused = 0;
290292

291293
list_s * n = _seg_all.next;
292294

@@ -296,11 +298,15 @@ void mm_get_usage (struct mem_usage *mu)
296298
/*if (used) printk ("seg %X: size %u used %u count %u\n",
297299
BASE(seg), seg->size, seg->flags, seg->ref_count);*/
298300

299-
if (seg->flags == SEG_FLAG_FREE)
300-
free += seg->size;
301-
else
302-
used += seg->size;
303-
301+
if (seg->addr & 0xFFFF0000) {
302+
if (seg->flags != SEG_FLAG_FREE)
303+
xmsused += seg->size;
304+
} else {
305+
if (seg->flags == SEG_FLAG_FREE)
306+
free += seg->size;
307+
else
308+
used += seg->size;
309+
}
304310
n = seg->all.next;
305311
}
306312

@@ -310,7 +316,7 @@ void mm_get_usage (struct mem_usage *mu)
310316
mu->main_free = ((free + 31) >> 6);
311317
mu->main_used = ((used + 31) >> 6);
312318
#ifdef CONFIG_FS_XMS
313-
mu->xms_used = xms_alloc_ptr - KBYTES(XMS_START_ADDR);
319+
mu->xms_used = xms_alloc_ptr - KBYTES(XMS_START_ADDR) + xmsused;
314320
mu->xms_free = SETUP_XMS_KBYTES - mu->xms_used;
315321
#else
316322
mu->xms_free = 0;
@@ -468,7 +474,8 @@ int seg_verify_area(pid_t pid, seg_t base, segoff_t offset)
468474

469475
void INITPROC seg_add(SELEXT_T start, SELEXT_T end)
470476
{
471-
segment_s * seg = (segment_s *) heap_alloc (sizeof (segment_s), HEAP_TAG_SEG);
477+
segment_s * seg = (segment_s *) heap_alloc (sizeof (segment_s),
478+
HEAP_TAG_SEG | HEAP_TAG_CLEAR);
472479
if(seg) {
473480
BASE(seg) = start;
474481
seg->size = end - start;

elks/include/linuxmt/mm.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,17 @@
1313
#define SELEXT_T segext_t /* RM 16-bit paragraph address or count */
1414
#endif
1515

16-
/* main memory management, also used with XMS memory in PM */
16+
/* main memory management, also used for XMS memory in PM */
1717
struct segment {
1818
list_s all;
1919
list_s free;
2020
seg_t base; /* segment or selector used to access memory */
2121
byte_t flags;
2222
byte_t ref_count;
2323
word_t pid;
24+
selext_t addr; /* mem paragraph address in PM (=0 in real mode kernel) */
25+
/* following variable sized member must be last, or requires meminfo re-compilation */
2426
SELEXT_T size; /* 16- or 32-bit size in paragraphs */
25-
#ifdef CONFIG_286_PMODE
26-
selext_t addr; /* paragraph address of memory (=base in real mode) */
27-
#endif
2827
};
2928

3029
typedef struct segment segment_s;

elks/init/main.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,11 @@ static void INITPROC early_kernel_init(void)
223223

224224
/* create near heap at end of kernel bss */
225225
heap_init(); /* init near memory allocator */
226-
heapofs = setup_arch(); /* sets membase and memend globals */
226+
heapofs = setup_arch(); /* sets membase and memend globals */
227227
heap_add((void *)heapofs, heapsize);
228-
#ifdef CONFIG_286_PMODE
229-
/* force 256K base system ram to force immediate usage of XMS allocations */
230-
memend = 256 << 6; // DEBUG REMOVE
231-
#endif
228+
//memend = 256 << 6; /* force early XMS allocations in PM */
232229
mm_init(membase, memend); /* init far/main memory allocator */
230+
233231
#ifdef CONFIG_BOOTOPTS
234232
struct umbseg *p;
235233
/* now able to add umb memory segments */
@@ -285,8 +283,8 @@ static void INITPROC kernel_init(void)
285283
selext_t xms_start = (XMS_START_ADDR >> 4) + (xms_alloc_ptr << 6);
286284
selext_t xms_end = (XMS_START_ADDR >> 4) + ((addr_t)SETUP_XMS_KBYTES << 6);
287285
seg_add(xms_start, xms_end); /* add remaining XMS memory paragraphs */
288-
printk("mem: xms start %08lx end %08lx total %dK\n",
289-
xms_start << 4, xms_end << 4, (xms_end - xms_start) >> 6);
286+
printk("xms: %luK, start %06lx end %06lx\n",
287+
(xms_end - xms_start) >> 6, xms_start << 4, xms_end << 4);
290288
#endif
291289

292290
seg_t s = init_seg + (((word_t)(void *)__start_fartext_init + 15) >> 4);

elkscmd/sys_utils/meminfo.c

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linuxmt/memory.h>
1717
#include <linuxmt/heap.h>
1818
#include <linuxmt/sched.h>
19+
#include <arch/segment.h>
1920
#include <stdio.h>
2021
#include <stdlib.h>
2122
#include <unistd.h>
@@ -36,6 +37,7 @@ unsigned int heap_all;
3637
unsigned int seg_all;
3738
unsigned int taskoff;
3839
int maxtasks;
40+
int pmode;
3941
struct task_struct task_table;
4042

4143
int memread(word_t off, word_t seg, void *buf, int size)
@@ -56,6 +58,15 @@ word_t getword(word_t off, word_t seg)
5658
return word;
5759
}
5860

61+
addr_t getlong(word_t off, word_t seg)
62+
{
63+
addr_t addr;
64+
65+
if (memread(off, seg, &addr, sizeof(addr)) != sizeof(addr))
66+
return 0;
67+
return addr;
68+
}
69+
5970
void process_name(unsigned int off, unsigned int seg)
6071
{
6172
int argc, argv, n;
@@ -100,13 +111,24 @@ static char *segtype[] =
100111
void display_seg(word_t mem)
101112
{
102113
seg_t segbase = getword(mem + offsetof(segment_s, base), ds);
103-
segext_t segsize = getword(mem + offsetof(segment_s, size), ds);
114+
selext_t segsize = getword(mem + offsetof(segment_s, size), ds);
104115
word_t segflags = getword(mem + offsetof(segment_s, flags), ds) & SEG_FLAG_TYPE;
105116
byte_t ref_count = getword(mem + offsetof(segment_s, ref_count), ds);
106117
struct task_struct *t;
118+
addr_t addr;
119+
unsigned int segsize_hi;
120+
121+
if (pmode) {
122+
addr = getlong(mem + offsetof(segment_s, addr), ds) << 4;
123+
124+
/* handle variable-sized 'size' field in protected mode */
125+
segsize_hi = getword(mem + offsetof(segment_s, size)+2, ds);
126+
segsize += (unsigned long)segsize_hi << 16;
127+
} else
128+
addr = (unsigned long)segbase << 4;
107129

108-
printf(" %04x %s %7ld %4d ",
109-
segbase, segtype[segflags], (long)segsize << 4, ref_count);
130+
printf(" %06lx %04x %s %8lu %4d ",
131+
addr, segbase, segtype[segflags], segsize << 4, ref_count);
110132
if (segflags == SEG_FLAG_CSEG || segflags == SEG_FLAG_DSEG) {
111133
if ((t = find_process(mem)) != NULL) {
112134
process_name(t->t_begstack, t->t_regs.ss);
@@ -119,16 +141,19 @@ void display_seg(word_t mem)
119141
void dump_segs(void)
120142
{
121143
word_t n, mem, arena = 2;
122-
seg_t segbase, oldbase = 0;
144+
addr_t addr, oldaddr = 0; /* paragraph addresses */
123145

124-
printf(" SEG TYPE SIZE CNT NAME\n");
146+
printf(" ADDR SEG TYPE SIZE CNT NAME\n");
125147
n = getword (seg_all + offsetof(list_s, next), ds);
126148
while (n != seg_all) {
127149
mem = n - offsetof(segment_s, all);
128-
segbase = getword(mem + offsetof(segment_s, base), ds);
129-
if (segbase < oldbase)
150+
if (pmode)
151+
addr = getlong(mem + offsetof(segment_s, addr), ds);
152+
else
153+
addr = getword(mem + offsetof(segment_s, base), ds);
154+
if (addr < oldaddr || ((addr & 0x000F0000) && !(oldaddr & 0x000F0000)))
130155
printf("[Arena %d]\n", arena++);
131-
oldbase = segbase;
156+
oldaddr = addr;
132157
display_seg(mem);
133158
printf("\n");
134159

@@ -145,8 +170,8 @@ void dump_heap(void)
145170
{ "free", "MEM ", "DRVR", "TTY ", "TASK", "BUFH", "PIPE", "INOD", "FILE", "CACH"};
146171

147172
/* split into two to save floppy space; linker will combine 2nd with above printf */
148-
printf(" HEAP TYPE SIZE");
149-
printf(" SEG TYPE SIZE CNT NAME\n");
173+
printf(" HEAP TYPE SIZE");
174+
printf(" ADDR SEG TYPE SIZE CNT NAME\n");
150175

151176
word_t n = getword (heap_all + offsetof(list_s, next), ds);
152177
while (n != heap_all) {
@@ -188,7 +213,9 @@ void dump_heap(void)
188213
n = getword(n + offsetof(list_s, next), ds);
189214
}
190215

191-
printf(" Heap/free %5u/%5u Total mem %7ld\n", total_size, total_free, total_segsize);
216+
printf(" Heap %d/%3dK used, %dK free\n", (total_size-total_free+523) >> 10,
217+
(total_size+512) >> 10,
218+
(total_free+512) >> 10);
192219
}
193220

194221
void usage(void)
@@ -244,6 +271,7 @@ int main(int argc, char **argv)
244271
perror("meminfo");
245272
return 1;
246273
}
274+
pmode = (ds == SEL_KDATA);
247275
if (memread(taskoff, ds, &task_table, sizeof(task_table)) != sizeof(task_table)) {
248276
perror("taskinfo");
249277
}
@@ -255,8 +283,9 @@ int main(int argc, char **argv)
255283
/* note MEM_GETUSAGE amounts are floors, so total may display less by 1k than actual*/
256284
printf(" Main %d/%dK used, %dK free, ",
257285
mu.main_used, mu.main_used + mu.main_free, mu.main_free);
258-
printf("XMS %d/%dK used, %dK free\n",
286+
printf("XMS %d/%dK used, %dK free, ",
259287
mu.xms_used, mu.xms_used + mu.xms_free, mu.xms_free);
288+
printf("Total %dK\n", mu.main_used + mu.main_free + mu.xms_used + mu.xms_free);
260289
}
261290

262291
return 0;

ibmpc-pmode.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ CONFIG_FS_NR_XMS_BUFFERS=500
7474
# Executable file formats
7575
#
7676
CONFIG_EXEC_COMPRESS=y
77-
# CONFIG_EXEC_OS2 is not set
77+
CONFIG_EXEC_OS2=y
7878
CONFIG_EXEC_MMODEL=y
7979

8080
#

0 commit comments

Comments
 (0)