Changeset 1735f3e in mainline
- Timestamp:
- 2010-01-31T18:22:37Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fc2e71e
- Parents:
- 430de97 (diff), 2e07f62c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 81 added
- 1 deleted
- 63 edited
- 13 moved
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r430de97 r1735f3e 31 31 32 32 % Platform 33 @ "abs32le" abstract 32-bit little endian 33 34 @ "amd64" AMD64/Intel EM64T (PC) 34 35 @ "arm32" ARM 32-bit … … 91 92 92 93 % Kernel architecture 94 @ "abs32le" 95 ! [PLATFORM=abs32le] KARCH (choice) 96 97 % Kernel architecture 93 98 @ "amd64" 94 99 ! [PLATFORM=amd64] KARCH (choice) … … 130 135 131 136 % User space architecture 137 @ "abs32le" 138 ! [PLATFORM=abs32le] UARCH (choice) 139 140 % User space architecture 132 141 @ "amd64" 133 142 ! [PLATFORM=amd64] UARCH (choice) … … 167 176 168 177 ## Mapping between platform and boot architecture 178 179 % Boot architecture 180 @ "abs32le" 181 ! [PLATFORM=abs32le] BARCH (choice) 169 182 170 183 % Boot architecture … … 243 256 ! [PLATFORM=arm32|PLATFORM=mips32|PLATFORM=ppc32] COMPILER (choice) 244 257 258 % Compiler 259 @ "gcc_native" GNU C Compiler (native) 260 @ "clang" Clang 261 ! [PLATFORM=abs32le] COMPILER (choice) 262 245 263 246 264 ## Kernel configuration … … 259 277 260 278 % Hierarchical page tables support 261 ! [PLATFORM= ia32|PLATFORM=amd64|PLATFORM=arm32|PLATFORM=mips32|PLATFORM=ppc32] CONFIG_PAGE_PT (y)279 ! [PLATFORM=abs32le|PLATFORM=ia32|PLATFORM=amd64|PLATFORM=arm32|PLATFORM=mips32|PLATFORM=ppc32] CONFIG_PAGE_PT (y) 262 280 263 281 % Page hash table support … … 486 504 % Mount /data on startup 487 505 ! [CONFIG_START_BD=y] CONFIG_MOUNT_DATA (n/y) 506 507 % Verbose task dumps 508 ! CONFIG_VERBOSE_DUMPS (n/y) -
Makefile
r430de97 r1735f3e 59 59 60 60 distclean: clean 61 rm -f $(CSCOPE).out Makefile.config config.h config.defs tools/*.pyc 61 rm -f $(CSCOPE).out Makefile.config config.h config.defs tools/*.pyc tools/checkers/*.pyc 62 62 63 63 clean: -
boot/Makefile.common
r430de97 r1735f3e 56 56 $(USPACEDIR)/srv/fs/devfs/devfs \ 57 57 $(USPACEDIR)/srv/fs/tmpfs/tmpfs \ 58 $(USPACEDIR)/srv/fs/fat/fat 58 $(USPACEDIR)/srv/fs/fat/fat \ 59 $(USPACEDIR)/srv/taskmon/taskmon 59 60 60 61 RD_APPS = \ … … 65 66 $(USPACEDIR)/app/mkfat/mkfat \ 66 67 $(USPACEDIR)/app/redir/redir \ 68 $(USPACEDIR)/app/taskdump/taskdump \ 67 69 $(USPACEDIR)/app/tester/tester \ 68 70 $(USPACEDIR)/app/tetris/tetris \ -
boot/arch/amd64/Makefile.inc
r430de97 r1735f3e 33 33 $(USPACEDIR)/srv/hw/char/i8042/i8042 \ 34 34 $(USPACEDIR)/srv/hw/bus/pci/pci \ 35 $(USPACEDIR)/srv/hid/c _mouse/c_mouse35 $(USPACEDIR)/srv/hid/char_mouse/char_ms 36 36 37 37 MODULES := $(notdir $(COMPONENTS)) -
boot/arch/ia64/loader/Makefile.common
r430de97 r1735f3e 49 49 RD_SRVS += \ 50 50 $(USPACEDIR)/srv/hw/char/i8042/i8042 \ 51 $(USPACEDIR)/srv/hid/c _mouse/c_mouse51 $(USPACEDIR)/srv/hid/char_mouse/char_ms 52 52 endif -
boot/arch/ppc32/loader/Makefile.common
r430de97 r1735f3e 43 43 KERNELDIR = ../../../../kernel 44 44 USPACEDIR = ../../../../uspace 45 46 RD_SRVS += \ 47 $(USPACEDIR)/srv/hid/adb_mouse/adb_ms \ 48 $(USPACEDIR)/srv/hw/bus/cuda_adb/cuda_adb -
kernel/arch/amd64/src/amd64.c
r430de97 r1735f3e 278 278 } 279 279 280 void irq_initialize_arch(irq_t *irq) 281 { 282 (void) irq; 283 } 284 280 285 /** @} 281 286 */ -
kernel/arch/arm32/src/arm32.c
r430de97 r1735f3e 179 179 } 180 180 181 void irq_initialize_arch(irq_t *irq) 182 { 183 (void) irq; 184 } 185 181 186 /** @} 182 187 */ -
kernel/arch/ia32/src/ia32.c
r430de97 r1735f3e 234 234 } 235 235 236 void irq_initialize_arch(irq_t *irq) 237 { 238 (void) irq; 239 } 240 236 241 /** @} 237 242 */ -
kernel/arch/ia64/src/ia64.c
r430de97 r1735f3e 44 44 #include <arch/stack.h> 45 45 #include <arch/mm/page.h> 46 #include <interrupt.h> 46 47 #include <mm/as.h> 47 48 #include <config.h> … … 280 281 } 281 282 283 void irq_initialize_arch(irq_t *irq) 284 { 285 (void) irq; 286 } 287 282 288 /** @} 283 289 */ -
kernel/arch/mips32/src/mips32.c
r430de97 r1735f3e 46 46 #include <sysinfo/sysinfo.h> 47 47 #include <arch/interrupt.h> 48 #include <interrupt.h> 48 49 #include <console/chardev.h> 49 50 #include <arch/barrier.h> … … 257 258 } 258 259 260 void irq_initialize_arch(irq_t *irq) 261 { 262 (void) irq; 263 } 264 259 265 /** @} 260 266 */ -
kernel/arch/ppc32/src/ppc32.c
r430de97 r1735f3e 39 39 #include <genarch/kbrd/kbrd.h> 40 40 #include <arch/interrupt.h> 41 #include <interrupt.h> 41 42 #include <genarch/fb/fb.h> 42 43 #include <genarch/fb/visuals.h> … … 47 48 #include <proc/uarg.h> 48 49 #include <console/console.h> 50 #include <sysinfo/sysinfo.h> 49 51 #include <ddi/irq.h> 50 52 #include <arch/drivers/pic.h> … … 58 60 59 61 bootinfo_t bootinfo; 62 63 static cir_t pic_cir; 64 static void *pic_cir_arg; 60 65 61 66 /** Performs ppc32-specific initialization before main_bsp() is called. */ … … 186 191 if (assigned_address) { 187 192 /* Initialize PIC */ 188 cir_t cir; 189 void *cir_arg; 190 pic_init(assigned_address[0].addr, PAGE_SIZE, &cir, &cir_arg); 191 193 pic_init(assigned_address[0].addr, PAGE_SIZE, &pic_cir, 194 &pic_cir_arg); 195 192 196 #ifdef CONFIG_MAC_KBD 193 197 uintptr_t pa = assigned_address[0].addr + 0x16000; … … 201 205 /* Initialize I/O controller */ 202 206 cuda_instance_t *cuda_instance = 203 cuda_init(cuda, IRQ_CUDA, cir,cir_arg);207 cuda_init(cuda, IRQ_CUDA, pic_cir, pic_cir_arg); 204 208 if (cuda_instance) { 205 209 kbrd_instance_t *kbrd_instance = kbrd_init(); … … 211 215 } 212 216 } 217 218 /* 219 * This is the necessary evil until the userspace driver is entirely 220 * self-sufficient. 221 */ 222 sysinfo_set_item_val("cuda", NULL, true); 223 sysinfo_set_item_val("cuda.inr", NULL, IRQ_CUDA); 224 sysinfo_set_item_val("cuda.address.physical", NULL, pa); 225 sysinfo_set_item_val("cuda.address.kernel", NULL, 226 (uintptr_t) cuda); 213 227 #endif 214 228 } … … 216 230 /* Consider only a single device for now */ 217 231 return false; 232 } 233 234 void irq_initialize_arch(irq_t *irq) 235 { 236 irq->cir = pic_cir; 237 irq->cir_arg = pic_cir_arg; 238 irq->preack = true; 218 239 } 219 240 -
kernel/arch/sparc64/src/sparc64.c
r430de97 r1735f3e 44 44 #include <arch/mm/page.h> 45 45 #include <arch/stack.h> 46 #include <interrupt.h> 46 47 #include <genarch/ofw/ofw_tree.h> 47 48 #include <userspace.h> … … 166 167 } 167 168 169 void irq_initialize_arch(irq_t *irq) 170 { 171 (void) irq; 172 } 173 168 174 /** @} 169 175 */ -
kernel/generic/include/interrupt.h
r430de97 r1735f3e 46 46 typedef void (* iroutine)(int n, istate_t *istate); 47 47 48 #define fault_if_from_uspace(istate, fmt, ...) \ 49 { \ 50 if (istate_from_uspace(istate)) { \ 51 task_t *task = TASK; \ 52 printf("Task %s (%" PRIu64 ") killed due to an exception at " \ 53 "program counter %p.\n", task->name, task->taskid, istate_get_pc(istate)); \ 54 stack_trace_istate(istate); \ 55 printf("Kill message: " fmt "\n", ##__VA_ARGS__); \ 56 task_kill(task->taskid); \ 57 thread_exit(); \ 58 } \ 59 } 60 48 extern void fault_if_from_uspace(istate_t *istate, char *fmt, ...); 61 49 extern iroutine exc_register(int n, const char *name, iroutine f); 62 50 extern void exc_dispatch(int n, istate_t *t); 63 51 void exc_init(void); 52 53 extern void irq_initialize_arch(irq_t *irq); 64 54 65 55 #endif -
kernel/generic/include/ipc/event_types.h
r430de97 r1735f3e 37 37 38 38 typedef enum event_type { 39 /** New data available in kernel log */ 39 40 EVENT_KLOG = 0, 41 /** Returning from kernel console to userspace */ 40 42 EVENT_KCONSOLE, 43 /** A thread has faulted and will be terminated */ 44 EVENT_FAULT, 41 45 EVENT_END 42 46 } event_type_t; -
kernel/generic/include/mm/as.h
r430de97 r1735f3e 36 36 #define KERN_AS_H_ 37 37 38 #ifdef KERNEL 39 #include <arch/types.h> 40 #else 41 #include <sys/types.h> 42 #endif 43 38 44 /** Address space area flags. */ 39 45 #define AS_AREA_READ 1 … … 41 47 #define AS_AREA_EXEC 4 42 48 #define AS_AREA_CACHEABLE 8 49 50 /** Address space area info exported to userspace. */ 51 typedef struct { 52 /** Starting address */ 53 uintptr_t start_addr; 54 55 /** Area size */ 56 size_t size; 57 58 /** Area flags */ 59 int flags; 60 } as_area_info_t; 43 61 44 62 #ifdef KERNEL … … 268 286 269 287 /* Introspection functions. */ 288 extern void as_get_area_info(as_t *as, as_area_info_t **obuf, size_t *osize); 270 289 extern void as_print(as_t *as); 271 290 -
kernel/generic/include/udebug/udebug.h
r430de97 r1735f3e 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ … … 83 83 UDEBUG_M_ARGS_READ, 84 84 85 /** Read thread's userspace register state (istate_t). 86 * 87 * - ARG2 - thread identification 88 * - ARG3 - destination address in the caller's address space 89 * 90 * or, on error, retval will be 91 * - ENOENT - thread does not exist 92 * - EBUSY - register state not available 93 */ 94 UDEBUG_M_REGS_READ, 95 85 96 /** Read the list of the debugged tasks's threads. 86 97 * … … 97 108 UDEBUG_M_THREAD_READ, 98 109 110 /** Read the name of the debugged task. 111 * 112 * - ARG2 - destination address in the caller's address space 113 * - ARG3 - size of receiving buffer in bytes 114 * 115 * The kernel fills the buffer with a non-terminated string. 116 * 117 * - ARG2 - number of bytes that were actually copied 118 * - ARG3 - number of bytes of the complete data 119 * 120 */ 121 UDEBUG_M_NAME_READ, 122 123 /** Read the list of the debugged task's address space areas. 124 * 125 * - ARG2 - destination address in the caller's address space 126 * - ARG3 - size of receiving buffer in bytes 127 * 128 * The kernel fills the buffer with a series of as_area_info_t structures. 129 * Upon answer, the kernel will set: 130 * 131 * - ARG2 - number of bytes that were actually copied 132 * - ARG3 - number of bytes of the complete data 133 * 134 */ 135 UDEBUG_M_AREAS_READ, 136 99 137 /** Read the debugged tasks's memory. 100 138 * … … 108 146 } udebug_method_t; 109 147 110 148 111 149 typedef enum { 112 150 UDEBUG_EVENT_FINISHED = 1, /**< Debuging session has finished */ … … 139 177 140 178 #include <synch/mutex.h> 179 #include <synch/condvar.h> 141 180 #include <arch/interrupt.h> 142 181 #include <atomic.h> … … 181 220 bool stoppable; /**< thread is stoppable */ 182 221 bool active; /**< thread is in a debugging session */ 222 condvar_t active_cv; 183 223 } udebug_thread_t; 184 224 … … 202 242 203 243 int udebug_task_cleanup(struct task *ta); 244 void udebug_thread_fault(void); 204 245 205 246 #endif -
kernel/generic/include/udebug/udebug_ops.h
r430de97 r1735f3e 45 45 int udebug_stop(thread_t *t, call_t *call); 46 46 47 int udebug_thread_read(void **buffer, size_t buf_size, size_t *n); 47 int udebug_thread_read(void **buffer, size_t buf_size, size_t *stored, 48 size_t *needed); 49 int udebug_name_read(char **data, size_t *data_size); 48 50 int udebug_args_read(thread_t *t, void **buffer); 51 52 int udebug_regs_read(thread_t *t, void **buffer); 49 53 50 54 int udebug_mem_read(unative_t uspace_addr, size_t n, void **buffer); -
kernel/generic/src/ddi/irq.c
r430de97 r1735f3e 74 74 #include <synch/spinlock.h> 75 75 #include <console/console.h> 76 #include <interrupt.h> 76 77 #include <memstr.h> 77 78 #include <arch.h> … … 169 170 irq->inr = -1; 170 171 irq->devno = -1; 172 173 irq_initialize_arch(irq); 171 174 } 172 175 -
kernel/generic/src/interrupt/interrupt.c
r430de97 r1735f3e 44 44 #include <console/console.h> 45 45 #include <console/cmd.h> 46 #include <ipc/event.h> 47 #include <synch/mutex.h> 48 #include <time/delay.h> 49 #include <macros.h> 46 50 #include <panic.h> 47 51 #include <print.h> … … 107 111 fault_if_from_uspace(istate, "Unhandled exception %d.", n); 108 112 panic("Unhandled exception %d.", n); 113 } 114 115 /** Terminate thread and task if exception came from userspace. */ 116 void fault_if_from_uspace(istate_t *istate, char *fmt, ...) 117 { 118 task_t *task = TASK; 119 va_list args; 120 121 if (!istate_from_uspace(istate)) 122 return; 123 124 printf("Task %s (%" PRIu64 ") killed due to an exception at " 125 "program counter %p.\n", task->name, task->taskid, 126 istate_get_pc(istate)); 127 128 stack_trace_istate(istate); 129 130 printf("Kill message: "); 131 va_start(args, fmt); 132 vprintf(fmt, args); 133 va_end(args); 134 printf("\n"); 135 136 /* 137 * Userspace can subscribe for FAULT events to take action 138 * whenever a thread faults. (E.g. take a dump, run a debugger). 139 * The notification is always available, but unless Udebug is enabled, 140 * that's all you get. 141 */ 142 if (event_is_subscribed(EVENT_FAULT)) { 143 /* Notify the subscriber that a fault occurred. */ 144 event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid), 145 UPPER32(TASK->taskid), (unative_t) THREAD); 146 147 #ifdef CONFIG_UDEBUG 148 /* Wait for a debugging session. */ 149 udebug_thread_fault(); 150 #endif 151 } 152 153 task_kill(task->taskid); 154 thread_exit(); 109 155 } 110 156 -
kernel/generic/src/ipc/ipc.c
r430de97 r1735f3e 212 212 * 213 213 * @param call Call structure to be answered. 214 */ 215 static void _ipc_answer_free_call(call_t *call) 214 * @param selflocked If true, then TASK->answebox is locked. 215 */ 216 static void _ipc_answer_free_call(call_t *call, bool selflocked) 216 217 { 217 218 answerbox_t *callerbox = call->callerbox; 219 bool do_lock = ((!selflocked) || callerbox != (&TASK->answerbox)); 218 220 219 221 call->flags |= IPC_CALL_ANSWERED; … … 226 228 } 227 229 228 spinlock_lock(&callerbox->lock); 230 if (do_lock) 231 spinlock_lock(&callerbox->lock); 229 232 list_append(&call->link, &callerbox->answers); 230 spinlock_unlock(&callerbox->lock); 233 if (do_lock) 234 spinlock_unlock(&callerbox->lock); 231 235 waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); 232 236 } … … 244 248 spinlock_unlock(&box->lock); 245 249 /* Send back answer */ 246 _ipc_answer_free_call(call );250 _ipc_answer_free_call(call, false); 247 251 } 248 252 … … 261 265 atomic_inc(&phone->active_calls); 262 266 IPC_SET_RETVAL(call->data, err); 263 _ipc_answer_free_call(call );267 _ipc_answer_free_call(call, false); 264 268 } 265 269 … … 300 304 if (call->flags & IPC_CALL_FORWARDED) { 301 305 IPC_SET_RETVAL(call->data, EFORWARD); 302 _ipc_answer_free_call(call );306 _ipc_answer_free_call(call, false); 303 307 } else { 304 308 if (phone->state == IPC_PHONE_HUNGUP) … … 455 459 456 460 IPC_SET_RETVAL(call->data, EHANGUP); 457 _ipc_answer_free_call(call );461 _ipc_answer_free_call(call, true); 458 462 } 459 463 } -
kernel/generic/src/mm/as.c
r430de97 r1735f3e 1920 1920 } 1921 1921 1922 /** Get list of adress space areas. 1923 * 1924 * @param as Address space. 1925 * @param obuf Place to save pointer to returned buffer. 1926 * @param osize Place to save size of returned buffer. 1927 */ 1928 void as_get_area_info(as_t *as, as_area_info_t **obuf, size_t *osize) 1929 { 1930 ipl_t ipl; 1931 size_t area_cnt, area_idx, i; 1932 link_t *cur; 1933 1934 as_area_info_t *info; 1935 size_t isize; 1936 1937 ipl = interrupts_disable(); 1938 mutex_lock(&as->lock); 1939 1940 /* First pass, count number of areas. */ 1941 1942 area_cnt = 0; 1943 1944 for (cur = as->as_area_btree.leaf_head.next; 1945 cur != &as->as_area_btree.leaf_head; cur = cur->next) { 1946 btree_node_t *node; 1947 1948 node = list_get_instance(cur, btree_node_t, leaf_link); 1949 area_cnt += node->keys; 1950 } 1951 1952 isize = area_cnt * sizeof(as_area_info_t); 1953 info = malloc(isize, 0); 1954 1955 /* Second pass, record data. */ 1956 1957 area_idx = 0; 1958 1959 for (cur = as->as_area_btree.leaf_head.next; 1960 cur != &as->as_area_btree.leaf_head; cur = cur->next) { 1961 btree_node_t *node; 1962 1963 node = list_get_instance(cur, btree_node_t, leaf_link); 1964 1965 for (i = 0; i < node->keys; i++) { 1966 as_area_t *area = node->value[i]; 1967 1968 ASSERT(area_idx < area_cnt); 1969 mutex_lock(&area->lock); 1970 1971 info[area_idx].start_addr = area->base; 1972 info[area_idx].size = FRAMES2SIZE(area->pages); 1973 info[area_idx].flags = area->flags; 1974 ++area_idx; 1975 1976 mutex_unlock(&area->lock); 1977 } 1978 } 1979 1980 mutex_unlock(&as->lock); 1981 interrupts_restore(ipl); 1982 1983 *obuf = info; 1984 *osize = isize; 1985 } 1986 1987 1922 1988 /** Print out information about address space. 1923 1989 * -
kernel/generic/src/udebug/udebug.c
r430de97 r1735f3e 69 69 mutex_initialize(&ut->lock, MUTEX_PASSIVE); 70 70 waitq_initialize(&ut->go_wq); 71 condvar_initialize(&ut->active_cv); 71 72 72 73 ut->go_call = NULL; … … 446 447 waitq_wakeup(&t->udebug.go_wq, WAKEUP_FIRST); 447 448 } 449 mutex_unlock(&t->udebug.lock); 450 condvar_broadcast(&t->udebug.active_cv); 451 } else { 452 mutex_unlock(&t->udebug.lock); 448 453 } 449 mutex_unlock(&t->udebug.lock);450 454 } 451 455 … … 456 460 } 457 461 462 /** Wait for debugger to handle a fault in this thread. 463 * 464 * When a thread faults and someone is subscribed to the FAULT kernel event, 465 * this function is called to wait for a debugging session to give userspace 466 * a chance to examine the faulting thead/task. When the debugging session 467 * is over, this function returns (so that thread/task cleanup can continue). 468 */ 469 void udebug_thread_fault(void) 470 { 471 udebug_stoppable_begin(); 472 473 /* Wait until a debugger attends to us. */ 474 mutex_lock(&THREAD->udebug.lock); 475 while (!THREAD->udebug.active) 476 condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock); 477 mutex_unlock(&THREAD->udebug.lock); 478 479 /* Make sure the debugging session is over before proceeding. */ 480 mutex_lock(&THREAD->udebug.lock); 481 while (THREAD->udebug.active) 482 condvar_wait(&THREAD->udebug.active_cv, &THREAD->udebug.lock); 483 mutex_unlock(&THREAD->udebug.lock); 484 485 udebug_stoppable_end(); 486 } 458 487 459 488 /** @} -
kernel/generic/src/udebug/udebug_ipc.c
r430de97 r1735f3e 41 41 #include <proc/task.h> 42 42 #include <proc/thread.h> 43 #include <mm/as.h> 43 44 #include <arch.h> 44 45 #include <errno.h> … … 165 166 static void udebug_receive_thread_read(call_t *call) 166 167 { 168 uintptr_t uspace_addr; 169 size_t buf_size; 170 void *buffer; 171 size_t copied, needed; 172 int rc; 173 174 uspace_addr = IPC_GET_ARG2(call->data); /* Destination address */ 175 buf_size = IPC_GET_ARG3(call->data); /* Dest. buffer size */ 176 177 /* 178 * Read thread list. Variable n will be filled with actual number 179 * of threads times thread-id size. 180 */ 181 rc = udebug_thread_read(&buffer, buf_size, &copied, &needed); 182 if (rc < 0) { 183 IPC_SET_RETVAL(call->data, rc); 184 ipc_answer(&TASK->kb.box, call); 185 return; 186 } 187 188 /* 189 * Make use of call->buffer to transfer data to caller's userspace 190 */ 191 192 IPC_SET_RETVAL(call->data, 0); 193 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 194 same code in process_answer() can be used 195 (no way to distinguish method in answer) */ 196 IPC_SET_ARG1(call->data, uspace_addr); 197 IPC_SET_ARG2(call->data, copied); 198 IPC_SET_ARG3(call->data, needed); 199 call->buffer = buffer; 200 201 ipc_answer(&TASK->kb.box, call); 202 } 203 204 /** Process a NAME_READ call. 205 * 206 * Returns a string containing the name of the task. 207 * 208 * @param call The call structure. 209 */ 210 static void udebug_receive_name_read(call_t *call) 211 { 167 212 unative_t uspace_addr; 168 213 unative_t to_copy; 169 unsigned total_bytes; 170 unsigned buf_size; 171 void *buffer; 172 size_t n; 173 int rc; 214 size_t data_size; 215 size_t buf_size; 216 void *data; 174 217 175 218 uspace_addr = IPC_GET_ARG2(call->data); /* Destination address */ … … 177 220 178 221 /* 179 * Read thread list. Variable n will be filled with actual number 180 * of threads times thread-id size. 181 */ 182 rc = udebug_thread_read(&buffer, buf_size, &n); 183 if (rc < 0) { 184 IPC_SET_RETVAL(call->data, rc); 185 ipc_answer(&TASK->kb.box, call); 186 return; 187 } 188 189 total_bytes = n; 190 191 /* Copy MAX(buf_size, total_bytes) bytes */ 192 193 if (buf_size > total_bytes) 194 to_copy = total_bytes; 222 * Read task name. 223 */ 224 udebug_name_read((char **) &data, &data_size); 225 226 /* Copy MAX(buf_size, data_size) bytes */ 227 228 if (buf_size > data_size) 229 to_copy = data_size; 195 230 else 196 231 to_copy = buf_size; … … 207 242 IPC_SET_ARG2(call->data, to_copy); 208 243 209 IPC_SET_ARG3(call->data, total_bytes); 210 call->buffer = buffer; 211 212 ipc_answer(&TASK->kb.box, call); 213 } 244 IPC_SET_ARG3(call->data, data_size); 245 call->buffer = data; 246 247 ipc_answer(&TASK->kb.box, call); 248 } 249 250 /** Process an AREAS_READ call. 251 * 252 * Returns a list of address space areas in the current task, as an array 253 * of as_area_info_t structures. 254 * 255 * @param call The call structure. 256 */ 257 static void udebug_receive_areas_read(call_t *call) 258 { 259 unative_t uspace_addr; 260 unative_t to_copy; 261 size_t data_size; 262 size_t buf_size; 263 void *data; 264 265 uspace_addr = IPC_GET_ARG2(call->data); /* Destination address */ 266 buf_size = IPC_GET_ARG3(call->data); /* Dest. buffer size */ 267 268 /* 269 * Read area list. 270 */ 271 as_get_area_info(AS, (as_area_info_t **) &data, &data_size); 272 273 /* Copy MAX(buf_size, data_size) bytes */ 274 275 if (buf_size > data_size) 276 to_copy = data_size; 277 else 278 to_copy = buf_size; 279 280 /* 281 * Make use of call->buffer to transfer data to caller's userspace 282 */ 283 284 IPC_SET_RETVAL(call->data, 0); 285 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 286 same code in process_answer() can be used 287 (no way to distinguish method in answer) */ 288 IPC_SET_ARG1(call->data, uspace_addr); 289 IPC_SET_ARG2(call->data, to_copy); 290 291 IPC_SET_ARG3(call->data, data_size); 292 call->buffer = data; 293 294 ipc_answer(&TASK->kb.box, call); 295 } 296 214 297 215 298 /** Process an ARGS_READ call. … … 250 333 ipc_answer(&TASK->kb.box, call); 251 334 } 335 336 /** Receive a REGS_READ call. 337 * 338 * Reads the thread's register state (istate structure). 339 */ 340 static void udebug_receive_regs_read(call_t *call) 341 { 342 thread_t *t; 343 unative_t uspace_addr; 344 unative_t to_copy; 345 void *buffer; 346 int rc; 347 348 t = (thread_t *) IPC_GET_ARG2(call->data); 349 350 rc = udebug_regs_read(t, &buffer); 351 if (rc < 0) { 352 IPC_SET_RETVAL(call->data, rc); 353 ipc_answer(&TASK->kb.box, call); 354 return; 355 } 356 357 /* 358 * Make use of call->buffer to transfer data to caller's userspace 359 */ 360 361 uspace_addr = IPC_GET_ARG3(call->data); 362 to_copy = sizeof(istate_t); 363 364 IPC_SET_RETVAL(call->data, 0); 365 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 366 same code in process_answer() can be used 367 (no way to distinguish method in answer) */ 368 IPC_SET_ARG1(call->data, uspace_addr); 369 IPC_SET_ARG2(call->data, to_copy); 370 371 call->buffer = buffer; 372 373 ipc_answer(&TASK->kb.box, call); 374 } 375 252 376 253 377 /** Process an MEM_READ call. … … 331 455 udebug_receive_thread_read(call); 332 456 break; 457 case UDEBUG_M_NAME_READ: 458 udebug_receive_name_read(call); 459 break; 460 case UDEBUG_M_AREAS_READ: 461 udebug_receive_areas_read(call); 462 break; 333 463 case UDEBUG_M_ARGS_READ: 334 464 udebug_receive_args_read(call); 335 465 break; 466 case UDEBUG_M_REGS_READ: 467 udebug_receive_regs_read(call); 468 break; 336 469 case UDEBUG_M_MEM_READ: 337 470 udebug_receive_mem_read(call); -
kernel/generic/src/udebug/udebug_ops.c
r430de97 r1735f3e 46 46 #include <errno.h> 47 47 #include <print.h> 48 #include <string.h> 48 49 #include <syscall/copy.h> 49 50 #include <ipc/ipc.h> … … 209 210 210 211 mutex_lock(&t->udebug.lock); 211 if ((t->flags & THREAD_FLAG_USPACE) != 0) 212 if ((t->flags & THREAD_FLAG_USPACE) != 0) { 212 213 t->udebug.active = true; 213 mutex_unlock(&t->udebug.lock); 214 mutex_unlock(&t->udebug.lock); 215 condvar_broadcast(&t->udebug.active_cv); 216 } else { 217 mutex_unlock(&t->udebug.lock); 218 } 214 219 } 215 220 … … 355 360 * 356 361 * If the sequence is longer than @a buf_size bytes, only as much hashes 357 * as can fit are copied. The number of thread hashes copied is stored 358 * in @a n. 362 * as can fit are copied. The number of bytes copied is stored in @a stored. 363 * The total number of thread bytes that could have been saved had there been 364 * enough space is stored in @a needed. 359 365 * 360 366 * The rationale for having @a buf_size is that this function is only … … 364 370 * @param buffer The buffer for storing thread hashes. 365 371 * @param buf_size Buffer size in bytes. 366 * @param n The actual number of hashes copied will be stored here. 367 */ 368 int udebug_thread_read(void **buffer, size_t buf_size, size_t *n) 372 * @param stored The actual number of bytes copied will be stored here. 373 * @param needed Total number of hashes that could have been saved. 374 */ 375 int udebug_thread_read(void **buffer, size_t buf_size, size_t *stored, 376 size_t *needed) 369 377 { 370 378 thread_t *t; 371 379 link_t *cur; 372 380 unative_t tid; 373 unsigned copied_ids; 381 size_t copied_ids; 382 size_t extra_ids; 374 383 ipl_t ipl; 375 384 unative_t *id_buffer; … … 380 389 381 390 /* Allocate a buffer to hold thread IDs */ 382 id_buffer = malloc(buf_size , 0);391 id_buffer = malloc(buf_size + 1, 0); 383 392 384 393 mutex_lock(&TASK->udebug.lock); … … 396 405 max_ids = buf_size / sizeof(unative_t); 397 406 copied_ids = 0; 407 extra_ids = 0; 398 408 399 409 /* FIXME: make sure the thread isn't past debug shutdown... */ 400 410 for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) { 401 /* Do not write past end of buffer */402 if (copied_ids >= max_ids) break;403 404 411 t = list_get_instance(cur, thread_t, th_link); 405 412 … … 409 416 410 417 /* Not interested in kernel threads. */ 411 if ((flags & THREAD_FLAG_USPACE) != 0) { 418 if ((flags & THREAD_FLAG_USPACE) == 0) 419 continue; 420 421 if (copied_ids < max_ids) { 412 422 /* Using thread struct pointer as identification hash */ 413 423 tid = (unative_t) t; 414 424 id_buffer[copied_ids++] = tid; 425 } else { 426 extra_ids++; 415 427 } 416 428 } … … 422 434 423 435 *buffer = id_buffer; 424 *n = copied_ids * sizeof(unative_t); 436 *stored = copied_ids * sizeof(unative_t); 437 *needed = (copied_ids + extra_ids) * sizeof(unative_t); 438 439 return 0; 440 } 441 442 /** Read task name. 443 * 444 * Returns task name as non-terminated string in a newly allocated buffer. 445 * Also returns the size of the data. 446 * 447 * @param data Place to store pointer to newly allocated block. 448 * @param data_size Place to store size of the data. 449 * 450 * @returns EOK. 451 */ 452 int udebug_name_read(char **data, size_t *data_size) 453 { 454 size_t name_size; 455 456 name_size = str_size(TASK->name) + 1; 457 *data = malloc(name_size, 0); 458 *data_size = name_size; 459 460 memcpy(*data, TASK->name, name_size); 425 461 426 462 return 0; … … 437 473 * this function will fail with an EINVAL error code. 438 474 * 439 * @param buffer The buffer for storing thread hashes. 475 * @param t Thread where call arguments are to be read. 476 * @param buffer Place to store pointer to new buffer. 477 * @return EOK on success, ENOENT if @a t is invalid, EINVAL 478 * if thread state is not valid for this operation. 440 479 */ 441 480 int udebug_args_read(thread_t *t, void **buffer) … … 469 508 } 470 509 510 /** Read the register state of the thread. 511 * 512 * The contents of the thread's istate structure are copied to a newly 513 * allocated buffer and a pointer to it is written to @a buffer. The size of 514 * the buffer will be sizeof(istate_t). 515 * 516 * Currently register state cannot be read if the thread is inside a system 517 * call (as opposed to an exception). This is an implementation limit. 518 * 519 * @param t Thread whose state is to be read. 520 * @param buffer Place to store pointer to new buffer. 521 * @return EOK on success, ENOENT if @a t is invalid, EINVAL 522 * if thread is not in valid state, EBUSY if istate 523 * is not available. 524 */ 525 int udebug_regs_read(thread_t *t, void **buffer) 526 { 527 istate_t *state, *state_buf; 528 int rc; 529 530 /* Prepare a buffer to hold the data. */ 531 state_buf = malloc(sizeof(istate_t), 0); 532 533 /* On success, this will lock t->udebug.lock */ 534 rc = _thread_op_begin(t, false); 535 if (rc != EOK) { 536 return rc; 537 } 538 539 state = t->udebug.uspace_state; 540 if (state == NULL) { 541 _thread_op_end(t); 542 return EBUSY; 543 } 544 545 /* Copy to the allocated buffer */ 546 memcpy(state_buf, state, sizeof(istate_t)); 547 548 _thread_op_end(t); 549 550 *buffer = (void *) state_buf; 551 return 0; 552 } 553 471 554 /** Read the memory of the debugged task. 472 555 * -
uspace/Makefile
r430de97 r1735f3e 40 40 app/mkfat \ 41 41 app/redir \ 42 app/taskdump \ 42 43 app/tester \ 43 44 app/tetris \ … … 47 48 srv/loader \ 48 49 srv/ns \ 50 srv/taskmon \ 49 51 srv/vfs \ 50 52 srv/bd/ata_bd \ … … 57 59 srv/fs/tmpfs \ 58 60 srv/fs/devfs \ 61 srv/hid/adb_mouse \ 59 62 srv/hid/console \ 60 srv/hid/c _mouse \63 srv/hid/char_mouse \ 61 64 srv/hid/fb \ 62 65 srv/hid/kbd \ … … 69 72 ifeq ($(UARCH),ia32) 70 73 DIRS += srv/hw/bus/pci 74 endif 75 76 ifeq ($(UARCH),ppc32) 77 DIRS += srv/hw/bus/cuda_adb 71 78 endif 72 79 -
uspace/app/init/init.c
r430de97 r1735f3e 233 233 } 234 234 235 static void mount_scratch(void) 236 { 237 int rc; 238 239 printf("Trying to mount null/0 on /scratch... "); 240 fflush(stdout); 241 242 rc = mount("tmpfs", "/scratch", "null/0", "", 0); 243 if (rc == EOK) 244 printf("OK\n"); 245 else 246 printf("Failed\n"); 247 } 248 235 249 static void mount_data(void) 236 250 { … … 255 269 return -1; 256 270 } 271 272 /* Make sure tmpfs is running. */ 273 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) { 274 spawn("/srv/tmpfs"); 275 } 257 276 258 277 spawn("/srv/devfs"); 278 spawn("/srv/taskmon"); 259 279 260 280 if (!mount_devfs()) { … … 262 282 return -2; 263 283 } 284 285 mount_scratch(); 264 286 265 287 spawn("/srv/fhc"); 266 288 spawn("/srv/obio"); 289 srv_start("/srv/cuda_adb"); 267 290 srv_start("/srv/i8042"); 268 srv_start("/srv/c_mouse"); 291 srv_start("/srv/adb_ms"); 292 srv_start("/srv/char_ms"); 269 293 270 294 spawn("/srv/fb"); … … 298 322 getterm("term/vc5", "/app/bdsh"); 299 323 getterm("term/vc6", "/app/klog"); 300 324 301 325 return 0; 302 326 } -
uspace/app/mkfat/mkfat.c
r430de97 r1735f3e 44 44 #include <devmap.h> 45 45 #include <byteorder.h> 46 #include <sys/types.h> 47 #include <sys/typefmt.h> 48 #include <inttypes.h> 46 49 #include <errno.h> 47 50 #include "fat.h" … … 157 160 printf(NAME ": Warning, failed to obtain block device size.\n"); 158 161 } else { 159 printf(NAME ": Block device has %llu blocks.\n", dev_nblocks); 162 printf(NAME ": Block device has %" PRIuBN " blocks.\n", 163 dev_nblocks); 160 164 cfg.total_sectors = dev_nblocks; 161 165 } -
uspace/app/trace/ipcp.c
r430de97 r1735f3e 36 36 #include <stdlib.h> 37 37 #include <adt/hash_table.h> 38 #include <sys/typefmt.h> 38 39 39 40 #include "ipc_desc.h" … … 200 201 201 202 if ((display_mask & DM_IPC) != 0) { 202 printf("Call ID: 0x%lx, phone: %d, proto: %s, method: ", hash,203 printf("Call ID: %p, phone: %d, proto: %s, method: ", hash, 203 204 phone, (proto ? proto->name : "n/a")); 204 205 ipc_m_print(proto, IPC_GET_METHOD(*call)); 205 printf(" args: (%lu, %lu, %lu, %lu, %lu)\n", args[1], args[2], 206 printf(" args: (%" PRIuIPCARG ", %" PRIuIPCARG ", %" PRIuIPCARG 207 ", %" PRIuIPCARG ", %" PRIuIPCARG ")\n", args[1], args[2], 206 208 args[3], args[4], args[5]); 207 209 } … … 279 281 280 282 if ((display_mask & DM_IPC) != 0) { 281 printf("Response to 0x%lx: retval=%ld, args = (%lu, %lu, %lu, %lu, %lu)\n", 282 hash, retval, IPC_GET_ARG1(*answer), 283 IPC_GET_ARG2(*answer), IPC_GET_ARG3(*answer), 284 IPC_GET_ARG4(*answer), IPC_GET_ARG5(*answer)); 283 printf("Response to %p: retval=%ld, args = (%" PRIuIPCARG 284 ", %" PRIuIPCARG ", %" PRIuIPCARG ", %" PRIuIPCARG 285 ", %" PRIuIPCARG ")\n", 286 hash, retval, IPC_GET_ARG1(*answer), 287 IPC_GET_ARG2(*answer), IPC_GET_ARG3(*answer), 288 IPC_GET_ARG4(*answer), IPC_GET_ARG5(*answer)); 285 289 } 286 290 … … 336 340 /* Not a response */ 337 341 if ((display_mask & DM_IPC) != 0) { 338 printf("Not a response (hash 0x%lx)\n", hash);342 printf("Not a response (hash %p)\n", hash); 339 343 } 340 344 return; -
uspace/app/trace/trace.c
r430de97 r1735f3e 49 49 #include <io/keycode.h> 50 50 #include <fibril_synch.h> 51 #include <sys/types.h> 52 #include <sys/typefmt.h> 51 53 52 54 #include <libc.h> … … 159 161 if (rc < 0) { 160 162 printf("Error connecting\n"); 161 printf("ipc_connect_task(% lld) -> %d ", task_id, rc);163 printf("ipc_connect_task(%" PRIdTASKID ") -> %d ", task_id, rc); 162 164 return rc; 163 165 } … … 198 200 printf("Threads:"); 199 201 for (i = 0; i < n_threads; i++) { 200 printf(" [%d] (hash 0x%lx)", 1+i, thread_hash_buf[i]);202 printf(" [%d] (hash %p)", 1+i, thread_hash_buf[i]); 201 203 } 202 204 printf("\ntotal of %u threads\n", tb_needed / sizeof(uintptr_t)); … … 222 224 case V_HASH: 223 225 case V_PTR: 224 printf(" 0x%08lx", val);226 printf("%p", val); 225 227 break; 226 228 … … 275 277 276 278 putchar('('); 277 if (n > 0) printf("% ld", sc_args[0]);279 if (n > 0) printf("%" PRIdSYSARG, sc_args[0]); 278 280 for (i = 1; i < n; i++) { 279 printf(", % ld", sc_args[i]);281 printf(", %" PRIdSYSARG, sc_args[i]); 280 282 } 281 283 putchar(')'); … … 508 510 } 509 511 510 printf("Start tracing thread [%d] (hash 0x%lx).\n", thread_id, thread_hash);512 printf("Start tracing thread [%d] (hash %p).\n", thread_id, thread_hash); 511 513 512 514 while (!abort_trace) { … … 552 554 break; 553 555 case UDEBUG_EVENT_THREAD_E: 554 printf("Thread 0x%lxexited.\n", val0);556 printf("Thread %p exited.\n", val0); 555 557 fibril_mutex_lock(&state_lock); 556 558 abort_trace = true; … … 972 974 rc = connect_task(task_id); 973 975 if (rc < 0) { 974 printf("Failed connecting to task % lld.\n", task_id);976 printf("Failed connecting to task %" PRIdTASKID ".\n", task_id); 975 977 return 1; 976 978 } 977 979 978 printf("Connected to task % lld.\n", task_id);980 printf("Connected to task %" PRIdTASKID ".\n", task_id); 979 981 980 982 if (task_ldr != NULL) -
uspace/lib/libc/arch/amd64/Makefile.inc
r430de97 r1735f3e 37 37 arch/$(UARCH)/src/fibril.S \ 38 38 arch/$(UARCH)/src/tls.c \ 39 arch/$(UARCH)/src/stacktrace.S 39 arch/$(UARCH)/src/stacktrace.c \ 40 arch/$(UARCH)/src/stacktrace_asm.S 40 41 41 42 GCC_CFLAGS += -fno-omit-frame-pointer -
uspace/lib/libc/arch/amd64/include/types.h
r430de97 r1735f3e 36 36 #define LIBC_amd64_TYPES_H_ 37 37 38 #define __64_BITS__ 39 38 40 typedef unsigned long long sysarg_t; 39 41 -
uspace/lib/libc/arch/amd64/src/stacktrace_asm.S
r430de97 r1735f3e 29 29 .text 30 30 31 .global frame_pointer_get 32 .global frame_pointer_prev 33 .global frame_pointer_validate 34 .global return_address_get 35 .global program_counter_get 31 .global stacktrace_prepare 32 .global stacktrace_fp_get 33 .global stacktrace_pc_get 36 34 37 frame_pointer_get: 35 stacktrace_prepare: 36 ret 37 38 stacktrace_fp_get: 38 39 movq %rbp, %rax 39 40 ret 40 41 41 frame_pointer_prev: 42 movq (%rdi), %rax 43 ret 44 45 frame_pointer_validate: 46 movq %rdi, %rax 47 ret 48 49 return_address_get: 50 movq 8(%rdi), %rax 51 ret 52 53 program_counter_get: 42 stacktrace_pc_get: 54 43 movq (%rsp), %rax 55 44 ret -
uspace/lib/libc/arch/arm32/Makefile.inc
r430de97 r1735f3e 38 38 arch/$(UARCH)/src/tls.c \ 39 39 arch/$(UARCH)/src/eabi.S \ 40 arch/$(UARCH)/src/stacktrace.S 40 arch/$(UARCH)/src/stacktrace.c \ 41 arch/$(UARCH)/src/stacktrace_asm.S 41 42 42 43 GCC_CFLAGS += -ffixed-r9 -mtp=soft -mapcs-frame -fno-omit-frame-pointer -
uspace/lib/libc/arch/arm32/include/types.h
r430de97 r1735f3e 37 37 #define LIBC_arm32_TYPES_H_ 38 38 39 #define __32_BITS__ 40 39 41 typedef unsigned int sysarg_t; 40 42 -
uspace/lib/libc/arch/arm32/src/stacktrace_asm.S
r430de97 r1735f3e 29 29 .text 30 30 31 .global frame_pointer_get 32 .global frame_pointer_prev 33 .global frame_pointer_validate 34 .global return_address_get 35 .global program_counter_get 31 .global stacktrace_prepare 32 .global stacktrace_fp_get 33 .global stacktrace_pc_get 36 34 37 frame_pointer_get: 35 stacktrace_prepare: 36 mov pc, lr 37 38 stacktrace_fp_get: 38 39 mov r0, fp 39 40 mov pc, lr 40 41 41 frame_pointer_prev: 42 ldr r0, [r0, #-12] 43 mov pc, lr 44 45 frame_pointer_validate: 46 mov pc, lr 47 48 return_address_get: 49 ldr r0, [r0, #-4] 50 mov pc, lr 51 52 program_counter_get: 42 stacktrace_pc_get: 53 43 mov r0, lr 54 44 mov pc, lr 55 -
uspace/lib/libc/arch/ia32/Makefile.inc
r430de97 r1735f3e 38 38 arch/$(UARCH)/src/tls.c \ 39 39 arch/$(UARCH)/src/setjmp.S \ 40 arch/$(UARCH)/src/stacktrace.S 40 arch/$(UARCH)/src/stacktrace.c \ 41 arch/$(UARCH)/src/stacktrace_asm.S 41 42 42 43 GCC_CFLAGS += -march=pentium -
uspace/lib/libc/arch/ia32/include/types.h
r430de97 r1735f3e 36 36 #define LIBC_ia32_TYPES_H_ 37 37 38 #define __32_BITS__ 39 38 40 typedef unsigned int sysarg_t; 39 41 -
uspace/lib/libc/arch/ia32/src/stacktrace_asm.S
r430de97 r1735f3e 29 29 .text 30 30 31 .global frame_pointer_get 32 .global frame_pointer_prev 33 .global frame_pointer_validate 34 .global return_address_get 35 .global program_counter_get 31 .global stacktrace_prepare 32 .global stacktrace_fp_get 33 .global stacktrace_pc_get 36 34 37 frame_pointer_get: 35 stacktrace_prepare: 36 ret 37 38 stacktrace_fp_get: 38 39 movl %ebp, %eax 39 40 ret 40 41 41 frame_pointer_prev: 42 movl 4(%esp), %eax 43 movl (%eax), %eax 44 ret 45 46 frame_pointer_validate: 47 movl 4(%esp), %eax 48 ret 49 50 return_address_get: 51 movl 4(%esp), %eax 52 movl 4(%eax), %eax 53 ret 54 55 program_counter_get: 42 stacktrace_pc_get: 56 43 movl (%esp), %eax 57 44 ret -
uspace/lib/libc/arch/ia64/Makefile.inc
r430de97 r1735f3e 37 37 arch/$(UARCH)/src/tls.c \ 38 38 arch/$(UARCH)/src/ddi.c \ 39 arch/$(UARCH)/src/stacktrace.S 39 arch/$(UARCH)/src/stacktrace.c \ 40 arch/$(UARCH)/src/stacktrace_asm.S 40 41 41 42 GCC_CFLAGS += -fno-unwind-tables -
uspace/lib/libc/arch/ia64/include/types.h
r430de97 r1735f3e 36 36 #define LIBC_ia64_TYPES_H_ 37 37 38 #define __64_BITS__ 39 38 40 typedef unsigned long long sysarg_t; 39 41 -
uspace/lib/libc/arch/ia64/src/stacktrace_asm.S
r430de97 r1735f3e 29 29 .text 30 30 31 .global frame_pointer_get 32 .global frame_pointer_prev 33 .global frame_pointer_validate 34 .global return_address_get 35 .global program_counter_get 31 .global stacktrace_prepare 32 .global stacktrace_fp_get 33 .global stacktrace_pc_get 36 34 37 frame_pointer_get:38 frame_pointer_prev: 39 frame_pointer_validate: 40 return_address_get:41 program_counter_get:35 stacktrace_prepare: 36 br.ret.sptk.many b0 37 38 stacktrace_fp_get: 39 stacktrace_pc_get: 42 40 mov r8 = r0 43 41 br.ret.sptk.many b0 -
uspace/lib/libc/arch/mips32/Makefile.inc
r430de97 r1735f3e 36 36 arch/$(UARCH)/src/fibril.S \ 37 37 arch/$(UARCH)/src/tls.c \ 38 arch/$(UARCH)/src/stacktrace.S 38 arch/$(UARCH)/src/stacktrace.c \ 39 arch/$(UARCH)/src/stacktrace_asm.S 39 40 40 41 GCC_CFLAGS += -mips3 -
uspace/lib/libc/arch/mips32/include/types.h
r430de97 r1735f3e 37 37 #define LIBC_mips32_TYPES_H_ 38 38 39 #define __32_BITS__ 40 39 41 typedef unsigned int sysarg_t; 40 42 -
uspace/lib/libc/arch/mips32/src/stacktrace_asm.S
r430de97 r1735f3e 32 32 .set noreorder 33 33 34 .global frame_pointer_get 35 .global frame_pointer_prev 36 .global frame_pointer_validate 37 .global return_address_get 38 .global program_counter_get 34 .global stacktrace_prepare 35 .global stacktrace_fp_get 36 .global stacktrace_pc_get 39 37 40 frame_pointer_get: 41 frame_pointer_prev: 42 frame_pointer_validate: 43 return_address_get: 44 program_counter_get: 38 stacktrace_prepare: 39 stacktrace_fp_get: 40 stacktrace_pc_get: 45 41 j $ra 46 42 xor $v0, $v0 -
uspace/lib/libc/arch/mips32eb/Makefile.inc
r430de97 r1735f3e 36 36 arch/$(UARCH)/src/fibril.S \ 37 37 arch/$(UARCH)/src/tls.c \ 38 arch/$(UARCH)/src/stacktrace.S 38 arch/$(UARCH)/src/stacktrace.c \ 39 arch/$(UARCH)/src/stacktrace_asm.S 39 40 40 41 GCC_CFLAGS += -mips3 -
uspace/lib/libc/arch/ppc32/Makefile.inc
r430de97 r1735f3e 36 36 arch/$(UARCH)/src/fibril.S \ 37 37 arch/$(UARCH)/src/tls.c \ 38 arch/$(UARCH)/src/stacktrace.S 38 arch/$(UARCH)/src/stacktrace.c \ 39 arch/$(UARCH)/src/stacktrace_asm.S 39 40 40 41 GCC_CFLAGS += -mcpu=powerpc -msoft-float -m32 -
uspace/lib/libc/arch/ppc32/include/types.h
r430de97 r1735f3e 36 36 #define LIBC_ppc32_TYPES_H_ 37 37 38 #define __32_BITS__ 39 38 40 typedef unsigned int sysarg_t; 39 41 -
uspace/lib/libc/arch/ppc32/src/stacktrace_asm.S
r430de97 r1735f3e 31 31 #include <libarch/regname.h> 32 32 33 .global frame_pointer_get 34 .global frame_pointer_prev 35 .global frame_pointer_validate 36 .global return_address_get 37 .global program_counter_get 33 .global stacktrace_prepare 34 .global stacktrace_fp_get 35 .global stacktrace_pc_get 38 36 39 frame_pointer_get: 37 stacktrace_prepare: 38 blr 39 40 stacktrace_fp_get: 40 41 mr r3, sp 41 42 blr 42 43 43 frame_pointer_prev: 44 lwz r3, 0(r3) 45 blr 46 47 frame_pointer_validate: 48 blr 49 50 return_address_get: 51 lwz r3, 4(r3) 52 blr 53 54 program_counter_get: 44 stacktrace_pc_get: 55 45 mflr r3 56 46 blr -
uspace/lib/libc/arch/sparc64/Makefile.inc
r430de97 r1735f3e 35 35 ARCH_SOURCES += arch/$(UARCH)/src/fibril.S \ 36 36 arch/$(UARCH)/src/tls.c \ 37 arch/$(UARCH)/src/stacktrace.S 37 arch/$(UARCH)/src/stacktrace.c \ 38 arch/$(UARCH)/src/stacktrace_asm.S 38 39 39 40 GCC_CFLAGS += -mcpu=ultrasparc -m64 -
uspace/lib/libc/arch/sparc64/include/types.h
r430de97 r1735f3e 36 36 #define LIBC_sparc64_TYPES_H_ 37 37 38 #define __64_BITS__ 39 38 40 typedef unsigned long sysarg_t; 39 41 -
uspace/lib/libc/generic/stacktrace.c
r430de97 r1735f3e 1 1 /* 2 2 * Copyright (c) 2009 Jakub Jermar 3 * Copyright (c) 2010 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 36 37 #include <stdio.h> 37 38 #include <sys/types.h> 39 #include <errno.h> 38 40 39 void stack_trace_fp_pc(uintptr_t fp, uintptr_t pc) 41 static int stacktrace_read_uintptr(void *arg, uintptr_t addr, uintptr_t *data); 42 43 void stacktrace_print_fp_pc(uintptr_t fp, uintptr_t pc) 40 44 { 41 while (frame_pointer_validate(fp)) { 45 stacktrace_t st; 46 uintptr_t nfp; 47 48 st.op_arg = NULL; 49 st.read_uintptr = stacktrace_read_uintptr; 50 51 while (stacktrace_fp_valid(&st, fp)) { 42 52 printf("%p: %p()\n", fp, pc); 43 pc = return_address_get(fp); 44 fp = frame_pointer_prev(fp); 53 (void) stacktrace_ra_get(&st, fp, &pc); 54 (void) stacktrace_fp_prev(&st, fp, &nfp); 55 fp = nfp; 45 56 } 46 57 } 47 58 48 void stack _trace(void)59 void stacktrace_print(void) 49 60 { 50 stack_trace_fp_pc(frame_pointer_get(), program_counter_get()); 61 stacktrace_prepare(); 62 stacktrace_print_fp_pc(stacktrace_fp_get(), stacktrace_pc_get()); 51 63 /* 52 64 * Prevent the tail call optimization of the previous call by 53 65 * making it a non-tail call. 54 66 */ 55 (void) frame_pointer_get(); 67 (void) stacktrace_fp_get(); 68 } 69 70 static int stacktrace_read_uintptr(void *arg, uintptr_t addr, uintptr_t *data) 71 { 72 (void) arg; 73 *data = *((uintptr_t *) addr); 74 return EOK; 56 75 } 57 76 -
uspace/lib/libc/generic/udebug.c
r430de97 r1735f3e 69 69 } 70 70 71 int udebug_name_read(int phoneid, void *buffer, size_t n, 72 size_t *copied, size_t *needed) 73 { 74 ipcarg_t a_copied, a_needed; 75 int rc; 76 77 rc = async_req_3_3(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_NAME_READ, 78 (sysarg_t)buffer, n, NULL, &a_copied, &a_needed); 79 80 *copied = (size_t)a_copied; 81 *needed = (size_t)a_needed; 82 83 return rc; 84 } 85 86 int udebug_areas_read(int phoneid, void *buffer, size_t n, 87 size_t *copied, size_t *needed) 88 { 89 ipcarg_t a_copied, a_needed; 90 int rc; 91 92 rc = async_req_3_3(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_AREAS_READ, 93 (sysarg_t)buffer, n, NULL, &a_copied, &a_needed); 94 95 *copied = (size_t)a_copied; 96 *needed = (size_t)a_needed; 97 98 return rc; 99 } 100 71 101 int udebug_mem_read(int phoneid, void *buffer, uintptr_t addr, size_t n) 72 102 { … … 78 108 { 79 109 return async_req_3_0(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_ARGS_READ, 110 tid, (sysarg_t)buffer); 111 } 112 113 int udebug_regs_read(int phoneid, thash_t tid, void *buffer) 114 { 115 return async_req_3_0(phoneid, IPC_M_DEBUG_ALL, UDEBUG_M_REGS_READ, 80 116 tid, (sysarg_t)buffer); 81 117 } -
uspace/lib/libc/include/stacktrace.h
r430de97 r1735f3e 1 1 /* 2 2 * Copyright (c) 2009 Jakub Jermar 3 * Copyright (c) 2010 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 39 40 #include <bool.h> 40 41 41 extern void stack_trace(void); 42 extern void stack_trace_fp_pc(uintptr_t, uintptr_t); 42 typedef struct { 43 void *op_arg; 44 int (*read_uintptr)(void *, uintptr_t, uintptr_t *); 45 } stacktrace_t; 46 47 extern void stacktrace_print(void); 48 extern void stacktrace_print_fp_pc(uintptr_t, uintptr_t); 43 49 44 50 /* 45 51 * The following interface is to be implemented by each architecture. 46 52 */ 47 extern bool frame_pointer_validate(uintptr_t); 48 extern uintptr_t frame_pointer_get(void); 49 extern uintptr_t frame_pointer_prev(uintptr_t); 50 extern uintptr_t return_address_get(uintptr_t); 51 extern uintptr_t program_counter_get(); 53 extern bool stacktrace_fp_valid(stacktrace_t *, uintptr_t); 54 extern int stacktrace_fp_prev(stacktrace_t *, uintptr_t, uintptr_t *); 55 extern int stacktrace_ra_get(stacktrace_t *, uintptr_t, uintptr_t *); 56 57 extern void stacktrace_prepare(void); 58 extern uintptr_t stacktrace_fp_get(void); 59 extern uintptr_t stacktrace_pc_get(); 52 60 53 61 #endif -
uspace/lib/libc/include/stdlib.h
r430de97 r1735f3e 42 42 #define abort() \ 43 43 do { \ 44 stack _trace(); \44 stacktrace_print(); \ 45 45 _exit(1); \ 46 46 } while (0) -
uspace/lib/libc/include/udebug.h
r430de97 r1735f3e 47 47 int udebug_thread_read(int phoneid, void *buffer, size_t n, 48 48 size_t *copied, size_t *needed); 49 int udebug_name_read(int phoneid, void *buffer, size_t n, 50 size_t *copied, size_t *needed); 51 int udebug_areas_read(int phoneid, void *buffer, size_t n, 52 size_t *copied, size_t *needed); 49 53 int udebug_mem_read(int phoneid, void *buffer, uintptr_t addr, size_t n); 50 54 int udebug_args_read(int phoneid, thash_t tid, sysarg_t *buffer); 55 int udebug_regs_read(int phoneid, thash_t tid, void *buffer); 51 56 int udebug_go(int phoneid, thash_t tid, udebug_event_t *ev_type, 52 57 sysarg_t *val0, sysarg_t *val1); -
uspace/srv/bd/ata_bd/ata_bd.c
r430de97 r1735f3e 59 59 #include <devmap.h> 60 60 #include <sys/types.h> 61 #include <inttypes.h> 61 62 #include <errno.h> 62 63 #include <bool.h> … … 112 113 printf(NAME ": ATA disk driver\n"); 113 114 114 printf("I/O address 0x%p/0x%p\n", ctl_physical, cmd_physical);115 printf("I/O address %p/%p\n", ctl_physical, cmd_physical); 115 116 116 117 if (ata_bd_init() != EOK) … … 180 181 } 181 182 182 printf(" % llublocks", d->blocks, d->blocks / (2 * 1024));183 printf(" %" PRIu64 " blocks", d->blocks, d->blocks / (2 * 1024)); 183 184 184 185 mbytes = d->blocks / (2 * 1024); 185 186 if (mbytes > 0) 186 printf(" % lluMB.", mbytes);187 printf(" %" PRIu64 " MB.", mbytes); 187 188 188 189 printf("\n"); -
uspace/srv/bd/part/guid_part/guid_part.c
r430de97 r1735f3e 54 54 #include <devmap.h> 55 55 #include <sys/types.h> 56 #include <sys/typefmt.h> 57 #include <inttypes.h> 56 58 #include <libblock.h> 57 59 #include <devmap.h> … … 196 198 size_mb = (part->length * block_size + 1024 * 1024 - 1) 197 199 / (1024 * 1024); 198 printf(NAME ": Registered device %s: % llu blocks %llu MB.\n",199 name, part->length, size_mb);200 printf(NAME ": Registered device %s: %" PRIu64 " blocks " 201 "%" PRIuBN " MB.\n", name, part->length, size_mb); 200 202 201 203 part->dev = dev; -
uspace/srv/bd/part/mbr_part/mbr_part.c
r430de97 r1735f3e 64 64 #include <devmap.h> 65 65 #include <sys/types.h> 66 #include <sys/typefmt.h> 67 #include <inttypes.h> 66 68 #include <libblock.h> 67 69 #include <devmap.h> … … 247 249 size_mb = (part->length * block_size + 1024 * 1024 - 1) 248 250 / (1024 * 1024); 249 printf(NAME ": Registered device %s: % llu blocks %llu MB.\n",250 name, part->length, size_mb);251 printf(NAME ": Registered device %s: %" PRIuBN " blocks " 252 "%" PRIu64 " MB.\n", name, part->length, size_mb); 251 253 252 254 part->dev = dev; … … 274 276 if (brb == NULL) { 275 277 printf(NAME ": Failed allocating memory.\n"); 276 return ENOMEM; 278 return ENOMEM; 277 279 } 278 280 … … 289 291 sgn = uint16_t_le2host(brb->signature); 290 292 if (sgn != BR_SIGNATURE) { 291 printf(NAME ": Invalid boot record signature 0x%04X.\n", sgn); 293 printf(NAME ": Invalid boot record signature 0x%04" PRIX16 294 ".\n", sgn); 292 295 return EINVAL; 293 296 } … … 333 336 rc = block_read_direct(indev_handle, ba, 1, brb); 334 337 if (rc != EOK) { 335 printf(NAME ": Failed reading EBR block at %u.\n", ba); 338 printf(NAME ": Failed reading EBR block at %" 339 PRIu32 ".\n", ba); 336 340 return rc; 337 341 } … … 339 343 sgn = uint16_t_le2host(brb->signature); 340 344 if (sgn != BR_SIGNATURE) { 341 printf(NAME ": Invalid boot record signature 0x%04 X"342 " in EBR at %u.\n", sgn, ba);345 printf(NAME ": Invalid boot record signature 0x%04" 346 PRIX16 " in EBR at %" PRIu32 ".\n", sgn, ba); 343 347 return EINVAL; 344 348 } -
uspace/srv/hid/char_mouse/Makefile
r430de97 r1735f3e 32 32 EXTRA_CFLAGS = -Iinclude 33 33 34 OUTPUT = c _mouse34 OUTPUT = char_ms 35 35 36 36 SOURCES = \ 37 37 proto/ps2.c \ 38 c _mouse.c \38 char_mouse.c \ 39 39 chardev.c 40 40 -
uspace/srv/hid/char_mouse/char_mouse.c
r430de97 r1735f3e 47 47 #include <devmap.h> 48 48 49 #include <c _mouse.h>49 #include <char_mouse.h> 50 50 #include <mouse_port.h> 51 51 #include <mouse_proto.h> -
uspace/srv/hid/char_mouse/chardev.c
r430de97 r1735f3e 41 41 #include <errno.h> 42 42 43 #include <c _mouse.h>43 #include <char_mouse.h> 44 44 #include <mouse_port.h> 45 45 -
uspace/srv/hid/char_mouse/include/char_mouse.h
r430de97 r1735f3e 34 34 */ 35 35 36 #ifndef C _MOUSE_H_37 #define C _MOUSE_H_36 #ifndef CHAR_MOUSE_H_ 37 #define CHAR_MOUSE_H_ 38 38 39 39 extern void mouse_handle_byte(int); -
uspace/srv/hid/char_mouse/proto/ps2.c
r430de97 r1735f3e 37 37 #include <stdio.h> 38 38 #include <mouse_proto.h> 39 #include <c _mouse.h>39 #include <char_mouse.h> 40 40 41 41 #define BUFSIZE 3 -
uspace/srv/hid/kbd/Makefile.build
r430de97 r1735f3e 125 125 ifeq ($(UARCH),ppc32) 126 126 SOURCES += \ 127 port/ dummy.c \128 ctl/ stty.c127 port/adb.c \ 128 ctl/apple.c 129 129 endif 130 130 -
uspace/srv/loader/arch/amd64/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__64_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/amd64.s -
uspace/srv/loader/arch/arm32/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__32_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/arm32.s -
uspace/srv/loader/arch/ia32/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__32_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/ia32.s -
uspace/srv/loader/arch/ia64/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__64_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/ia64.s 31 30 AFLAGS += -xexplicit -
uspace/srv/loader/arch/mips32/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__32_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/mips32.s -
uspace/srv/loader/arch/ppc32/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__32_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/ppc32.s -
uspace/srv/loader/arch/sparc64/Makefile.inc
r430de97 r1735f3e 27 27 # 28 28 29 EXTRA_CFLAGS = -D__64_BITS__30 29 ARCH_SOURCES := arch/$(UARCH)/sparc64.s -
uspace/srv/loader/elf_load.c
r430de97 r1735f3e 342 342 seg_ptr = (void *) seg_addr; 343 343 344 DPRINTF("Load segment at addr 0x%x, size 0x%x\n", seg_addr,345 entry->p_memsz); 344 DPRINTF("Load segment at addr %p, size 0x%x\n", seg_addr, 345 entry->p_memsz); 346 346 347 347 if (entry->p_align > 1) { … … 370 370 mem_sz = entry->p_memsz + (entry->p_vaddr - base); 371 371 372 DPRINTF("Map to seg_addr= 0x%x-0x%x.\n", seg_addr,372 DPRINTF("Map to seg_addr=%p-%p.\n", seg_addr, 373 373 entry->p_vaddr + bias + ALIGN_UP(entry->p_memsz, PAGE_SIZE)); 374 374 … … 384 384 } 385 385 386 DPRINTF("as_area_create( 0x%lx, 0x%x, %d) -> 0x%lx\n",386 DPRINTF("as_area_create(%p, 0x%x, %d) -> 0x%lx\n", 387 387 base + bias, mem_sz, flags, (uintptr_t)a); 388 388 … … 461 461 elf->info->dynamic = 462 462 (void *)((uint8_t *)entry->sh_addr + elf->bias); 463 DPRINTF("Dynamic section found at 0x%x.\n",463 DPRINTF("Dynamic section found at %p.\n", 464 464 (uintptr_t)elf->info->dynamic); 465 465 break; -
uspace/srv/loader/main.c
r430de97 r1735f3e 392 392 /* Dynamically linked program */ 393 393 DPRINTF("Run ELF interpreter.\n"); 394 DPRINTF("Entry point: 0x%lx\n", interp_info.entry);394 DPRINTF("Entry point: %p\n", interp_info.entry); 395 395 396 396 ipc_answer_0(rid, EOK);
Note:
See TracChangeset
for help on using the changeset viewer.