How to pass a value into a system call function in XV6?

20,410

Passing arguments from user-level functions to kernel-level functions cannot be done in XV6. XV6 has its own built-in functions for passing arguments into a kernel function. For instance, to pass in an integer, the argint() function is called. In the implementation that I used for the set-priority function, that would look something like:

argint(0, &pid);

... to get the first argument which is the Process ID, and:

argint(1, &pty);

... to get the second argument which is the desired priority. The function call from the user process looks like this:

setpty(getpid(), priority);
Share:
20,410
bertmoog
Author by

bertmoog

Formerly active US Marine Sergeant - 0811 Field Artillery BS in Computer Science - Primarily C++ & C# Hobbies: Woodworking | construction | electronics | vacuum tube amplifiers | speakers | music creation and recording | photography and editing | drums | guitar | auto-cross racing | .........

Updated on July 09, 2022

Comments

  • bertmoog
    bertmoog almost 2 years

    I am attempting to create a simple priority based scheduler in XV6. To do this, I also have to create a system call that will allow a process to set its priority. I have done everything required to create the system call as discussed here and elsewhere:

    how do i add a system call / utility in xv6

    The problem is, I cannot pass any variables when I call the function, or rather, it runs like nothing is wrong but the correct values do not show up inside the function.

    Extern declaration (syscall.c):

    ...
    extern int sys_setpty(void);
    
    static int (*syscalls[])(void) = {
    ...
    [SYS_setpty]  sys_setpty,
    };
    

    Sys-call Vector (syscall.h):

    #define SYS_setpty 22
    

    Implementation (sysproc.c):

    void
    sys_setpty(int pid, int pty)
    {
      cprintf("function pid: %d \n", pid);
      cprintf("function pty: %d \n", pty);
    }
    

    (defs.h & user.h):

    void setpty(int, int);
    

    Macro (usys.S):

    SYSCALL(setpty)
    

    Function call:

    setpty(3, 50);
    

    Output:

    function pid: 16843009
    function pty: 16843009
    

    The values are always the same exact number: 16843009. I have checked to see if the cprintf is working correctly by assigning values to pid and pty. I have spent about 6 hours trying every possible combination of everything I can think of and I'm starting to think that there is no built in mechanism for passing values via a system call in XV6. Am I missing something? Thank you in advance.

  • WannaBeCoder
    WannaBeCoder about 9 years
    Thanks to your own answer +1 , I got how to pass parameters from user space to kernel space. However I could not do priority based scheduling. :(