Patchwork linux-user: improved fake /proc/self/stat

login
register
mail settings
Submitter Fabio Erculiani
Date Jan. 3, 2012, 7:25 a.m.
Message ID <CAN3AtvrWf4bRmzDJzkUZo+2rkEb6ZnKKGGdD4QR2q5bqFvT05A@mail.gmail.com>
Download mbox | patch
Permalink /patch/133985/
State New
Headers show

Comments

Fabio Erculiani - Jan. 3, 2012, 7:25 a.m.
Hi all,
this is a patch on top of "[PATCH 4/5] linux-user: fake
/proc/self/stat" (sorry I couldn't find the git repo bound to this
patchwork) that also implements PID and binary name reading them from
the fake TSS.
The pid was just a "why not" while the binary name is required (as
well as the backets in order to make `ps` not segfault, because it
expects to find "(binary name)" on the second spot.

The only doubt I have is about printing ts->ts_tid which is a pid_t,
which is a signed int, so perhaps int would be enough.


--
Fabio Erculiani
Alexander Graf - Jan. 3, 2012, 2:26 p.m.
Subject should have [PATCH] in the beginning. Why don't you just create the patch using git-format-patch? It makes sure the format is correct. You can also check out http://wiki.qemu.org/Contribute/SubmitAPatch for some hints.

And thanks a lot for fixing this!

On 03.01.2012, at 08:25, Fabio Erculiani wrote:

> Hi all,
> this is a patch on top of "[PATCH 4/5] linux-user: fake
> /proc/self/stat" (sorry I couldn't find the git repo bound to this
> patchwork) that also implements PID and binary name reading them from
> the fake TSS.
> The pid was just a "why not" while the binary name is required (as
> well as the backets in order to make `ps` not segfault, because it
> expects to find "(binary name)" on the second spot.
> 
> The only doubt I have is about printing ts->ts_tid which is a pid_t,
> which is a signed int, so perhaps int would be enough.

Signed-off-by line is missing :).

> 
> --- qemu-1.0.orig/linux-user/syscall.c
> +++ qemu-1.0/linux-user/syscall.c
> @@ -4678,11 +4678,23 @@ static int open_self_stat(void *cpu_env,
>       int len;
>       uint64_t val = 0;
> 
> -      if (i == 27) {
> +      if (i == 0) {
> +          /* pid */
> +          snprintf(buf, sizeof(buf), "%jd ", (intmax_t) ts->ts_tid);

Is it the TID or the PID? If it's get PID, this should be getpid(). Also why not simply use uint64_t and PRId64 like below?

> +      }
> +      else if (i == 1) {

Braces are incorrect. Please run scripts/checkpatch.pl on your patch :).

> +          /* app name */
> +          snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->filename);

I would assume this is argv[0] and not the filename, so if I read the code correctly this should be ts->bprm->>argv[0], right?

> +      }
> +      else if (i == 27) {

Braces again :)

>           /* stack bottom */
>           val = start_stack;
> +          snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
> +      }
> +      else {

Braces


Alex

> +          /* for the rest, write zeros */
> +          snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' ');
>       }
> -      snprintf(buf, sizeof(buf), "%"PRId64 "%c", val, i == 43 ? '\n' : ' ');
>       len = strlen(buf);
>       if (write(fd, buf, len) != len) {
>           return -1;
> 
> --
> Fabio Erculiani
Fabio Erculiani - Jan. 3, 2012, 3:31 p.m.
On Tue, Jan 3, 2012 at 3:26 PM, Alexander Graf <agraf@suse.de> wrote:
> Subject should have [PATCH] in the beginning. Why don't you just create the patch using git-format-patch? It makes sure the format is correct. You can also check out http://wiki.qemu.org/Contribute/SubmitAPatch for some hints.
>
> And thanks a lot for fixing this!

whoops, yeah this is my first contribution to qemu ;)

>
> On 03.01.2012, at 08:25, Fabio Erculiani wrote:
>
>> Hi all,
>> this is a patch on top of "[PATCH 4/5] linux-user: fake
>> /proc/self/stat" (sorry I couldn't find the git repo bound to this
>> patchwork) that also implements PID and binary name reading them from
>> the fake TSS.
>> The pid was just a "why not" while the binary name is required (as
>> well as the backets in order to make `ps` not segfault, because it
>> expects to find "(binary name)" on the second spot.
>>
>> The only doubt I have is about printing ts->ts_tid which is a pid_t,
>> which is a signed int, so perhaps int would be enough.
>
> Signed-off-by line is missing :).
>
>>
>> --- qemu-1.0.orig/linux-user/syscall.c
>> +++ qemu-1.0/linux-user/syscall.c
>> @@ -4678,11 +4678,23 @@ static int open_self_stat(void *cpu_env,
>>       int len;
>>       uint64_t val = 0;
>>
>> -      if (i == 27) {
>> +      if (i == 0) {
>> +          /* pid */
>> +          snprintf(buf, sizeof(buf), "%jd ", (intmax_t) ts->ts_tid);
>
> Is it the TID or the PID? If it's get PID, this should be getpid(). Also why not simply use uint64_t and PRId64 like below?

ts_tid contains the pid afaik. But ok, will use getpid() directly.

>
>> +      }
>> +      else if (i == 1) {
>
> Braces are incorrect. Please run scripts/checkpatch.pl on your patch :).

Ok, thanks, will validate using checkpatch.pl.

>
>> +          /* app name */
>> +          snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->filename);
>
> I would assume this is argv[0] and not the filename, so if I read the code correctly this should be ts->bprm->>argv[0], right?

whoops :) Yes.

>
>> +      }
>> +      else if (i == 27) {
>
> Braces again :)
>
>>           /* stack bottom */
>>           val = start_stack;
>> +          snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
>> +      }
>> +      else {
>
> Braces
>
>
> Alex
>
>> +          /* for the rest, write zeros */
>> +          snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' ');
>>       }
>> -      snprintf(buf, sizeof(buf), "%"PRId64 "%c", val, i == 43 ? '\n' : ' ');
>>       len = strlen(buf);
>>       if (write(fd, buf, len) != len) {
>>           return -1;
>>
>> --
>> Fabio Erculiani
>

Patch

--- qemu-1.0.orig/linux-user/syscall.c
+++ qemu-1.0/linux-user/syscall.c
@@ -4678,11 +4678,23 @@  static int open_self_stat(void *cpu_env,
       int len;
       uint64_t val = 0;

-      if (i == 27) {
+      if (i == 0) {
+          /* pid */
+          snprintf(buf, sizeof(buf), "%jd ", (intmax_t) ts->ts_tid);
+      }
+      else if (i == 1) {
+          /* app name */
+          snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->filename);
+      }
+      else if (i == 27) {
           /* stack bottom */
           val = start_stack;
+          snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
+      }
+      else {
+          /* for the rest, write zeros */
+          snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' ');
       }
-      snprintf(buf, sizeof(buf), "%"PRId64 "%c", val, i == 43 ? '\n' : ' ');
       len = strlen(buf);
       if (write(fd, buf, len) != len) {
           return -1;