mmap local APIC address
Vaibhav Jain
vjoss197 at gmail.com
Wed Oct 19 13:12:15 EDT 2011
On Fri, Oct 14, 2011 at 9:10 PM, Mulyadi Santosa
<mulyadi.santosa at gmail.com>wrote:
> hi...
>
> On Sat, Oct 15, 2011 at 07:22, Vaibhav Jain <vjoss197 at gmail.com> wrote:
> > Hi,
> >
> > I am trying to map local APIC on an intel system (physical address
> > 0xfee00000) in a user level program using mmap
> > but my mmap is failing saying "Bad file descriptor". I am not sure if
> this
> > problem is related to apic or
> > mmap. I am running the program as root. Please help me figure this out.
>
> could you post the code?
>
> anyway, check "man mmap" in "errors" section....the hint could be
> found there.....
>
> --
> regards,
>
> Mulyadi Santosa
> Freelance Linux trainer and consultant
>
> blog: the-hydra.blogspot.com
> training: mulyaditraining.blogspot.com
>
Hi,
Here's the code
typedef unsigned int u32;
#define MAP_LEN 0x1000 //4 KB page
#define BUFLEN 100
*#define APIC_BASE 0xfee00000*
#define APIC_ICR_low 0xfee00300
#define APIC_ICR_high 0xfee00310
#define APIC_ICR_init 0x00000500
#define APIC_ICR_start 0x00000600
#define APIC_ICR_ASSERT_LVL_TRG 0x0000c000
#define BOUNCE_CODE 0x2000
int apic_reset_cpu(cpu);
int cpu = 2;
int main(){
if ((apic_reset_cpu(cpu)) != 0)
printf("INIT & Startup failed!\n");
}
int apic_reset_cpu(int cpu)
{
unsigned long tmpaddress, apic_icr, *apic_phy_addr;
int fd, sleep_now=0;
printf("Assuming APIC physical base: %lx \n", APIC_BASE);
tmpaddress = (unsigned long) mmap(NULL, MAP_LEN, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, (off_t)APIC_BASE);
* if(tmpaddress == (unsigned long)MAP_FAILED) //check if it worked
{
perror("Mapping memory for absolute memory access failed.\n");
return -3;
}*
//prep ICR high
apic_icr = tmpaddress;
apic_icr |= APIC_ICR_high;
apic_phy_addr = (unsigned long *) apic_icr;
*apic_phy_addr = cpu << 24;
//prep ICR low Send INIT and wait
apic_icr = tmpaddress;
apic_icr |= APIC_ICR_low;
apic_phy_addr = (unsigned long *) apic_icr;
*apic_phy_addr = APIC_ICR_init | APIC_ICR_ASSERT_LVL_TRG;
sleep_now = usleep( 10000 ); //sleep 10 ms
//prep for SIPI
apic_icr = tmpaddress;
apic_icr |= APIC_ICR_low;
apic_phy_addr = (unsigned long *) apic_icr;
*apic_phy_addr = APIC_ICR_start | (BOUNCE_CODE >> 12);
sleep_now = usleep( 500 ); //sleep 500 usec
printf("Unmapping APIC Base page\n");
tmpaddress &= 0xfffff000;
munmap(tmpaddress, MAP_LEN);
return 0;
}
Thanks
Vaibhav Jain
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20111019/c666d46f/attachment.html
More information about the Kernelnewbies
mailing list