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;
3637unsigned int seg_all ;
3738unsigned int taskoff ;
3839int maxtasks ;
40+ int pmode ;
3941struct task_struct task_table ;
4042
4143int 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+
5970void process_name (unsigned int off , unsigned int seg )
6071{
6172 int argc , argv , n ;
@@ -100,13 +111,24 @@ static char *segtype[] =
100111void 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)
119141void 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
194221void 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 ;
0 commit comments