brucee@runx.ips.oz (Bruce Evans) (11/16/88)
In kernel/memory.c, the initialization of ram_limit[KMEM_DEV] fails as soon
as the kernel text+data+bss exceeds 64K. A fix is enclosed.
This should have caused /dev/kmem to be empty on my system, but there are
bugs in fs which cause it to read as infinite garbage instead. (Try
"od /dev/kmem".) do_mem() returns 0 for end of file. The problem is in
fs/cache.c/rw_block() which does not report errors directly to its caller.
Returning EOF in do_mem() as for /dev/ram would work better but there are
probably still bugs with the way FS treats this EOF (returning it to
the user instead of converting it to 0). /dev/mem is not infinite. It is
limited to 640K by some test I haven't located.
The diff also includes the elimination of the machine-dependent get_base()
from the kernel. Using get_base() defeats the purpose of having umap().
This was necessary for my 386 port. There was similar dirt in fs/main.c
which was replaced by a call to umap() via the system task.
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: memory.c.cdif
# Wrapped by sys@besplex on Wed Nov 16 03:54:29 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'memory.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'memory.c.cdif'\"
else
echo shar: Extracting \"'memory.c.cdif'\" \(1235 characters\)
sed "s/^X//" >'memory.c.cdif' <<'END_OF_FILE'
X*** /user/sys/kernel/memory.c Thu Oct 6 21:07:43 1988
X--- memory.c Wed Nov 16 02:03:40 1988
X***************
X*** 46,57 ****
X
X int r, caller, proc_nr;
X extern unsigned sizes[8];
X! extern phys_clicks get_base();
X!
X!
X! /* Initialize this task. */
X! ram_origin[KMEM_DEV] = (phys_bytes) get_base() << CLICK_SHIFT;
X! ram_limit[KMEM_DEV] = (sizes[0] + sizes[1]) << CLICK_SHIFT;
X ram_limit[MEM_DEV] = MEM_BYTES;
X
X /* Here is the main loop of the memory task. It waits for a message, carries
X--- 46,57 ----
X
X int r, caller, proc_nr;
X extern unsigned sizes[8];
X! extern phys_bytes umap();
X!
X! /* Initialize this task. */
X! ram_origin[KMEM_DEV] = umap(proc_addr(SYSTASK), D, (vir_bytes) 0,
X! (vir_bytes) 1);
X! ram_limit[KMEM_DEV] = (phys_bytes) (sizes[0] + sizes[1]) << CLICK_SHIFT;
X ram_limit[MEM_DEV] = MEM_BYTES;
X
X /* Here is the main loop of the memory task. It waits for a message, carries
X***************
X*** 93,99 ****
X int device, count, words, status;
X phys_bytes mem_phys, user_phys;
X struct proc *rp;
X- extern phys_clicks get_base();
X extern phys_bytes umap();
X
X /* Get minor device number and check for /dev/null. */
X--- 93,98 ----
END_OF_FILE
if test 1235 -ne `wc -c <'memory.c.cdif'`; then
echo shar: \"'memory.c.cdif'\" unpacked with wrong size!
fi
# end of 'memory.c.cdif'
fi
echo shar: End of shell archive.
exit 0
Bruce Evans
Internet: brucee@runx.ips.oz.au UUCP: uunet!runx.ips.oz.au!brucee