[BACK]Return to machdep.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / i386 / i386

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/arch/i386/i386/machdep.c between version 1.586 and 1.586.2.2

version 1.586, 2006/11/16 01:32:38 version 1.586.2.2, 2007/02/07 12:53:10
Line 240  int i386_has_sse2;
Line 240  int i386_has_sse2;
 int     tmx86_has_longrun;  int     tmx86_has_longrun;
   
 vaddr_t msgbuf_vaddr;  vaddr_t msgbuf_vaddr;
 paddr_t msgbuf_paddr;  struct {
           paddr_t paddr;
           psize_t sz;
   } msgbuf_p_seg[VM_PHYSSEG_MAX];
   unsigned int msgbuf_p_cnt = 0;
   
 vaddr_t idt_vaddr;  vaddr_t idt_vaddr;
 paddr_t idt_paddr;  paddr_t idt_paddr;
Line 396  native_loader(int bl_boothowto, int bl_b
Line 400  native_loader(int bl_boothowto, int bl_b
 void  void
 cpu_startup()  cpu_startup()
 {  {
         int x;          int x, y;
         vaddr_t minaddr, maxaddr;          vaddr_t minaddr, maxaddr;
           psize_t sz;
         char pbuf[9];          char pbuf[9];
   
         /*          /*
          * Initialize error message buffer (et end of core).           * Initialize error message buffer (et end of core).
          */           */
         msgbuf_vaddr = uvm_km_alloc(kernel_map, x86_round_page(MSGBUFSIZE), 0,          if (msgbuf_p_cnt == 0)
             UVM_KMF_VAONLY);                  panic("msgbuf paddr map has not been set up");
           for (x = 0, sz = 0; x < msgbuf_p_cnt; sz += msgbuf_p_seg[x++].sz)
                   continue;
           msgbuf_vaddr = uvm_km_alloc(kernel_map, sz, 0, UVM_KMF_VAONLY);
         if (msgbuf_vaddr == 0)          if (msgbuf_vaddr == 0)
                 panic("failed to valloc msgbuf_vaddr");                  panic("failed to valloc msgbuf_vaddr");
   
         /* msgbuf_paddr was init'd in pmap */          /* msgbuf_paddr was init'd in pmap */
         for (x = 0; x < btoc(MSGBUFSIZE); x++)          for (y = 0, sz = 0; y < msgbuf_p_cnt; y++) {
                 pmap_kenter_pa((vaddr_t)msgbuf_vaddr + x * PAGE_SIZE,                  for (x = 0; x < btoc(msgbuf_p_seg[y].sz); x++, sz += PAGE_SIZE)
                     msgbuf_paddr + x * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE);                          pmap_kenter_pa((vaddr_t)msgbuf_vaddr + sz,
                               msgbuf_p_seg[y].paddr + x * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE);
           }
         pmap_update(pmap_kernel());          pmap_update(pmap_kernel());
   
         initmsgbuf((caddr_t)msgbuf_vaddr, round_page(MSGBUFSIZE));          initmsgbuf((caddr_t)msgbuf_vaddr, sz);
   
         printf("%s%s", copyright, version);          printf("%s%s", copyright, version);
   
Line 1813  init386(paddr_t first_avail)
Line 1823  init386(paddr_t first_avail)
                 psize_t sz = round_page(MSGBUFSIZE);                  psize_t sz = round_page(MSGBUFSIZE);
                 psize_t reqsz = sz;                  psize_t reqsz = sz;
   
           search_again:
                 for (x = 0; x < vm_nphysseg; x++) {                  for (x = 0; x < vm_nphysseg; x++) {
                         vps = &vm_physmem[x];                          vps = &vm_physmem[x];
                         if (ptoa(vps->avail_end) == avail_end)                          if (ptoa(vps->avail_end) == avail_end)
Line 1827  init386(paddr_t first_avail)
Line 1838  init386(paddr_t first_avail)
   
                 vps->avail_end -= atop(sz);                  vps->avail_end -= atop(sz);
                 vps->end -= atop(sz);                  vps->end -= atop(sz);
                 msgbuf_paddr = ptoa(vps->avail_end);                  msgbuf_p_seg[msgbuf_p_cnt].sz = sz;
                   msgbuf_p_seg[msgbuf_p_cnt++].paddr = ptoa(vps->avail_end);
   
                 /* Remove the last segment if it now has no pages. */                  /* Remove the last segment if it now has no pages. */
                 if (vps->start == vps->end) {                  if (vps->start == vps->end) {
Line 1841  init386(paddr_t first_avail)
Line 1853  init386(paddr_t first_avail)
                                 avail_end = vm_physmem[x].avail_end;                                  avail_end = vm_physmem[x].avail_end;
                 avail_end = ptoa(avail_end);                  avail_end = ptoa(avail_end);
   
                   if (sz != reqsz) {
                           reqsz -= sz;
                           if (msgbuf_p_cnt != VM_PHYSSEG_MAX) {
                   /* if still segments available, get memory from next one ... */
                                   sz = reqsz;
                                   goto search_again;
                           }
                 /* Warn if the message buffer had to be shrunk. */                  /* Warn if the message buffer had to be shrunk. */
                 if (sz != reqsz)  
                         printf("WARNING: %ld bytes not available for msgbuf "                          printf("WARNING: %ld bytes not available for msgbuf "
                             "in last cluster (%ld used)\n", reqsz, sz);                                 "in last cluster (%ld used)\n", (long)MSGBUFSIZE, MSGBUFSIZE - reqsz);
                   }
         }          }
   
         /*          /*

Legend:
Removed from v.1.586  
changed lines
  Added in v.1.586.2.2

CVSweb <webmaster@jp.NetBSD.org>