9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] Inferno: starting a process in a stopped state
@ 2024-07-22  8:21 Edouard Klein
  2024-07-24 19:52 ` ron minnich
  0 siblings, 1 reply; 5+ messages in thread
From: Edouard Klein @ 2024-07-22  8:21 UTC (permalink / raw)
  To: 9fans

Hi !

I'm writing dis assembly, and I would like to debug my program right
from the entrypoint.

I intend to use the /prog filesystem for that, thanks to which one can
stop a program by echoing "stop" to dbgctl file.

However, what I need to do is stop the program at the very start.

I have multiple ideas, such as introducing a sleep or a read that would
let me enough time to stop the program, but they have the bad property
of modifying the program.

I could create a loader program that would exec the target program and
stop the loader right before the exec, and I suspect (but I'm not sure)
that would let me stop the target program.

But these all sound very rube goldbergy to me.

Is there a way to start a program in a stopped state that I have
overlooked ?

Thanks in advance,

Cheers,

Edouard.

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/T4297f451b18d599a-Md3642db0bae45288d5553df6
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [9fans] Inferno: starting a process in a stopped state
  2024-07-22  8:21 [9fans] Inferno: starting a process in a stopped state Edouard Klein
@ 2024-07-24 19:52 ` ron minnich
  2024-08-03 14:03   ` Edouard Klein
  0 siblings, 1 reply; 5+ messages in thread
From: ron minnich @ 2024-07-24 19:52 UTC (permalink / raw)
  To: 9fans

[-- Attachment #1: Type: text/plain, Size: 1277 bytes --]

I put a
1:jump 1
At the start, when I need to do this and have no other way.



On Mon, Jul 22, 2024 at 01:28 Edouard Klein <edou@rdklein.fr> wrote:

> Hi !
> 
> I'm writing dis assembly, and I would like to debug my program right
> from the entrypoint.
> 
> I intend to use the /prog filesystem for that, thanks to which one can
> stop a program by echoing "stop" to dbgctl file.
> 
> However, what I need to do is stop the program at the very start.
> 
> I have multiple ideas, such as introducing a sleep or a read that would
> let me enough time to stop the program, but they have the bad property
> of modifying the program.
> 
> I could create a loader program that would exec the target program and
> stop the loader right before the exec, and I suspect (but I'm not sure)
> that would let me stop the target program.
> 
> But these all sound very rube goldbergy to me.
> 
> Is there a way to start a program in a stopped state that I have
> overlooked ?
> 
> Thanks in advance,
> 
> Cheers,
> 
> Edouard.

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/T4297f451b18d599a-Mb91c323511c37b5d7da47a39
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

[-- Attachment #2: Type: text/html, Size: 2670 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [9fans] Inferno: starting a process in a stopped state
  2024-07-24 19:52 ` ron minnich
@ 2024-08-03 14:03   ` Edouard Klein
  2024-08-04 13:37     ` Edouard Klein
  0 siblings, 1 reply; 5+ messages in thread
From: Edouard Klein @ 2024-08-03 14:03 UTC (permalink / raw)
  To: 9fans

Thanks Ron :)

In DIS assembly, this is written as jmp $0, which can be changed to jmp
$1 when I want to disable the loop and spare myself from decreasing all
PC offsets in the code.


Now, I have another problem: /prog/N/dbgctl can't be written to :/


Here is how to reproduce:

Save the file below as hello.s
asm hello.s  # Assemble it
hello&  # Run it
bind '#p' /prog  # Mount /prog
ps  # Get the pid, assume e.g. 33
echo stop > /prog/33/dbgctl

This yields
sh: cannot open /prog/33/dbgctl: permission denied

instead of stopping the program.

But I can still kill it with
echo kill > /prog/33/ctl
sh: 33 "Command":killed

I have no idea what's wrong. The dbgctl has mode --rw-r--r-- so I should
be able to write to it.

devprog.c has this snippet


        case Qdbgctl:
                if(SECURE || p->group->flags&Pprivatemem || omode != ORDWR)
                        error(Eperm);

Which seems to indicate that the simple > redirection may fail because
it would only by an open in write mode.

Is there a way, with Inferno's sh, to open a file in RW and get a file
descriptor (kinda like bash's exec N<> fname) ?

Is the problem stemming from something else ?

Any ideas, no matter how far fetched or off the cuff, would be welcome
as I'm banging my head against the wall, and the wall is starting to
suffer.

Thanks in advance,

Cheers,

Edouard



------------hello.s--------------
#0
    jmp     $1
        load    0(mp),$0,12(mp)  # Loads "$Sys" into @mp+12, loading the link descriptors at $0
                                 # ???: why 12 in @mp+12
                                 # ???: where is $0 ?
        frame   $1,44(fp)        # Stores in @fp+44 (44 bytes after the current frame pointer)
                                 # a pointer to a new stack frame to local-call to function of type $1
                                 # ???: Why +44 ?
        movp    4(mp),32(44(fp)) # 32 after said new frame, store a pointer to @mp+4, the string to print
                                 # ???: Why 32 ?
        lea     40(fp),16(44(fp))    # Stores the address of @fp+40 in 16 after said new frame
                                 # ???: Why 40 ? Maybe because type $2 is 40 bytes long
                                 # ???: Why 16 ?
        mcall   44(fp),$0,12(mp) # Call, in module @mp+12 ($Sys), the first function in linkage record array $0, in frame @fp+44
        ret                          # Return
        entry   0, 2             # Entrypoint is at the beginning of the instruction stream (offset 0)
                                     # The function type of this entry point is $2 (offset 2)
        desc    $0,16,"f0"       # Type $0 is 16 bytes ==  4 words long, all pointers
        desc    $1,40,"0080"     # Type $1 is 40 bytes == 10 words long, the ninth is a pointer
        desc    $2,48,"00c0"     # Type $2 is 48 bytes == 12 words long, the ninth and tenth are pointers
        var     @mp,16               # Define the module pointer, of length 16
        string  @mp+0,"$Sys"     # The name of the module to load
        string  @mp+4,"hello world and more\n"  # The string to print
        module  Command          # The module name
        link    2,0,0x4244b354,"init" # The doc is wrong, its desc, pointer, ... not pointer, desc...
                                 # it is the list of exported symbols for the module.
        ldts    @ldt,1           # This look like the imported symbols from $Sys
        word    @ldt+0,1
        ext     @ldt+4,0xac849033,"print"
        source  "/tmp/quatorze/hello.b"



ron minnich <rminnich@gmail.com> writes:

> I put a
> 1:jump 1
> At the start, when I need to do this and have no other way.
> 
> On Mon, Jul 22, 2024 at 01:28 Edouard Klein <edou@rdklein.fr> wrote:
> 
> Hi !
> 
> I'm writing dis assembly, and I would like to debug my program right
> from the entrypoint.
> 
> I intend to use the /prog filesystem for that, thanks to which one can
> stop a program by echoing "stop" to dbgctl file.
> 
> However, what I need to do is stop the program at the very start.
> 
> I have multiple ideas, such as introducing a sleep or a read that would
> let me enough time to stop the program, but they have the bad property
> of modifying the program.
> 
> I could create a loader program that would exec the target program and
> stop the loader right before the exec, and I suspect (but I'm not sure)
> that would let me stop the target program.
> 
> But these all sound very rube goldbergy to me.
> 
> Is there a way to start a program in a stopped state that I have
> overlooked ?
> 
> Thanks in advance,
> 
> Cheers,
> 
> Edouard.
> 
> 9fans / 9fans / see discussions + participants + delivery options Permalink

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/T4297f451b18d599a-M67ba8d91ab92ee064844712b
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [9fans] Inferno: starting a process in a stopped state
  2024-08-03 14:03   ` Edouard Klein
@ 2024-08-04 13:37     ` Edouard Klein
  2024-08-04 14:26       ` Edouard Klein
  0 siblings, 1 reply; 5+ messages in thread
From: Edouard Klein @ 2024-08-04 13:37 UTC (permalink / raw)
  To: Edouard Klein; +Cc: 9fans

For the sake of people stumbling on this post a long time from now:

I solved my immediate problem by running:

echo stop <>/prog/33/dbgctl

The <> redirection opens the file for reading and writing, not just for
writing, and solves the "permission denied" issue.

However, Inferno's sh(1) man pages mentions

       A file descriptor may be redirected to an already  open  descriptor  by
       writing  >[fd0=fd1] or <[fd0=fd1].  Fd1 is a previously opened file de‐
       scriptor and fd0 becomes a new copy (in the sense of sys-dup(2)) of it.

But I see no hint on how to actually open a file and get a file
descriptor.

It seems that there is a way to call limbo from sh, so maybe the open
system call can be called from sh, but I haven't discovered the syntax
yet.

Anyway, if anybody knows, I'll be glad to know too, in the meantime, my
current hurdle is cleared so off I go.

Cheers,

Edouard.

Edouard Klein <edou@rdklein.fr> writes:

> Thanks Ron :)
>
> In DIS assembly, this is written as jmp $0, which can be changed to jmp
> $1 when I want to disable the loop and spare myself from decreasing all
> PC offsets in the code.
>
>
> Now, I have another problem: /prog/N/dbgctl can't be written to :/
>
>
> Here is how to reproduce:
>
> Save the file below as hello.s
> asm hello.s  # Assemble it
> hello&  # Run it
> bind '#p' /prog  # Mount /prog
> ps  # Get the pid, assume e.g. 33
> echo stop > /prog/33/dbgctl
>
> This yields
> sh: cannot open /prog/33/dbgctl: permission denied
>
> instead of stopping the program.
>
> But I can still kill it with
> echo kill > /prog/33/ctl
> sh: 33 "Command":killed
>
> I have no idea what's wrong. The dbgctl has mode --rw-r--r-- so I should
> be able to write to it.
>
> devprog.c has this snippet
>
>
>       case Qdbgctl:
>               if(SECURE || p->group->flags&Pprivatemem || omode != ORDWR)
>                       error(Eperm);
>
> Which seems to indicate that the simple > redirection may fail because
> it would only by an open in write mode.
>
> Is there a way, with Inferno's sh, to open a file in RW and get a file
> descriptor (kinda like bash's exec N<> fname) ?
>
> Is the problem stemming from something else ?
>
> Any ideas, no matter how far fetched or off the cuff, would be welcome
> as I'm banging my head against the wall, and the wall is starting to
> suffer.
>
> Thanks in advance,
>
> Cheers,
>
> Edouard
>
>
>
> ------------hello.s--------------
> #0
>     jmp     $1
>       load    0(mp),$0,12(mp)  # Loads "$Sys" into @mp+12, loading the link descriptors at $0
>                                # ???: why 12 in @mp+12
>                                # ???: where is $0 ?
>       frame   $1,44(fp)        # Stores in @fp+44 (44 bytes after the current frame pointer)
>                                # a pointer to a new stack frame to local-call to function of type $1
>                                # ???: Why +44 ?
>       movp    4(mp),32(44(fp)) # 32 after said new frame, store a pointer to @mp+4, the string to print
>                                # ???: Why 32 ?
>       lea     40(fp),16(44(fp))    # Stores the address of @fp+40 in 16 after said new frame
>                                # ???: Why 40 ? Maybe because type $2 is 40 bytes long
>                                # ???: Why 16 ?
>       mcall   44(fp),$0,12(mp) # Call, in module @mp+12 ($Sys), the first function in linkage record array $0, in frame @fp+44
>       ret                          # Return
>       entry   0, 2             # Entrypoint is at the beginning of the instruction stream (offset 0)
>                                    # The function type of this entry point is $2 (offset 2)
>       desc    $0,16,"f0"       # Type $0 is 16 bytes ==  4 words long, all pointers
>       desc    $1,40,"0080"     # Type $1 is 40 bytes == 10 words long, the ninth is a pointer
>       desc    $2,48,"00c0"     # Type $2 is 48 bytes == 12 words long, the ninth and tenth are pointers
>       var     @mp,16               # Define the module pointer, of length 16
>       string  @mp+0,"$Sys"     # The name of the module to load
>       string  @mp+4,"hello world and more\n"  # The string to print
>       module  Command          # The module name
>       link    2,0,0x4244b354,"init" # The doc is wrong, its desc, pointer, ... not pointer, desc...
>                                # it is the list of exported symbols for the module.
>       ldts    @ldt,1           # This look like the imported symbols from $Sys
>       word    @ldt+0,1
>       ext     @ldt+4,0xac849033,"print"
>       source  "/tmp/quatorze/hello.b"
>
>
>
> ron minnich <rminnich@gmail.com> writes:
>
>> I put a
>> 1:jump 1
>> At the start, when I need to do this and have no other way.
>> 
>> On Mon, Jul 22, 2024 at 01:28 Edouard Klein <edou@rdklein.fr> wrote:
>> 
>> Hi !
>> 
>> I'm writing dis assembly, and I would like to debug my program right
>> from the entrypoint.
>> 
>> I intend to use the /prog filesystem for that, thanks to which one can
>> stop a program by echoing "stop" to dbgctl file.
>> 
>> However, what I need to do is stop the program at the very start.
>> 
>> I have multiple ideas, such as introducing a sleep or a read that would
>> let me enough time to stop the program, but they have the bad property
>> of modifying the program.
>> 
>> I could create a loader program that would exec the target program and
>> stop the loader right before the exec, and I suspect (but I'm not sure)
>> that would let me stop the target program.
>> 
>> But these all sound very rube goldbergy to me.
>> 
>> Is there a way to start a program in a stopped state that I have
>> overlooked ?
>> 
>> Thanks in advance,
>> 
>> Cheers,
>> 
>> Edouard.
>> 
>> 9fans / 9fans / see discussions + participants + delivery options Permalink

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/T4297f451b18d599a-M798e4b1249a2536aa222a53b
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [9fans] Inferno: starting a process in a stopped state
  2024-08-04 13:37     ` Edouard Klein
@ 2024-08-04 14:26       ` Edouard Klein
  0 siblings, 0 replies; 5+ messages in thread
From: Edouard Klein @ 2024-08-04 14:26 UTC (permalink / raw)
  To: 9fans

OK, my echo stop <>/prog/33/dbgctl was wrong.

It opens /prog/33/dbgctl for writing and reading, but only reads from
it, output still goes to the standard output.

Here what I came up with next:

echo stop <>[5]/prog/4/dbgctl >[1=5]

This opens /prog/4/dbgctl RW on FD 5, and then redirects the standard
output to FD5.

I tried it on a text file, it works in redirecting the output.

However, the process is not stopped when I write to its dbgctl file.

It continues happily eating CPU cycles jumping to itself, its
/prog/N/status still shows "ready", and reading /prog/N/stack yields

cat: error reading /prog/4/stack: thread must be stopped

I'll try again tomorrow but would appreciate any help or hints.

Edouard Klein <edou@rdklein.fr> writes:

> For the sake of people stumbling on this post a long time from now:
>
> I solved my immediate problem by running:
>
> echo stop <>/prog/33/dbgctl
>
> The <> redirection opens the file for reading and writing, not just for
> writing, and solves the "permission denied" issue.
>
> However, Inferno's sh(1) man pages mentions
>
>        A file descriptor may be redirected to an already  open  descriptor  by
>        writing  >[fd0=fd1] or <[fd0=fd1].  Fd1 is a previously opened file de‐
>        scriptor and fd0 becomes a new copy (in the sense of sys-dup(2)) of it.
>
> But I see no hint on how to actually open a file and get a file
> descriptor.
>
> It seems that there is a way to call limbo from sh, so maybe the open
> system call can be called from sh, but I haven't discovered the syntax
> yet.
>
> Anyway, if anybody knows, I'll be glad to know too, in the meantime, my
> current hurdle is cleared so off I go.
>
> Cheers,
>
> Edouard.
>
> Edouard Klein <edou@rdklein.fr> writes:
>
>> Thanks Ron :)
>>
>> In DIS assembly, this is written as jmp $0, which can be changed to jmp
>> $1 when I want to disable the loop and spare myself from decreasing all
>> PC offsets in the code.
>>
>>
>> Now, I have another problem: /prog/N/dbgctl can't be written to :/
>>
>>
>> Here is how to reproduce:
>>
>> Save the file below as hello.s
>> asm hello.s  # Assemble it
>> hello&  # Run it
>> bind '#p' /prog  # Mount /prog
>> ps  # Get the pid, assume e.g. 33
>> echo stop > /prog/33/dbgctl
>>
>> This yields
>> sh: cannot open /prog/33/dbgctl: permission denied
>>
>> instead of stopping the program.
>>
>> But I can still kill it with
>> echo kill > /prog/33/ctl
>> sh: 33 "Command":killed
>>
>> I have no idea what's wrong. The dbgctl has mode --rw-r--r-- so I should
>> be able to write to it.
>>
>> devprog.c has this snippet
>>
>>
>>      case Qdbgctl:
>>              if(SECURE || p->group->flags&Pprivatemem || omode != ORDWR)
>>                      error(Eperm);
>>
>> Which seems to indicate that the simple > redirection may fail because
>> it would only by an open in write mode.
>>
>> Is there a way, with Inferno's sh, to open a file in RW and get a file
>> descriptor (kinda like bash's exec N<> fname) ?
>>
>> Is the problem stemming from something else ?
>>
>> Any ideas, no matter how far fetched or off the cuff, would be welcome
>> as I'm banging my head against the wall, and the wall is starting to
>> suffer.
>>
>> Thanks in advance,
>>
>> Cheers,
>>
>> Edouard
>>
>>
>>
>> ------------hello.s--------------
>> #0
>>     jmp     $1
>>      load    0(mp),$0,12(mp)  # Loads "$Sys" into @mp+12, loading the link descriptors at $0
>>                               # ???: why 12 in @mp+12
>>                               # ???: where is $0 ?
>>      frame   $1,44(fp)        # Stores in @fp+44 (44 bytes after the current frame pointer)
>>                               # a pointer to a new stack frame to local-call to function of type $1
>>                               # ???: Why +44 ?
>>      movp    4(mp),32(44(fp)) # 32 after said new frame, store a pointer to @mp+4, the string to print
>>                               # ???: Why 32 ?
>>      lea     40(fp),16(44(fp))    # Stores the address of @fp+40 in 16 after said new frame
>>                               # ???: Why 40 ? Maybe because type $2 is 40 bytes long
>>                               # ???: Why 16 ?
>>      mcall   44(fp),$0,12(mp) # Call, in module @mp+12 ($Sys), the first function in linkage record array $0, in frame @fp+44
>>      ret                          # Return
>>      entry   0, 2             # Entrypoint is at the beginning of the instruction stream (offset 0)
>>                                   # The function type of this entry point is $2 (offset 2)
>>      desc    $0,16,"f0"       # Type $0 is 16 bytes ==  4 words long, all pointers
>>      desc    $1,40,"0080"     # Type $1 is 40 bytes == 10 words long, the ninth is a pointer
>>      desc    $2,48,"00c0"     # Type $2 is 48 bytes == 12 words long, the ninth and tenth are pointers
>>      var     @mp,16               # Define the module pointer, of length 16
>>      string  @mp+0,"$Sys"     # The name of the module to load
>>      string  @mp+4,"hello world and more\n"  # The string to print
>>      module  Command          # The module name
>>      link    2,0,0x4244b354,"init" # The doc is wrong, its desc, pointer, ... not pointer, desc...
>>                               # it is the list of exported symbols for the module.
>>      ldts    @ldt,1           # This look like the imported symbols from $Sys
>>      word    @ldt+0,1
>>      ext     @ldt+4,0xac849033,"print"
>>      source  "/tmp/quatorze/hello.b"
>>
>>
>>
>> ron minnich <rminnich@gmail.com> writes:
>>
>>> I put a
>>> 1:jump 1
>>> At the start, when I need to do this and have no other way.
>>> 
>>> On Mon, Jul 22, 2024 at 01:28 Edouard Klein <edou@rdklein.fr> wrote:
>>> 
>>> Hi !
>>> 
>>> I'm writing dis assembly, and I would like to debug my program right
>>> from the entrypoint.
>>> 
>>> I intend to use the /prog filesystem for that, thanks to which one can
>>> stop a program by echoing "stop" to dbgctl file.
>>> 
>>> However, what I need to do is stop the program at the very start.
>>> 
>>> I have multiple ideas, such as introducing a sleep or a read that would
>>> let me enough time to stop the program, but they have the bad property
>>> of modifying the program.
>>> 
>>> I could create a loader program that would exec the target program and
>>> stop the loader right before the exec, and I suspect (but I'm not sure)
>>> that would let me stop the target program.
>>> 
>>> But these all sound very rube goldbergy to me.
>>> 
>>> Is there a way to start a program in a stopped state that I have
>>> overlooked ?
>>> 
>>> Thanks in advance,
>>> 
>>> Cheers,
>>> 
>>> Edouard.
>>> 
>>> 9fans / 9fans / see discussions + participants + delivery options Permalink

------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/T4297f451b18d599a-M3e1e3d523a93168b1f2e3b2d
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-08-04 14:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-22  8:21 [9fans] Inferno: starting a process in a stopped state Edouard Klein
2024-07-24 19:52 ` ron minnich
2024-08-03 14:03   ` Edouard Klein
2024-08-04 13:37     ` Edouard Klein
2024-08-04 14:26       ` Edouard Klein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).