linux-user: fake /proc/self/stat
The boehm gc finds the program's stack starting pointer by checking /proc/self/stat. Unfortunately, so far it reads qemu's stack pointer which clearly is wrong. So let's instead fake the file so the guest program sees the right address. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
		
							parent
							
								
									36c08d498b
								
							
						
					
					
						commit
						480b8e7dd5
					
				| 
						 | 
				
			
			@ -4614,6 +4614,31 @@ static int open_self_maps(void *cpu_env, int fd)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int open_self_stat(void *cpu_env, int fd)
 | 
			
		||||
{
 | 
			
		||||
    TaskState *ts = ((CPUState *)cpu_env)->opaque;
 | 
			
		||||
    abi_ulong start_stack = ts->info->start_stack;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 44; i++) {
 | 
			
		||||
      char buf[128];
 | 
			
		||||
      int len;
 | 
			
		||||
      uint64_t val = 0;
 | 
			
		||||
 | 
			
		||||
      if (i == 27) {
 | 
			
		||||
          /* stack bottom */
 | 
			
		||||
          val = start_stack;
 | 
			
		||||
      }
 | 
			
		||||
      snprintf(buf, sizeof(buf), "%"PRId64 "%c", val, i == 43 ? '\n' : ' ');
 | 
			
		||||
      len = strlen(buf);
 | 
			
		||||
      if (write(fd, buf, len) != len) {
 | 
			
		||||
          return -1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
    struct fake_open {
 | 
			
		||||
| 
						 | 
				
			
			@ -4623,6 +4648,7 @@ static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
 | 
			
		|||
    const struct fake_open *fake_open;
 | 
			
		||||
    static const struct fake_open fakes[] = {
 | 
			
		||||
        { "/proc/self/maps", open_self_maps },
 | 
			
		||||
        { "/proc/self/stat", open_self_stat },
 | 
			
		||||
        { NULL, NULL }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue