Во-первых, вот сценарий:
pid$target::foo:entry
{
ustack();
self->arg0 = arg0;
self->arg1 = arg1;
printf("arg0 = 0x%x\n", self->arg0);
printf("*arg0 = %d\n", *(int *)copyin(self->arg0, 4));
printf("arg1 = 0x%x\n", self->arg1);
printf("*arg1 = %d\n", *(int *)copyin(self->arg1, 4));
}
pid$target::foo:return
{
ustack();
printf("arg0 = 0x%x\n", self->arg0);
printf("*arg0 = %d\n", *(int *)copyin(self->arg0, 4));
printf("arg1 = 0x%x\n", self->arg1);
printf("*arg1 = %d\n", *(int *)copyin(self->arg1, 4));
printf("return = %d\n", arg1);
}
Как это работает. ustack () печатает стек пользовательского процесса.
В записи функции argN является N-ным аргументом функции. Поскольку аргументы
указатели, вам нужно использовать copyin () для копирования реальных данных, прежде чем разыменовывать их.
Для возврата функции у вас больше нет доступа к аргументам функции. Так вы экономите
параметры для последующего использования.
Наконец, для возврата функции вы можете получить доступ к значению, возвращенному функцией с помощью
arg1.