Chromium Code Reviews| Index: tests/pnacl_ld_experiments/hello1.c |
| =================================================================== |
| --- tests/pnacl_ld_experiments/hello1.c (revision 0) |
| +++ tests/pnacl_ld_experiments/hello1.c (revision 0) |
| @@ -0,0 +1,114 @@ |
| +#include <unistd.h> |
|
jvoung - send to chromium...
2012/05/01 23:30:49
Copyright notice.
robertm
2012/05/02 17:33:12
Done.
|
| +#include <stdlib.h> |
| + |
| +#define NACL_INSTR_BLOCK_SHIFT 5 |
|
jvoung - send to chromium...
2012/05/01 23:30:49
Note about this experiment being tailored to x86?
Robert Muth (chromium)
2012/05/02 16:18:32
IIRC this works for all archs
|
| +#define NACL_PAGESHIFT 12 |
| +#define NACL_SYSCALL_START_ADDR (16 << NACL_PAGESHIFT) |
| +#define NACL_SYSCALL_ADDR(syscall_number) \ |
| + (NACL_SYSCALL_START_ADDR + (syscall_number << NACL_INSTR_BLOCK_SHIFT)) |
| + |
| +#define NACL_SYSCALL(s) ((TYPE_nacl_ ## s) NACL_SYSCALL_ADDR(NACL_sys_ ## s)) |
| + |
| +typedef int (*TYPE_nacl_write) (int desc, void const *buf, int count); |
| +typedef void (*TYPE_nacl_null) (void); |
| +typedef void (*TYPE_nacl_exit) (int status); |
| + |
| +#include <bits/nacl_syscalls.h> |
|
jvoung - send to chromium...
2012/05/01 23:30:49
Does this have to be included down here, or can it
Robert Muth (chromium)
2012/05/02 16:18:32
Done.
|
| + |
| +/* ====================================================================== */ |
|
jvoung - send to chromium...
2012/05/01 23:30:49
Comment about the purpose of this particular sub-e
Robert Muth (chromium)
2012/05/02 16:18:32
Done.
|
| +extern void _dl_get_tls_static_info(int *static_tls_size, |
| + int *static_tls_align); |
| +extern int __tls_get_addr(); |
| +/* ====================================================================== */ |
| +int mystrlen(const char* s) { |
| + int count = 0; |
| + while (*s++) ++count; |
| + return count; |
| +} |
| + |
| + |
| +void myhextochar(int n, char buffer[9]) { |
| + int i; |
| + buffer[8] = 0; |
| + |
| + for (i = 0; i < 8; ++i) { |
| + int nibble = 0xf & (n >> (4 * (7 - i))); |
| + if (nibble <= 9) { |
| + buffer[i] = nibble + '0'; |
| + } else { |
| + buffer[i] = nibble - 10 + 'A'; |
| + } |
| + } |
| +} |
| + |
| +#define myprint(s) NACL_SYSCALL(write)(1, s, mystrlen(s)) |
| + |
| +__thread int tdata1 = 1; |
| +__thread int tdata2 = 3; |
| + |
| + |
| +ssize_t write(int l, const void* buf, size_t n) { |
|
jvoung - send to chromium...
2012/05/01 23:30:49
Is that parameter a "l" or a "1"? Could you name i
jvoung - send to chromium...
2012/05/02 17:20:42
Well, I do think it will be clearer, since you do
|
| + return NACL_SYSCALL(write)(l, buf, n); |
| +} |
| + |
| +void exit(int ret) { |
| + NACL_SYSCALL(exit)(ret); |
| +} |
| + |
| +void __deregister_frame_info(const void *begin) { |
| + myprint("__deregister_frame_info\n"); |
| +} |
| + |
| +void __register_frame_info(void *begin, void *ob) { |
| + myprint("__register_frame_info\n"); |
| +} |
| + |
| + |
| +int main(int argc, char** argv, char** envp) { |
| + myprint("hello world\n"); |
| + char buffer[9]; |
| + |
| + myhextochar(tdata1, buffer); |
| + myprint(buffer); |
|
jvoung - send to chromium...
2012/05/01 23:30:49
perhaps print "tdata1 (expecting 1): " first, same
robertm
2012/05/02 17:33:12
Done.
|
| + myprint("\n"); |
| + |
| + myhextochar(tdata2, buffer); |
| + myprint(buffer); |
| + myprint("\n"); |
| + |
| + int static_tls_size; |
| + int static_tls_align; |
| + |
| +#if 0 |
| + /* will be enabled soon */ |
| + int x = (int) & __tls_get_addr; |
| + myhextochar(x, buffer); |
| + myprint(buffer); |
| + myprint("\n"); |
| + _dl_get_tls_static_info (&static_tls_size, &static_tls_align); |
| +#endif |
| + |
| + return 0; |
| +} |
| + |
| +char message_init[] = "init\n"; |
| + |
| +int __libc_csu_init (int argc, char **argv, char **envp) { |
| + write(1, message_init, sizeof(message_init)); |
| + return 0; |
| +} |
| + |
| +char message_fini[] = "fini\n"; |
| +void __libc_csu_fini (void) { |
| + write(1, message_fini, sizeof(message_fini)); |
| +} |
| + |
| +void __libc_start_main (int (*main) (int argc, char **argv, char **envp), |
| + int argc, char **argv, |
| + int (*init) (int argc, char **argv, char **envp), |
| + void (*fini) (void), |
| + void (*rtld_fini) (void), |
| + void *stack_end) { |
| + |
| + exit(main(0, 0, 0)); |
| +} |
| Property changes on: tests/pnacl_ld_experiments/hello1.c |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |