Skip to content

Commit f9ad87f

Browse files
committed
/home/fox/release/dtrace/2010/dtrace-20100711.tar.bz2
1 parent e59174d commit f9ad87f

File tree

6 files changed

+28
-22
lines changed

6 files changed

+28
-22
lines changed

.release

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
date=Sat Jul 10 23:52:24 BST 2010
2-
release=dtrace-20100710
3-
build=151
1+
date=Sun Jul 11 21:51:34 BST 2010
2+
release=dtrace-20100711
3+
build=154

Bugs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,6 @@ x 20090204 23. Linux 2.6.9 (AS4) issues
8080

8181
20090222 26. syscall:sigreturn wants to do things to the stack and
8282
wants a real stack frame. Need to handle that.
83+
84+
20100711 27. syscall::c*: seg fault in kernel
85+
20100711 28. dtrace_xcall: not irq_disable correct.

Changes

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Sun Jul 11 21:40:15 2010 fox
2+
3+
344* dtrace_linux.c: dtrace_xcall: Dont call on_each_cpu as its not
4+
interrupt safe.
5+
16
Sat Jul 10 21:40:00 2010 fox
27

38
343* Archive: 1.0101

driver/dtrace.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4624,11 +4624,6 @@ HERE();
46244624
mstate->dtms_difo = difo;
46254625

46264626
regs[DIF_REG_R0] = 0; /* %r0 is fixed at zero */
4627-
HERE();
4628-
{uint_t p = 0;
4629-
for (p = 0; p < textlen; p++) {
4630-
printk("DIS %p %x: %x\n", &text[p], p, text[p]);
4631-
}}
46324627

46334628
while (pc < textlen && !(*flags & CPU_DTRACE_FAULT)) {
46344629
opc = pc;
@@ -4639,8 +4634,6 @@ printk("DIS %p %x: %x\n", &text[p], p, text[p]);
46394634
r2 = DIF_INSTR_R2(instr);
46404635
rd = DIF_INSTR_RD(instr);
46414636

4642-
HERE();
4643-
printk("opcode=%x instr=%x\n", DIF_INSTR_OP(instr), instr);
46444637
switch (DIF_INSTR_OP(instr)) {
46454638
case DIF_OP_OR:
46464639
PRINT_CASE(DIF_OP_OR);
@@ -4964,7 +4957,6 @@ PRINT_CASE(DIF_OP_LDGA);
49644957
PRINT_CASE(DIF_OP_LDGS);
49654958
id = DIF_INSTR_VAR(instr);
49664959

4967-
printk("id=%d\n", id);
49684960
if (id >= DIF_VAR_OTHER_UBASE) {
49694961
uintptr_t a;
49704962
HERE();
@@ -4987,17 +4979,14 @@ HERE();
49874979
* reference to a NULL variable.
49884980
*/
49894981
regs[rd] = NULL;
4990-
printk("regs[%d]=%llx\n", rd, regs[rd]);
49914982
} else {
49924983
regs[rd] = a + sizeof (uint64_t);
4993-
printk("regs[%d]2=%llx\n", rd, regs[rd]);
49944984
}
49954985

49964986
break;
49974987
}
49984988

49994989
regs[rd] = dtrace_dif_variable(mstate, state, id, 0);
5000-
printk("regs[%d]3=%llx\n", rd, regs[rd]);
50014990
break;
50024991

50034992
case DIF_OP_STGS:
@@ -12150,7 +12139,6 @@ dtrace_dof_slurp(dof_hdr_t *dof, dtrace_vstate_t *vstate, cred_t *cr,
1215012139
dtrace_enabling_t *enab;
1215112140
uint_t i;
1215212141

12153-
printk("cr=%p\n", cr);
1215412142
ASSERT(MUTEX_HELD(&dtrace_lock));
1215512143
ASSERT(dof->dofh_loadsz >= sizeof (dof_hdr_t));
1215612144
/*

driver/dtrace_linux.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,14 +1035,14 @@ dtrace_xcall(processorid_t cpu, dtrace_xcall_t func, void *arg)
10351035
{
10361036
if (cpu == DTRACE_CPUALL) {
10371037
/***********************************************/
1038-
/* Dont call smp_call_function as this */
1039-
/* doesnt work. */
1038+
/* Avoid calling local_irq_disable, since */
1039+
/* we will likely be called from the */
1040+
/* hrtimer callback. */
10401041
/***********************************************/
1041-
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
1042-
on_each_cpu(func, arg, 0, TRUE);
1043-
#else
1044-
on_each_cpu(func, arg, TRUE);
1045-
#endif
1042+
preempt_disable();
1043+
smp_call_function(func, arg, TRUE);
1044+
func(arg);
1045+
preempt_enable();
10461046
} else {
10471047
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
10481048
/***********************************************/

driver/systrace.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ static int64_t (*sys_vfork_ptr)(uintptr_t, uintptr_t, uintptr_t, uintptr_t, uint
197197

198198
static char *int_ret_from_sys_call_ptr;
199199
static char *ptregscall_common_ptr;
200+
static char *save_rest_ptr;
200201

201202
/**********************************************************************/
202203
/* Following definitions are non-static to allow the assembler to */
@@ -332,6 +333,13 @@ systrace_assembler_dummy(void)
332333
/* cannot be C code yet. */
333334
/***********************************************/
334335
FUNCTION(systrace_part1_sys_clone)
336+
/*
337+
"subq 6*8, %rsp\n"
338+
"call *save_rest_ptr\n"
339+
"leaq 8(%rsp), %r8\n"
340+
"mov $dtrace_systrace_syscall_clone,%rax\n"
341+
"jmp *ptregscall_common_ptr\n"
342+
*/
335343
"lea -0x28(%rsp),%r8\n"
336344
"mov $dtrace_systrace_syscall_clone,%rax\n"
337345
"jmp *ptregscall_common_ptr\n"
@@ -1002,6 +1010,8 @@ systrace_provide(void *arg, const dtrace_probedesc_t *desc)
10021010
int_ret_from_sys_call_ptr = (char *) get_proc_addr("int_ret_from_sys_call");
10031011
if (ptregscall_common_ptr == NULL)
10041012
ptregscall_common_ptr = (char *) get_proc_addr("ptregscall_common");
1013+
if (save_rest_ptr == NULL)
1014+
save_rest_ptr = (char *) get_proc_addr("save_rest");
10051015
#endif
10061016

10071017
systrace_do_init(sysent, &systrace_sysent);

0 commit comments

Comments
 (0)