static int tr_info()

in kernel/palinfo.c [671:765]


static int tr_info(struct seq_file *m)
{
	long status;
	pal_tr_valid_u_t tr_valid;
	u64 tr_buffer[4];
	pal_vm_info_1_u_t vm_info_1;
	pal_vm_info_2_u_t vm_info_2;
	unsigned long i, j;
	unsigned long max[3], pgm;
	struct ifa_reg {
		unsigned long valid:1;
		unsigned long ig:11;
		unsigned long vpn:52;
	} *ifa_reg;
	struct itir_reg {
		unsigned long rv1:2;
		unsigned long ps:6;
		unsigned long key:24;
		unsigned long rv2:32;
	} *itir_reg;
	struct gr_reg {
		unsigned long p:1;
		unsigned long rv1:1;
		unsigned long ma:3;
		unsigned long a:1;
		unsigned long d:1;
		unsigned long pl:2;
		unsigned long ar:3;
		unsigned long ppn:38;
		unsigned long rv2:2;
		unsigned long ed:1;
		unsigned long ig:11;
	} *gr_reg;
	struct rid_reg {
		unsigned long ig1:1;
		unsigned long rv1:1;
		unsigned long ig2:6;
		unsigned long rid:24;
		unsigned long rv2:32;
	} *rid_reg;

	if ((status = ia64_pal_vm_summary(&vm_info_1, &vm_info_2)) !=0) {
		printk(KERN_ERR "ia64_pal_vm_summary=%ld\n", status);
		return 0;
	}
	max[0] = vm_info_1.pal_vm_info_1_s.max_itr_entry+1;
	max[1] = vm_info_1.pal_vm_info_1_s.max_dtr_entry+1;

	for (i=0; i < 2; i++ ) {
		for (j=0; j < max[i]; j++) {

		status = ia64_pal_tr_read(j, i, tr_buffer, &tr_valid);
		if (status != 0) {
			printk(KERN_ERR "palinfo: pal call failed on tr[%lu:%lu]=%ld\n",
			       i, j, status);
			continue;
		}

		ifa_reg  = (struct ifa_reg *)&tr_buffer[2];

		if (ifa_reg->valid == 0)
			continue;

		gr_reg   = (struct gr_reg *)tr_buffer;
		itir_reg = (struct itir_reg *)&tr_buffer[1];
		rid_reg  = (struct rid_reg *)&tr_buffer[3];

		pgm	 = -1 << (itir_reg->ps - 12);
		seq_printf(m,
			   "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n"
			   "\tppn  : 0x%lx\n"
			   "\tvpn  : 0x%lx\n"
			   "\tps   : ",
			   "ID"[i], j,
			   tr_valid.pal_tr_valid_s.access_rights_valid,
			   tr_valid.pal_tr_valid_s.priv_level_valid,
			   tr_valid.pal_tr_valid_s.dirty_bit_valid,
			   tr_valid.pal_tr_valid_s.mem_attr_valid,
			   (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12);

		bitvector_process(m, 1<< itir_reg->ps);

		seq_printf(m,
			   "\n\tpl   : %d\n"
			   "\tar   : %d\n"
			   "\trid  : %x\n"
			   "\tp    : %d\n"
			   "\tma   : %d\n"
			   "\td    : %d\n",
			   gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma,
			   gr_reg->d);
		}
	}
	return 0;
}