]> Zhao Yanbai Git Server - minix.git/commitdiff
kernel: facility for user-visible memory
authorBen Gras <ben@minix3.org>
Wed, 18 Jul 2012 16:53:20 +0000 (18:53 +0200)
committerBen Gras <ben@minix3.org>
Sat, 28 Jul 2012 20:57:38 +0000 (20:57 +0000)
. map all objects named usermapped_*.o with globally visible
  pages; usermapped_glo_*.o with the VM 'global' bit on, i.e.
  permanently in tlb (very scarce resource!)
. added kinfo, machine, kmessages and loadinfo for a start
. modified log, tty to make use of the shared messages struct

25 files changed:
drivers/log/diag.c
drivers/tty/console.c
include/minix/com.h
include/minix/ipc.h
include/minix/ipcconst.h
include/minix/param.h
include/minix/syslib.h
include/minix/type.h
kernel/Makefile
kernel/arch/i386/arch_system.c
kernel/arch/i386/kernel.lds
kernel/arch/i386/memory.c
kernel/arch/i386/pre_init.c
kernel/glo.h
kernel/proc.c
kernel/proto.h
kernel/system/do_getinfo.c
kernel/usermapped_data.c [new file with mode: 0644]
lib/libc/arch/i386/sys-minix/_ipc.S
lib/libc/sys-minix/Makefile.inc
lib/libc/sys-minix/init.c [new file with mode: 0644]
lib/libminc/Makefile
servers/is/dmp_kernel.c
servers/vm/arch/i386/pagetable.c
servers/vm/pagefaults.c

index c9de053343403e16f5141e5dbf3116f9e722e1f6..ac7841ba4e9ebec89c3e3bdeb7879ef035678043 100644 (file)
@@ -9,23 +9,24 @@
 
 #include "log.h"
 
+#include <assert.h>
+
+extern struct minix_kerninfo *_minix_kerninfo;
+
 /*==========================================================================*
  *                             do_new_kmess                                *
  *==========================================================================*/
 void do_new_kmess(void)
 {
 /* Notification for a new kernel message. */
-  static struct kmessages kmess;               /* entire kmess structure */
+  static struct kmessages *kmess;              /* entire kmess structure */
   static char print_buf[_KMESS_BUF_SIZE];      /* copy new message here */
   int bytes;
   int i, r;
   static int prev_next = 0;
 
-  /* Try to get a fresh copy of the buffer with kernel messages. */
-  if ((r=sys_getkmessages(&kmess)) != OK) {
-       printf("log: couldn't get copy of kmessages: %d\n", r);
-       return;
-  }
+  assert(_minix_kerninfo);
+  kmess = _minix_kerninfo->kmessages;
 
   /* Print only the new part. Determine how many new bytes there are with 
    * help of the current and previous 'next' index. Note that the kernel
@@ -33,13 +34,13 @@ void do_new_kmess(void)
    * are new data; else we miss % KMESS_BUF_SIZE here.  
    * Check for size being positive, the buffer might as well be emptied!
    */
-  if (kmess.km_size > 0) {
-      bytes = ((kmess.km_next + _KMESS_BUF_SIZE) - prev_next) %
+  if (kmess->km_size > 0) {
+      bytes = ((kmess->km_next + _KMESS_BUF_SIZE) - prev_next) %
        _KMESS_BUF_SIZE;
       r= prev_next;                            /* start at previous old */ 
       i=0;
       while (bytes > 0) {                      
-          print_buf[i] = kmess.km_buf[(r%_KMESS_BUF_SIZE)];
+          print_buf[i] = kmess->km_buf[(r%_KMESS_BUF_SIZE)];
           bytes --;
           r ++;
           i ++;
@@ -52,5 +53,5 @@ void do_new_kmess(void)
   /* Almost done, store 'next' so that we can determine what part of the
    * kernel messages buffer to print next time a notification arrives.
    */
-  prev_next = kmess.km_next;
+  prev_next = kmess->km_next;
 }
index 023c9449f81cb4036f67b69cb81182c4371e9293..6ec7fb4ebf1c96efd0e674e7c50748c22a6b36f6 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <minix/drivers.h>
 #include <termios.h>
+#include <assert.h>
 #include <sys/ioctl.h>
 #include <sys/vm.h>
 #include <sys/video.h>
@@ -1007,29 +1008,21 @@ tty_t *tp;
   cons_ioctl(tp, 0);
 }
 
+extern struct minix_kerninfo *_minix_kerninfo;
+
 /*===========================================================================*
  *                             do_new_kmess                                 *
  *===========================================================================*/
 void do_new_kmess()
 {
 /* Notification for a new kernel message. */
-  static struct kmessages kmess;               /* kmessages structure */
+  struct kmessages *kmess_ptr;         /* kmessages structure */
   static int prev_next = 0;                    /* previous next seen */
   int bytes;
   int r;
 
-  /* Try to get a fresh copy of the buffer with kernel messages. */
-#if DEAD_CODE  
-  /* During shutdown, the reply is garbled because new notifications arrive
-   * while the system task makes a copy of the kernel messages buffer.
-   * Hence, don't check the return value. 
-   */
-  if ((r=sys_getkmessages(&kmess)) != OK) {
-       printf("TTY: couldn't get copy of kmessages: %d, 0x%x\n", r,r);
-       return;
-  }
-#endif
-  sys_getkmessages(&kmess);
+  assert(_minix_kerninfo);
+  kmess_ptr = _minix_kerninfo->kmessages;
 
   /* Print only the new part. Determine how many new bytes there are with 
    * help of the current and previous 'next' index. Note that the kernel
@@ -1037,11 +1030,11 @@ void do_new_kmess()
    * is new data; else we miss % _KMESS_BUF_SIZE here.  
    * Check for size being positive, the buffer might as well be emptied!
    */
-  if (kmess.km_size > 0) {
-      bytes = ((kmess.km_next + _KMESS_BUF_SIZE) - prev_next) % _KMESS_BUF_SIZE;
+  if (kmess_ptr->km_size > 0) {
+      bytes = ((kmess_ptr->km_next + _KMESS_BUF_SIZE) - prev_next) % _KMESS_BUF_SIZE;
       r=prev_next;                             /* start at previous old */ 
       while (bytes > 0) {                      
-          cons_putk( kmess.km_buf[(r%_KMESS_BUF_SIZE)] );
+          cons_putk( kmess_ptr->km_buf[(r%_KMESS_BUF_SIZE)] );
           bytes --;
           r ++;
       }
@@ -1051,7 +1044,7 @@ void do_new_kmess()
   /* Almost done, store 'next' so that we can determine what part of the
    * kernel messages buffer to print next time a notification arrives.
    */
-  prev_next = kmess.km_next;
+  prev_next = kmess_ptr->km_next;
 }
 
 /*===========================================================================*
index d0f091fa681a7b80285ea8a19e2880ff23cdea73..2e99f10682564bb067a5206ddb266094aeb7910c 100644 (file)
 #   define GET_MONPARAMS   4   /* get monitor parameters */
 #   define GET_KENV       5    /* get kernel environment string */
 #   define GET_IRQHOOKS           6    /* get the IRQ table */
-#   define GET_KMESSAGES   7   /* get kernel messages */
 #   define GET_PRIVTAB    8    /* get kernel privileges table */
 #   define GET_KADDRESSES  9   /* get various kernel addresses */
 #   define GET_SCHEDINFO  10   /* get scheduling queues */
 #define SVMCTL_MAP_PHYS_LEN    m2_l2
 
 #define VMMF_UNCACHED          (1L << 0)
+#define VMMF_USER              (1L << 1)
+#define VMMF_WRITE             (1L << 2)
+#define VMMF_GLO               (1L << 3)
 
 /* Values for SVMCTL_PARAM. */
 #define VMCTL_CLEAR_PAGEFAULT  12
index c2ab471124cd9838163108f88e33a97b3a1dce76..e07cdefb39f2bf42d5ed0789190ddb7d31c4dff4 100644 (file)
@@ -168,6 +168,7 @@ int receive(endpoint_t src, message *m_ptr, int *status_ptr);
 int send(endpoint_t dest, message *m_ptr);
 int sendnb(endpoint_t dest, message *m_ptr);
 int senda(asynmsg_t *table, size_t count);
+int _minix_kernel_info_struct(struct minix_kerninfo **);
 
 int _do_kernel_call(message *m_ptr);
 
index acbd7ab1214b5b19609c26f4f5d81219d876ec5b..8dfddd93aa23185a2003c60f57c0f109051eecc5 100644 (file)
@@ -7,6 +7,7 @@
 #define SENDREC                   3    /* SEND + RECEIVE */
 #define NOTIFY            4    /* asynchronous notify */
 #define SENDNB             5    /* nonblocking send */
+#define MINIX_KERNINFO     6    /* request kernel info structure */
 #define SENDA             16   /* asynchronous send */
 #define IPCNO_HIGHEST  SENDA
 
index b4abbfc9c7bab8f0c6f2b2d42fe0eb8b9b97a424..9e48218e78b6700f32a9640a18a26de50250f19a 100644 (file)
@@ -27,7 +27,7 @@ typedef struct kinfo {
         char                    param_buf[MULTIBOOT_PARAM_BUF_SIZE];
 
         /* Minix stuff */
-        struct kmessages *kmess;
+        struct kmessages *kmessages;
         int do_serial_debug;    /* system serial output */
         int serial_debug_baud;  /* serial baud rate */
         int minix_panicing;     /* are we panicing? */
index 141201ac8566f0be43f340c1c9d711b4ca669fcb..8aaf287153e5cac1dbf296051909501891e84e91 100644 (file)
@@ -168,7 +168,6 @@ int sys_umap_remote(endpoint_t proc_ep, endpoint_t grantee, int seg,
        vir_bytes vir_addr, vir_bytes bytes, phys_bytes *phys_addr);
 
 /* Shorthands for sys_getinfo() system call. */
-#define sys_getkmessages(dst)  sys_getinfo(GET_KMESSAGES, dst, 0,0,0)
 #define sys_getkinfo(dst)      sys_getinfo(GET_KINFO, dst, 0,0,0)
 #define sys_getloadinfo(dst)   sys_getinfo(GET_LOADINFO, dst, 0,0,0)
 #define sys_getmachine(dst)    sys_getinfo(GET_MACHINE, dst, 0,0,0)
index c8ee62b26c33f8923a6ae031c6aa41a302a6d1df..0f3a27ac85ed8350b2a6f4443749079e8783f667 100644 (file)
@@ -170,5 +170,23 @@ struct k_randomness {
   } bin[RANDOM_SOURCES];
 };
 
+struct minix_kerninfo {
+       /* Binaries will depend on the offsets etc. in this
+        * structure, so it can't be changed willy-nilly. In
+        * other words, it is ABI-restricted.
+        */
+#define KERNINFO_MAGIC 0xfc3b84bf
+       u32_t kerninfo_magic;
+       u32_t minix_feature_flags;
+       u32_t flags_unused1;
+       u32_t flags_unused2;
+       u32_t flags_unused3;
+       u32_t flags_unused4;
+       struct kinfo            *kinfo;
+       struct machine          *machine;
+       struct kmessages        *kmessages;
+       struct loadinfo         *loadinfo;
+} __packed;
+
 #endif /* _TYPE_H */
 
index 5801310e613a7271f2d1df5228391a35bb384b0d..d385c26d4acf5c6e3a199ea69aa25d8bc66926f7 100644 (file)
@@ -6,7 +6,7 @@ PROG=   kernel
 .include "arch/${MACHINE_ARCH}/Makefile.inc"
 
 SRCS+= clock.c cpulocals.c interrupt.c main.c proc.c system.c \
-       table.c utility.c 
+       table.c utility.c usermapped_data.c
 
 LINKERSCRIPT=${.CURDIR}/arch/${MACHINE_ARCH}/kernel.lds
 
index fd706dd212197df80e25af27fbaaf4de34d7eade..6dd62d2e9a6dc07abd9baaa0653441c6183b86d0 100644 (file)
@@ -182,6 +182,11 @@ void arch_proc_reset(struct proc *pr)
        pr->p_reg.ds = USER_DS_SELECTOR;
 }
 
+void arch_set_secondary_ipc_return(struct proc *p, u32_t val)
+{
+       p->p_reg.bx = val;
+}
+
 int restore_fpu(struct proc *pr)
 {
        int failed;
index 98a543d1f379f33de8bcd6bbef3ba1c3e6f4d644..0474841288e0ac778545ad6225db74930d84d9d0 100644 (file)
@@ -21,8 +21,14 @@ SECTIONS
 
        . += _kern_offset;
 
+       . = ALIGN(4096); usermapped_start = .;
+       .usermapped_glo : AT(ADDR(.usermapped_glo) - _kern_offset) { usermapped_glo*.o }
+       . = ALIGN(4096); usermapped_nonglo_start = .;
+       .usermapped : AT(ADDR(.usermapped) - _kern_offset) { usermapped_*.o }
+       . = ALIGN(4096); usermapped_end = .;
        .text             : AT(ADDR(.text) - _kern_offset) { *(.text*) }
        .data ALIGN(4096) : AT(ADDR(.data) - _kern_offset) { *(.data .rodata* ) }
+       . = ALIGN(4096);
        .bss ALIGN(4096)  : AT(ADDR(.bss) - _kern_offset) { *(.bss* COMMON)
                __k_unpaged__kern_size = . - _kern_vir_base;
                _kern_size = __k_unpaged__kern_size;
index f4033c4f0c3086837ce127ff41bbfe56ea71af85..78bdb26a7936c12cb697ee84ae628fba5da38402 100644 (file)
@@ -757,10 +757,14 @@ static int oxpcie_mapping_index = -1,
        lapic_mapping_index = -1,
        ioapic_first_index = -1,
        ioapic_last_index = -1,
-       video_mem_mapping_index = -1;
+       video_mem_mapping_index = -1,
+       usermapped_glo_index = -1,
+       usermapped_index = -1, first_um_idx = -1;
 
 extern char *video_mem;
 
+extern char usermapped_start, usermapped_end, usermapped_nonglo_start;
+
 int arch_phys_map(const int index,
                        phys_bytes *addr,
                        phys_bytes *len,
@@ -769,9 +773,19 @@ int arch_phys_map(const int index,
        static int first = 1;
        int freeidx = 0;
        static char *ser_var = NULL;
+       u32_t glo_len = (u32_t) &usermapped_nonglo_start -
+                       (u32_t) &usermapped_start;
 
        if(first) {
                video_mem_mapping_index = freeidx++;
+               if(glo_len > 0) {
+                       usermapped_glo_index = freeidx++;
+               }
+               
+               usermapped_index = freeidx++;
+               first_um_idx = usermapped_index;
+               if(usermapped_glo_index != -1)
+                       first_um_idx = usermapped_glo_index;
 
 #ifdef USE_APIC
                if(lapic_addr)
@@ -798,21 +812,34 @@ int arch_phys_map(const int index,
                first = 0;
        }
 
-#ifdef USE_APIC
-       if (index == video_mem_mapping_index) {
+       if(index == usermapped_glo_index) {
+               *addr = vir2phys(&usermapped_start);
+               *len = glo_len;
+               *flags = VMMF_USER | VMMF_GLO;
+               return OK;
+       }
+       else if(index == usermapped_index) {
+               *addr = vir2phys(&usermapped_nonglo_start);
+               *len = (u32_t) &usermapped_end -
+                       (u32_t) &usermapped_nonglo_start;
+               *flags = VMMF_USER;
+               return OK;
+       }
+       else if (index == video_mem_mapping_index) {
                /* map video memory in so we can print panic messages */
                *addr = MULTIBOOT_VIDEO_BUFFER;
                *len = I386_PAGE_SIZE;
-               *flags = 0;
+               *flags = VMMF_WRITE;
                return OK;
        }
+#ifdef USE_APIC
        else if (index == lapic_mapping_index) {
                /* map the local APIC if enabled */
                if (!lapic_addr)
                        return EINVAL;
                *addr = lapic_addr;
                *len = 4 << 10 /* 4kB */;
-               *flags = VMMF_UNCACHED;
+               *flags = VMMF_UNCACHED | VMMF_WRITE;
                return OK;
        }
        else if (ioapic_enabled && index >= ioapic_first_index && index <= ioapic_last_index) {
@@ -820,7 +847,7 @@ int arch_phys_map(const int index,
                *addr = io_apic[ioapic_idx].paddr;
                assert(*addr);
                *len = 4 << 10 /* 4kB */;
-               *flags = VMMF_UNCACHED;
+               *flags = VMMF_UNCACHED | VMMF_WRITE;
                printf("ioapic map: addr 0x%lx\n", *addr);
                return OK;
        }
@@ -830,7 +857,7 @@ int arch_phys_map(const int index,
        if(index == oxpcie_mapping_index) {
                *addr = strtoul(ser_var+2, NULL, 16);
                *len = 0x4000;
-               *flags = VMMF_UNCACHED;
+               *flags = VMMF_UNCACHED | VMMF_WRITE;
                return OK;
        }
 #endif
@@ -860,6 +887,31 @@ int arch_phys_map_reply(const int index, const vir_bytes addr)
                return OK;
        }
 #endif
+       if(index == first_um_idx) {
+               u32_t usermapped_offset;
+               assert(addr > (u32_t) &usermapped_start);
+               usermapped_offset = addr - (u32_t) &usermapped_start;
+               memset(&minix_kerninfo, 0, sizeof(minix_kerninfo));
+#define FIXEDPTR(ptr) (void *) ((u32_t)ptr + usermapped_offset)
+#define FIXPTR(ptr) ptr = FIXEDPTR(ptr)
+#define ASSIGN(minixstruct) minix_kerninfo.minixstruct = FIXEDPTR(&minixstruct)
+               ASSIGN(kinfo);
+               ASSIGN(machine);
+               ASSIGN(kmessages);
+               ASSIGN(loadinfo);
+
+               /* adjust the pointers of the functions and the struct
+                * itself to the user-accessible mapping
+                */
+               minix_kerninfo.kerninfo_magic = KERNINFO_MAGIC;
+               minix_kerninfo.minix_feature_flags = minix_feature_flags;
+               minix_kerninfo_user = (vir_bytes) FIXEDPTR(&minix_kerninfo);
+
+               return OK;
+       }
+
+       if(index == usermapped_index) return OK;
+
        if (index == video_mem_mapping_index) {
                video_mem_vaddr =  addr;
                return OK;
index 6dcb7763edccfefec2b87afa875b5896a10ceb06..d776ea202040057ea13c6fe9b829b6d12b458554 100644 (file)
@@ -26,7 +26,7 @@
 
 /* to-be-built kinfo struct, diagnostics buffer */
 kinfo_t kinfo;
-struct kmessages kmess;
+struct kmessages kmessages;
 
 /* pg_utils.c uses this; in this phase, there is a 1:1 mapping. */
 phys_bytes vir2phys(void *addr) { return (phys_bytes) addr; } 
index 52471c819b38b2861d763b6eff0bd5b660d6479b..8664a0d1b71cb18fd330df23e78fb39f1068a7b0 100644 (file)
 #include "debug.h"
 
 /* Kernel information structures. This groups vital kernel information. */
-EXTERN struct kinfo kinfo;             /* kernel information for users */
-EXTERN struct machine machine;         /* machine information for users */
-EXTERN struct kmessages kmess;         /* diagnostic messages in kernel */
-EXTERN struct k_randomness krandom;    /* gather kernel random information */
-EXTERN struct loadinfo kloadinfo;      /* status of load average */
+extern struct kinfo kinfo;               /* kernel information for users */
+extern struct machine machine;           /* machine information for users */
+extern struct kmessages kmessages;       /* diagnostic messages in kernel */
+extern struct loadinfo loadinfo;         /* status of load average */
+extern struct minix_kerninfo minix_kerninfo;
+
+EXTERN struct k_randomness krandom;    /* gather kernel random information */
+
+vir_bytes minix_kerninfo_user;
+
+#define kmess kmessages
+#define kloadinfo loadinfo
 
 /* Process scheduling information and the kernel reentry count. */
 EXTERN struct proc *vmrequest;  /* first process on vmrequest queue */
index 98bab162e7702898c31fb6ea346355e4a217f695..e89c6ffa868baa64501667d40abc0dc74c4488d1 100644 (file)
@@ -608,6 +608,16 @@ int do_ipc(reg_t r1, reg_t r2, reg_t r3)
                return EDOM;
            return mini_senda(caller_ptr, (asynmsg_t *) r3, msg_size);
        }
+       case MINIX_KERNINFO:
+       {
+               /* It might not be initialized yet. */
+               if(!minix_kerninfo_user) {
+                       return EBADCALL;
+               }
+
+               arch_set_secondary_ipc_return(caller_ptr, minix_kerninfo_user);
+               return OK;
+       }
        default:
        return EBADCALL;                /* illegal system call */
   }
index 0159fbf7184d39ae15f6672f24dd3e2a2215de70..68f2000eb16fbfd30c47798fa3e143a1253739e8 100644 (file)
@@ -150,6 +150,7 @@ void stop_profile_clock(void);
 /* functions defined in architecture-dependent files. */
 void prot_init();
 void arch_post_init();
+void arch_set_secondary_ipc_return(struct proc *, u32_t val);
 phys_bytes phys_copy(phys_bytes source, phys_bytes dest, phys_bytes
        count);
 void phys_copy_fault(void);
index bf87be9c09747381c5f132450078e51c5079a2c0..19ab73c147ebbc4ddc69190692a0a1572ba381b9 100644 (file)
@@ -167,11 +167,6 @@ int do_getinfo(struct proc * caller, message * m_ptr)
 
        break;
     }
-    case GET_KMESSAGES: {
-        length = sizeof(struct kmessages);
-        src_vir = (vir_bytes) &kmess;
-        break;
-    }
     case GET_IRQACTIDS: {
         length = sizeof(irq_actids);
         src_vir = (vir_bytes) irq_actids;
diff --git a/kernel/usermapped_data.c b/kernel/usermapped_data.c
new file mode 100644 (file)
index 0000000..d95a085
--- /dev/null
@@ -0,0 +1,11 @@
+#include "kernel.h"
+
+/* This is the user-visible struct that has pointers to other bits of data. */
+struct minix_kerninfo minix_kerninfo;
+
+/* Kernel information structures. */
+struct kinfo kinfo;               /* kernel information for users */
+struct machine machine;           /* machine information for users */
+struct kmessages kmessages;       /* diagnostic messages in kernel */
+struct loadinfo loadinfo;        /* status of load average */
+
index 5d5d778116a8d20ade28c054e360cc00c4a5848d..9bfa326f3266f46f6fbc4031bb3e2bddce8a679d 100644 (file)
@@ -50,6 +50,20 @@ ENTRY(_sendrec)
        pop     %ebp
        ret
 
+ENTRY(_minix_kernel_info_struct)
+       push    %ebp
+       movl    %esp, %ebp
+       push    %ebx
+       movl    $0, %eax
+       movl    $0, %ebx
+       movl    $MINIX_KERNINFO, %ecx
+       int     $IPCVEC /* trap to the kernel */
+       movl    8(%ebp), %ecx   /* ecx = return struct ptr */
+       movl    %ebx, (%ecx)
+       pop     %ebx
+       pop     %ebp
+       ret
+
 ENTRY(_notify)
        push    %ebp
        movl    %esp, %ebp
index 317eef5c7eaf2a973702eb7d1f5b91251f471441..6f520970190db3ecb8e07b427777f66c8ea0d591 100644 (file)
@@ -16,7 +16,7 @@ SRCS+=        accept.c access.c bind.c brk.c sbrk.c m_closefrom.c getsid.c \
        vectorio.c shutdown.c sigaction.c sigpending.c sigreturn.c sigsuspend.c\
        sigprocmask.c socket.c socketpair.c stat.c statvfs.c symlink.c \
        sync.c syscall.c sysuname.c truncate.c umask.c unlink.c write.c \
-       _exit.c _ucontext.c environ.c __getcwd.c vfork.c sizeup.c
+       _exit.c _ucontext.c environ.c __getcwd.c vfork.c sizeup.c init.c
 
 # Minix specific syscalls.
 SRCS+= cprofile.c lseek64.c sprofile.c _mcontext.c
diff --git a/lib/libc/sys-minix/init.c b/lib/libc/sys-minix/init.c
new file mode 100644 (file)
index 0000000..7b21078
--- /dev/null
@@ -0,0 +1,16 @@
+
+#include <stdio.h>
+#include <minix/ipc.h>
+
+struct minix_kerninfo *_minix_kerninfo = NULL;
+
+void    __minix_init(void) __attribute__((__constructor__, __used__));
+
+void __minix_init(void)
+{
+       if((_minix_kernel_info_struct(&_minix_kerninfo)) != 0
+         || _minix_kerninfo->kerninfo_magic != KERNINFO_MAGIC) {
+               _minix_kerninfo = NULL;
+       }
+}
+
index e93e76577ec49fa219c0f01bc80a0e57e1105550..21d84275fd81020266c153ed3dbbefb610272d19 100644 (file)
@@ -131,7 +131,7 @@ CPPFLAGS.${i}+= -I${LIBCSRCDIR}/include -I${LIBCSRCDIR}/locale
        link.c _mcontext.c mknod.c mmap.c nanosleep.c open.c \
        read.c sbrk.c select.c setuid.c sigprocmask.c stat.c \
        stime.c syscall.c _ucontext.c umask.c unlink.c waitpid.c \
-       brksize.S _ipc.S _senda.S ucontext.S mmap.c
+       brksize.S _ipc.S _senda.S ucontext.S mmap.c init.c
 .PATH.c: ${LIBCSRCDIR}/sys-minix
 .PATH.S: ${LIBCSRCDIR}/arch/${MACHINE}/sys-minix
 SRCS+= ${i}
index 36f1116f52b53fab174df355ba99b35616fdf69e..e6ee1791f3049701ccd45ccfad0dd4762ff039d2 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "inc.h"
 #include <timers.h>
+#include <assert.h>
 #include <machine/interrupt.h>
 #include <minix/endpoint.h>
 #include <minix/sysutil.h>
@@ -54,32 +55,33 @@ struct proc proc[NR_TASKS + NR_PROCS];
 struct priv priv[NR_SYS_PROCS];
 struct boot_image image[NR_BOOT_PROCS];
 
+extern struct minix_kerninfo *_minix_kerninfo;
+
 /*===========================================================================*
  *                             kmessages_dmp                                *
  *===========================================================================*/
 void kmessages_dmp()
 {
-  struct kmessages kmess;              /* get copy of kernel messages */
+  struct kmessages *kmess;             /* get copy of kernel messages */
   char print_buf[_KMESS_BUF_SIZE+1];   /* this one is used to print */
   int start;                           /* calculate start of messages */
   int r;
+  int size;
 
-  /* Try to get a copy of the kernel messages. */
-  if ((r = sys_getkmessages(&kmess)) != OK) {
-      printf("IS: warning: couldn't get copy of kmessages: %d\n", r);
-      return;
-  }
+  assert(_minix_kerninfo);
+  kmess = _minix_kerninfo->kmessages;
 
   /* Try to print the kernel messages. First determine start and copy the
    * buffer into a print-buffer. This is done because the messages in the
    * copy may wrap (the kernel buffer is circular).
    */
-  start = ((kmess.km_next + _KMESS_BUF_SIZE) - kmess.km_size) % _KMESS_BUF_SIZE;
+  start = ((kmess->km_next + _KMESS_BUF_SIZE) - kmess->km_size) % _KMESS_BUF_SIZE;
   r = 0;
-  while (kmess.km_size > 0) {
-       print_buf[r] = kmess.km_buf[(start+r) % _KMESS_BUF_SIZE];
+  size = kmess->km_size;
+  while (size > 0) {
+       print_buf[r] = kmess->km_buf[(start+r) % _KMESS_BUF_SIZE];
        r ++;
-       kmess.km_size --;
+       size--;
   }
   print_buf[r] = 0;            /* make sure it terminates */
   printf("Dump of all messages generated by the kernel.\n\n"); 
index 00fc0e50aebd68c27f56e840a52a81714a47ce56..6831ec3c2278a1861ad1f4f84a9ddc068ee82481 100644 (file)
@@ -936,9 +936,15 @@ void pt_init(void)
                        kern_mappings[index].flags = flags;
                        kern_mappings[index].vir_addr = offset;
                        kern_mappings[index].flags =
-                               I386_VM_PRESENT | I386_VM_USER | I386_VM_WRITE;
+                               I386_VM_PRESENT;
                        if(flags & VMMF_UNCACHED)
                                kern_mappings[index].flags |= PTF_NOCACHE;
+                       if(flags & VMMF_USER)
+                               kern_mappings[index].flags |= I386_VM_USER;
+                       if(flags & VMMF_WRITE)
+                               kern_mappings[index].flags |= I386_VM_WRITE;
+                       if(flags & VMMF_GLO)
+                               kern_mappings[index].flags |= I386_VM_GLOBAL;
                        if(addr % I386_PAGE_SIZE)
                                panic("VM: addr unaligned: %d", addr);
                        if(len % I386_PAGE_SIZE)
index 6b2f0ebab30da7ad6e95e5f0e6edcc478ec67e77..ed789fca19b32d4ba634edbe3fc9081e81a64ff9 100644 (file)
@@ -71,9 +71,14 @@ void do_pagefaults(message *m)
 
        /* See if address is valid at all. */
        if(!(region = map_lookup(vmp, addr))) {
-               assert(PFERR_NOPAGE(err));
-               printf("VM: pagefault: SIGSEGV %d bad addr 0x%x; %s\n",
+               if(PFERR_PROT(err))  {
+                       printf("VM: pagefault: SIGSEGV %d protected addr 0x%x; %s\n",
                                ep, addr, pf_errstr(err));
+               } else {
+                       assert(PFERR_NOPAGE(err));
+                       printf("VM: pagefault: SIGSEGV %d bad addr 0x%x; %s\n",
+                                       ep, addr, pf_errstr(err));
+               }
                if((s=sys_kill(vmp->vm_endpoint, SIGSEGV)) != OK)
                        panic("sys_kill failed: %d", s);
                if((s=sys_vmctl(ep, VMCTL_CLEAR_PAGEFAULT, 0 /*unused*/)) != OK)