tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
Extension
.c
Size
17681 bytes
Lines
628
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct gstruct {
	__u8 a[A_LEN]; /* double word aligned */
	__u8 b[B_LEN]; /* double word unaligned */
};
static volatile struct gstruct gstruct __attribute__((aligned(512)));

static volatile char cwd[PATH_MAX] __attribute__((aligned(8)));

static void get_dbginfo(pid_t child_pid, struct ppc_debug_info *dbginfo)
{
	if (ptrace(PPC_PTRACE_GETHWDBGINFO, child_pid, NULL, dbginfo)) {
		perror("Can't get breakpoint info");
		exit(-1);
	}
}

static bool dawr_present(struct ppc_debug_info *dbginfo)
{
	return !!(dbginfo->features & PPC_DEBUG_FEATURE_DATA_BP_DAWR);
}

static void write_var(int len)
{
	volatile __u8 *pcvar;
	volatile __u16 *psvar;
	volatile __u32 *pivar;
	volatile __u64 *plvar;

	switch (len) {
	case 1:
		pcvar = (volatile __u8 *)&glvar;
		*pcvar = 0xff;
		break;
	case 2:
		psvar = (volatile __u16 *)&glvar;
		*psvar = 0xffff;
		break;
	case 4:
		pivar = (volatile __u32 *)&glvar;
		*pivar = 0xffffffff;
		break;
	case 8:
		plvar = (volatile __u64 *)&glvar;
		*plvar = 0xffffffffffffffffLL;
		break;
	}
}

static void read_var(int len)
{
	__u8 cvar __attribute__((unused));
	__u16 svar __attribute__((unused));
	__u32 ivar __attribute__((unused));
	__u64 lvar __attribute__((unused));

	switch (len) {
	case 1:
		cvar = (volatile __u8)glvar;
		break;
	case 2:
		svar = (volatile __u16)glvar;
		break;
	case 4:
		ivar = (volatile __u32)glvar;
		break;
	case 8:
		lvar = (volatile __u64)glvar;
		break;
	}
}

static void test_workload(void)
{
	__u8 cvar __attribute__((unused));
	__u32 ivar __attribute__((unused));
	int len = 0;

	if (ptrace(PTRACE_TRACEME, 0, NULL, 0)) {
		perror("Child can't be traced?");
		exit(-1);
	}

	/* Wake up father so that it sets up the first test */
	kill(getpid(), SIGUSR1);

	/* PTRACE_SET_DEBUGREG, WO test */
	for (len = 1; len <= sizeof(glvar); len <<= 1)
		write_var(len);

	/* PTRACE_SET_DEBUGREG, RO test */

Annotation

Implementation Notes