All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mario Smarduch <cms063@email.mot.com>
To: linux-ia64@vger.kernel.org
Subject: [Linux-ia64] Re: Fixing /proc/kcore
Date: Mon, 28 Oct 2002 16:14:30 +0000	[thread overview]
Message-ID: <marc-linux-ia64-105590709805276@msgid-missing> (raw)
In-Reply-To: <marc-linux-ia64-105590709805249@msgid-missing>

Tony, Andi thanks!

- mario

Andi Kleen wrote:

> "Luck, Tony" <tony.luck@intel.com> writes:
>
> > This message is in MIME format. Since your mail reader does not understand
> > this format, some or all of this message may not be legible.
> >
> > ------_=_NextPart_000_01C27C4E.CD496DB0
> > Content-Type: text/plain;
> >       charset="utf-7"
> >
> > /proc/kcore is what you need, but it is broken on ia64 (and
> > has been since the dawn of time for access to region 5) because
> > it assumes that all kernel virtual addresses are above PAGE_OFFSET.
> > This isn't true on ia64, VMALLOC_START is smaller than PAGE_OFFSET.
>
> I recently fixed a similar problem on x86-64. There the modules are outside
> the vmalloc area, but also not in the direct mapping. I just changed
> the module mapping and the kernel mapping to put themselves into the vmlist.
> kcore checks vmlist first and then afterwards tries direct addresses.
>
> Also the kernel addresses are negative, which needed some more changes
> in seek.
>
> Here is the 2.4.19 patch which should to 2.5 too.
>
> I think it's a bit cleaner than yours and will probably help you too.
> Just put everything special into vmlist too.
>
> -Andi
>
> Index: linux/fs/proc/inode.c
> =================================> RCS file: /home/cvs/Repository/linux/fs/proc/inode.c,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -u -r1.4 -r1.5
> --- linux/fs/proc/inode.c       2002/01/15 10:09:21     1.4
> --- linux/fs/proc/inode.c       2002/10/17 13:02:13     1.5
> @@ -186,6 +184-,7 @@
>         s->s_blocksize_bits = 10;
>         s->s_magic = PROC_SUPER_MAGIC;
>         s->s_op = &proc_sops;
>         s->s_maxbytes = +AH4-0ULL;
>
>         root_inode = proc_get_inode(s, PROC_ROOT_INO, &proc_root);
>         if (!root_inode)
> Index: linux/fs/proc/kcore.c
> =================================> RCS file: /home/cvs/Repository/linux/fs/proc/kcore.c,v
> retrieving revision 1.3
> retrieving revision 1.4
> diff -u -u -r1.3 -r1.4
> --- linux/fs/proc/kcore.c       2002/03/21 11:54:59     1.3
> --- linux/fs/proc/kcore.c       2002/10/17 13:02:13     1.4
> @@ -27,11 ,14 @@
>         return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
>  }
>
> +statiQ- loff_t lseek_kcore(struct file * file, loff_t offset, int origin);
>
>  static ssize_t read_kcore(struct file *, char *, size_t, loff_t *);
>
>  struct file_operations proc_kcore_operations = {
>         read:           read_kcore,
>         open:           open_kcore,
>         lseek:          lseek_kcore,
>  };
>
>  #ifdef CONFIG_KCORE_AOUT
> @@ -112,9 +114-,9 @@
>
>  extern char saved_command_line[];
>
> -static size_t get_kcore_size(int *num_vma, size_t *elf_buflen)
> +statiQ- unsigned long get_kcore_size(int *num_vma, size_t *elf_buflen)
>  {
> -       size_t try, size;
>         unsigned long try, size;
>         struct vm_struct *m;
>
>         *num_vma = 0;
> @@ -125,7 +128-,7 @@
>         }
>
>         for (m=vmlist; m; m=m->next) {
> -               try = (size_t)m->addr  m->size;
>                 try = (unsigned long)m->addr  m->size;
>                 if (try > size)
>                         size = try;
>                 *num_vma = *num_vma  1;
> @@ -313,14 +314-,14 @@
>  static ssize_t read_kcore(struct file *file, char *buffer, size_t buflen, loff_t *fpos)
>  {
>         ssize_t acc = 0;
> -       size_t size, tsz;
>         unsigned long size, tsz;
>         size_t elf_buflen;
>         int num_vma;
>         unsigned long start;
>
>         read_lock(&vmlist_lock);
>         proc_root_kcore->size = size = get_kcore_size(&num_vma, &elf_buflen);
> -       if (buflen = 0 || *fpos >= size) {
>         if (buflen = 0 || (unsigned long long)*fpos >= size) {
>                 read_unlock(&vmlist_lock);
>                 return 0;
>         }
> @@ -390,9 +390-,16 @@
>         start = PAGE_OFFSET  (*fpos - elf_buflen);
>         if ((tsz = (PAGE_SIZE - (start & +AH4-PAGE_MASK))) > buflen)
>                 tsz = buflen;
> -
>         while (buflen) {
> -               if ((start >= VMALLOC_START) && (start < VMALLOC_END)) {
>                 int err;
>
>                 if ((start > PAGE_OFFSET) && (start < (unsigned long)high_memory)) {
>                         if (kern_addr_valid(start)) {
>                                 err = copy_to_user(buffer, (char *)start, tsz);
>                         } else {
>                                 err = clear_user(buffer, tsz);
>                         }
>                 } else {
>                         char * elf_buf;
>                         struct vm_struct *m;
>                         unsigned long curstart = start;
> @@ -432,24 +440-,11 @@
>                                         (char *)vmstart, vmsize);
>                         }
>                         read_unlock(&vmlist_lock);
> -                       if (copy_to_user(buffer, elf_buf, tsz)) {
> -                               kfree(elf_buf);
> -                               return -EFAULT;
> -                       }
>                         err = copy_to_user(buffer, elf_buf, tsz);
>                         kfree(elf_buf);
> -               } else if ((start > PAGE_OFFSET) && (start <
> -                                               (unsigned long)high_memory)) {
> -                       if (kern_addr_valid(start)) {
> -                               if (copy_to_user(buffer, (char *)start, tsz))
> -                                       return -EFAULT;
> -                       } else {
> -                               if (clear_user(buffer, tsz))
> -                                       return -EFAULT;
> -                       }
> -               } else {
> -                       if (clear_user(buffer, tsz))
> -                               return -EFAULT;
> -               }
>                 }
>                 if (err)
>                         return -EFAULT;
>                 buflen -= tsz;
>                 *fpos = tsz;
>                 buffer = tsz;
> @@ -461,3 +458-,19 @@
>         return acc;
>  }
>  #endif /* CONFIG_KCORE_AOUT */
>
> +statiQ- loff_t lseek_kcore(struct file * file, loff_t offset, int origin)
> {
>         long long retval;
>
>         switch (origin) {
>                 case 2:
>                         offset = file->f_dentry->d_inode->i_size;
>                         break;
>                 case 1:
>                         offset = file->f_pos;
>         }
>         /* RED-PEN user can fake an error here by setting offset to >=-4095 && <0  */
>         file->f_pos = offset;
>         return offset;
> }



  reply	other threads:[~2002-10-28 16:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-25 18:00 [Linux-ia64] Re: Fixing /proc/kcore Andi Kleen
2002-10-28 16:14 ` Mario Smarduch [this message]
2002-10-28 19:03 ` [Linux-ia64] " Luck, Tony
2002-10-28 19:10 ` [Linux-ia64] " Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=marc-linux-ia64-105590709805276@msgid-missing \
    --to=cms063@email.mot.com \
    --cc=linux-ia64@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.