Changeset 11241


Ignore:
Timestamp:
Oct 28, 2008, 10:34:36 PM (11 years ago)
Author:
gb
Message:

32-bit Solaris x86 changes.

Location:
trunk/source/lisp-kernel
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/area.h

    r11015 r11241  
    167167#endif
    168168#ifdef SOLARIS
     169#ifdef X8664
    169170#define IMAGE_BASE_ADDRESS 0x300000000000L
     171#else
     172#define IMAGE_BASE_ADDRESS 0x10000000
     173#endif
    170174#endif
    171175#ifdef DARWIN
  • trunk/source/lisp-kernel/lisp-debug.c

    r11015 r11241  
    170170                     "ecx", "eax", "???", "???", "eip",
    171171                     "???", "efl", "esp"};
     172#endif
     173#ifdef SOLARIS
     174char *Iregnames[] = {"???", "???", "???", "???", "???",
     175                     "edi", "esi", "ebp", "esp", "ebx",
     176                     "edx", "ecx", "eax", "???", "???",
     177                     "eip", "???", "efl"};
    172178#endif
    173179#endif
  • trunk/source/lisp-kernel/pmcl-kernel.c

    r11117 r11241  
    407407#endif
    408408#ifdef FREEBSD
     409#define MAXIMUM_MAPPABLE_MEMORY (1U<<30)
     410#endif
     411#ifdef SOLARIS
    409412#define MAXIMUM_MAPPABLE_MEMORY (1U<<30)
    410413#endif
     
    15471550#endif
    15481551
     1552#ifdef SOLARIS
     1553#ifdef X8632
     1554  {
     1555    extern void solaris_ldt_init(void);
     1556    solaris_ldt_init();
     1557  }
     1558#endif
     1559#endif
     1560
    15491561#ifndef WINDOWS
    15501562  main_thread_pid = getpid();
  • trunk/source/lisp-kernel/thread_manager.c

    r11231 r11241  
    11401140  tcr->ldt_selector = 0;
    11411141}
     1142#endif
     1143#ifdef SOLARIS
     1144#include <sys/sysi86.h>
     1145
     1146bitvector ldt_entries_in_use = NULL;
     1147pthread_mutex_t ldt_lock = PTHREAD_MUTEX_INITIALIZER;  /* simple, non-recursive mutex */
     1148
     1149void
     1150solaris_ldt_init()
     1151{
     1152  int fd;
     1153  struct ssd s;
     1154
     1155  ldt_entries_in_use=malloc(8192/8);
     1156  zero_bits(ldt_entries_in_use,8192);
     1157 
     1158  fd = open("/proc/self/ldt", O_RDONLY);
     1159
     1160  while(read(fd,&s,sizeof(s)) == sizeof(s)) {
     1161    set_bit(ldt_entries_in_use,s.sel>>3);
     1162  }
     1163  close(fd);
     1164}
     1165   
     1166
     1167void
     1168setup_tcr_extra_segment(TCR *tcr)
     1169{
     1170  struct ssd s;
     1171  int i;
     1172
     1173  pthread_mutex_lock(&ldt_lock);
     1174
     1175  for (i = 0; i < 8192; i++) {
     1176    if (!ref_bit(ldt_entries_in_use,i)) {
     1177      break;
     1178    }
     1179  }
     1180  if (i == 8192) {
     1181    pthread_mutex_unlock(&ldt_lock);
     1182    fprintf(stderr, "All 8192 LDT descriptors in use\n");
     1183    _exit(1);
     1184  }
     1185
     1186  s.sel = (i<<3)|7;
     1187  s.bo = (unsigned int)tcr;
     1188  s.ls = sizeof(TCR);
     1189  s.acc1 = 0xf2;
     1190  s.acc2 = 4;
     1191
     1192  if (sysi86(SI86DSCR, &s) < 0) {
     1193    pthread_mutex_unlock(&ldt_lock);
     1194    perror("ldt setup");
     1195    _exit(1);
     1196  }
     1197  set_bit(ldt_entries_in_use,i);
     1198  tcr->ldt_selector = (i<<3)|7;
     1199  pthread_mutex_unlock(&ldt_lock);
     1200 
     1201}
     1202
     1203void
     1204free_tcr_extra_segment(TCR *tcr)
     1205{
     1206  struct ssd s;
     1207  int i;
     1208
     1209  pthread_mutex_lock(&ldt_lock);
     1210  __asm__ volatile ("mov %0,%%fs" : : "r"(0));
     1211  s.sel = tcr->ldt_selector;
     1212  i = s.sel>>3;
     1213  tcr->ldt_selector = 0;
     1214  s.bo = 0;
     1215  s.ls = 0;
     1216  s.acc1 = 0;
     1217  s.acc2 = 0;
     1218  sysi86(SI86DSCR, &s);
     1219  clr_bit(ldt_entries_in_use,i);
     1220  pthread_mutex_unlock(&ldt_lock);
     1221}
     1222
    11421223#endif
    11431224#endif
  • trunk/source/lisp-kernel/x86-constants32.h

    r11094 r11241  
    3939#define REG_EFL 17
    4040#define REG_ESP 19
     41#endif
     42
     43#ifdef SOLARIS
     44#include <sys/regset.h>
     45#include <limits.h>
     46#define REG_EAX EAX
     47#define REG_EBX EBX
     48#define REG_ECX ECX
     49#define REG_EDX EDX
     50#define REG_ESI ESI
     51#define REG_EDI EDI
     52#define REG_EBP EBP
     53#define REG_ESP ESP
     54#define REG_EFL EFL
     55#define REG_EIP EIP
    4156#endif
    4257
  • trunk/source/lisp-kernel/x86-constants64.h

    r11094 r11241  
    7777#define REG_RIP     16
    7878#endif
     79
    7980/* Define indices of the GPRs in the mcontext component of a ucontext */
    8081#define Itemp0      REG_RBX
  • trunk/source/lisp-kernel/x86-exceptions.h

    r11143 r11241  
    7373
    7474#ifdef SOLARIS
    75 #ifdef X8664
    7675#define xpGPRvector(x) ((x)->uc_mcontext.gregs)
    7776#define xpGPR(x,gprno) (xpGPRvector(x)[gprno])
     
    8079#define eflags_register(xp) xpGPR(xp,Iflags)
    8180#define xpXMMregs(x)(&((x)->uc_mcontext.fpregs.fp_reg_set.fpchip_state.xmm[0]))
     81#ifdef X8632
     82#define xpMMXreg(x,n)(((x)->uc_mcontext.fpregs.fp_reg_set.fpchip_state.state[n]))
    8283#endif
    8384#endif
Note: See TracChangeset for help on using the changeset viewer.